交易所成交股數機率計算

場景

    • 交易所通常在每天開市後半小時與休市前半小時最為忙碌。
    • 假設每日成交股數機率分佈約如『標準常態分佈』。
    • 交易所連續數日紀錄忙碌時之成交股數:

問題

    • 求算平均數(μ)與標準差(σ)。
    • 求算在任一交易日中,成交股數少於 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)