交易所成交股數機率計算
場景:
- 交易所通常在每天開市後半小時與休市前半小時最為忙碌。
- 假設每日成交股數機率分佈約如『標準常態分佈』。
- 交易所連續數日紀錄忙碌時之成交股數:
問題:
- 求算平均數(μ)與標準差(σ)。
- 求算在任一交易日中,成交股數少於 180 之機率。
- 求算在任一交易日中,成交股數大於 230 之機率。
- 求算在最忙碌的 5% 交易日中,成交股數為何。
解答:
- μ=200.0000,σ=26.0400
- z=-0.7680,P(z <= 180)=0.2236
- z=1.1521,P(z >= 230)=0.1251
- z=1.0100,x=226.0000
GNU R 程式列表:
# 工具函數
magicNum <- 1 / sqrt(2 * pi)
#############################################################################
StandardNormalDesicity <- function(x) {
result <- magicNum * (1 / sqrt(exp(x ^ 2)))
result
}
StandardNormalProbabilityMargin <- function(x) {
if (x == 0) {
area <- 0.5
}
else {
area <- 0.0
num <- abs(x) * 100 - 1
for (s in c(0:num)) {
area <- area + (StandardNormalDesicity(s * 0.01) + StandardNormalDesicity(s * 0.01 + 0.01)) * 0.01 * 0.5
}
if (x < 0) {
area <- 0.5 - area
}
else {
area <- 0.5 + area
}
}
area
}
StandardNormalProbabilityRange <- function(x, y) {
if (x > y) {
m <- y
n <- x
}
else {
m <- x
n <- y
}
area <- StandardNormalProbabilityMargin(n) - StandardNormalProbabilityMargin(m)
area
}
#############################################################################
# 證券交易所紀錄某日期範圍中,各交易日之股票成交股數
myData <- c(214, 202, 174, 163, 198, 171, 265, 212, 211, 194, 201, 211, 180)
myDataCount <- length(myData)
# 樣本平均值,四捨五入至整數
myExpectValue <- round(mean(myData))
myVariance <- 0
for (x in c(1:myDataCount)) {
myVariance <- myVariance + (myData[x] - myExpectValue) ^ 2 / (myDataCount - 1)
}
# 計算標準差,四捨五入至兩位小數
myStdDeviation <- round(sqrt(myVariance),2)
# 期望值(平均數)與標準差
myString <- sprintf("μ=%.4f σ=%.4f", myExpectValue, myStdDeviation)
print(myString)
# 成交股數小於 180 之機率為何
x <- 180
z <- (x - myExpectValue) / (myStdDeviation)
myString <- sprintf("z=%.4f P(z <= 180)=%.4f", z, StandardNormalProbabilityMargin(z))
print(myString)
# 成交股數大於 230 之機率為何
x <- 230
z <- (x - myExpectValue) / (myStdDeviation)
myString <- sprintf("z=%.4f P(z >= 230)=%.4f", z, 1 - StandardNormalProbabilityMargin(z))
print(myString)
# 在最忙碌的 5% 交易日,交易金額為何
p <- 1 - 0.05
x <- 0
# 從 z=0 開始,找出累積機率最接近之 z
# 因為累積機率要大於 0.95,因此可以從 z=1 開始找
for (e in seq(1.01, 2.99, by=0.01)) {
if (StandardNormalProbabilityMargin(e) - p <= 0.01) {
z <- e
break
}
}
# 四捨五入至整數
x <- round(myExpectValue + z * myStdDeviation)
myString <- sprintf("z=%.4f x=%.4f", z, x)
print(myString)