這是課程"做你自己的套利機器人"的輔助課。第 11 課提到訂單有 10% 的機率失敗,第 15 課說 z 分數大於 2 大約每 100 天出現 2 天。本頁把這兩個說法講具體。
直接的辦法:憑感覺
問一個人"訂單失敗的可能性有多大",他會說"挺可能"或"不太可能"。這沒法寫進程式,而且兩個人對這些詞的理解不同。解決辦法是用 0 到 1 之間的一個數:0 表示從不,1 表示總是,0.1 表示 100 次裡有 10 次。
機率是可以數出來的比例
不要空想,去數。把一枚虛擬硬幣拋 1000 次,看它多少次正面朝上:
import random
random.seed(1)
flips = [random.random() < 0.5 for _ in range(1000)]
print(sum(flips) / 1000)
rolls = [random.randint(1, 6) for _ in range(60000)]
print([round(rolls.count(k) / 60000, 3) for k in range(1, 7)])
0.473
[0.167, 0.168, 0.165, 0.168, 0.168, 0.164]
硬幣給出 0.473,不是正好 0.5:只拋 1000 次,有噪聲。骰子擲了 60 000 次,每個面都接近 1/6 = 0.1667。試驗越多,噪聲越小。第 11 課的模擬就是這個思路:把交易執行 10 000 次,然後數一數。
本課程只需要兩條規則:
- 所有可能結果的機率加起來等於 1。如果訂單以 0.1 的機率失敗,那麼成功的機率是 0.9。
- 對兩個相互獨立的事件,機率相乘:兩者都發生的機率是 a × b。兩個訂單,各自以 0.9 成功,兩個都成功的機率是 0.81。
鐘形曲線
許多量,比如人的身高或價格每天的小幅噪聲,都會聚集在平均值附近,離得越遠,數值越少。圖形像一口鐘,這種分布叫正態分布。兩個數就能完整描述它:平均值(中心)和標準差(寬度),都在上一篇預備課裡講過。
有用的事實是:離中心若幹個標準差之內,鐘形曲線佔多大比例:
from statistics import NormalDist
random.seed(1)
r = [random.gauss(0, 1) for _ in range(100000)]
for k in (1, 2, 3):
print(k, round(sum(abs(x) < k for x in r) / len(r), 4), round(2 * NormalDist().cdf(k) - 1, 4))
print(round(sum(x > 2 for x in r) / len(r), 4), round(1 - NormalDist().cdf(2), 4))
1 0.6804 0.6827
2 0.9538 0.9545
3 0.9973 0.9973
0.0228 0.0228
每一行裡,第一個數是對 100 000 個隨機值計數得到的,第二個數是公式給出的精確值。兩者吻合。所以大約 68% 的值在平均值的 1 個標準差之內,約 95% 在 2 個之內,99.7% 在 3 個之內。最後一行說明,高出平均值 2 個以上的機率是 0.0228,大約 100 次裡有 2 次。
第 15 課的 z 分數規則就是由此而來:z 大於 2 大約每 100 天出現 2 天(小於 −2 再有 2 天),所以這是值得看一眼的罕見事件。
鐘形曲線在哪裡會騙你
真實價格的極端波動比鐘形曲線預測的多,而且世界可能改變,使舊的平均值不再成立。z 分數為 2 在圖上很少見,但依賴它的策略仍然需要止損,並在沒見過的資料上測試。第 15 課會演示這一點。
你的練習
- 執行程式碼,和課程對比。
- 手算:一個訂單以 0.9 成功,一筆交易需要連續 3 個這樣的訂單。三個都成功的機率是多少?用 100 000 次模擬檢查。
- 把
k改成 1.5 和 2.5,比較計數得到的比例和精確比例。 - 取上一篇預備課裡的公交延誤資料。以其餘九天的平均值和標準差來算,那個晚點 30 分鐘的日子在鐘形曲線下算罕見嗎?
下一步
現在第 11 課和第 15 課對你開放了。