MODULE 03 — ADDING TWO RANDOM VARIABLES

把兩個隨機變數加起來,會抖多少?

玩完這關,你會知道「兩個會抖的東西加起來」為什麼不是把兩個抖加起來 —— 然後親手把答案寫成 wTCw。最佳化 03 關那條天上掉下來的風險公式,就是在這一關長出來的。

① 這關在解什麼問題

上一關給了你什麼 機率統計 02 ⑤ 把一台機器的形狀講完了:μ 搬左右、σ 管胖瘦, 兩顆旋鈕就決定一整條曲線。但那整關從頭到尾只有一台機器。 這一關擺兩台上桌,然後問最土的問題:把它們的輸出加起來,會抖多少? 你會發現答案裡多冒出一項 2Cov(X, Y) —— 而那個 Cov 不是新東西,就是 03 關那張 C 的非對角線。 這一關就是 C 第一次被拿去「算後果」,而不只是「描述形狀」。

哪一關用到了它、卻沒教

最佳化 03 關(有效邊界)整關的主角是 σp2 = wTCw。 那條式子在那一關是天上掉下來的 —— 直接宣告「組合的變異數等於這個」,沒有任何來歷。

02 關更早就欠了一筆:它的坑 3 說「標準差不能直接相加」, 給了結論(3 和 4 合起來是 5 不是 7),但那句話有一個沒說出口的前提叫「獨立」, 而且完全沒處理「不獨立的時候怎麼辦」。

這一關把這兩筆一起還掉:從「兩個會抖的東西加起來抖多少」出發, 一路推到 wTCw中間不跳任何一步。 這是線性代數跟最佳化之間那塊橋。

先講具體的麻煩

你有兩支服務。前端呼叫一次要先打認證、再打查詢,兩段串起來跑:

這一段平均延遲抖動(標準差)
X:認證服務40 ms12 ms
Y:查詢服務60 ms16 ms

問題:總延遲會抖多少?直覺會這樣回答:

平均 40 + 60 = 100 ms  抖動 12 + 16 = 28 ms 前半句。後半句,而且錯得不小 —— 真正的答案是 20 ms,差了 8 ms(多估了 40%)。

8 ms 不是捨入誤差。你如果照 28 ms 去開 p99 的告警閾值,會把閾值設得太寬, 真的變慢了你也收不到通知;反過來如果你用它算容量,會白買 40% 的機器。 這一關就是在解釋那 8 ms 去哪了。

同一件事的金融版

你有 10 萬元,一半買大盤 ETF(波動 15%),一半買投資級債券(波動 5%)—— 這兩檔就是 最佳化 03 關那三檔資產的前兩檔

直覺:組合的風險是兩個風險的平均,(15 + 5) / 2 = 10%。 實際:7.54%。憑空少掉 2.46 個百分點,沒有任何人放棄任何報酬 —— 報酬確實就是平均(8% 跟 3% 各半 = 5.5%)。 這個「風險打折、報酬不打折」的免費午餐,數學上就是本關 ④ 的交叉項, 而它是整個投資組合理論唯一的引擎。

先把符號認一遍

這一整頁只會用到下面這些符號。每一個都只是某句中文的縮寫,最右欄是它現在的值(你動任何滑桿它就跟著變):

符號怎麼唸它到底是什麼現在的值
XX 第一個會抖的東西。②③④ 節是「認證服務的單次延遲(ms)」,⑤⑥ 節換成「大盤 ETF 的年報酬(%)」。會抖就是「每次量到的數字不一樣」,這就是「隨機變數」這個詞的全部意思(機率統計 01 關)。
YY 第二個會抖的東西。②③④ 是「查詢服務的延遲」,⑤⑥ 是「投資級債券的年報酬」。
X + Y 兩個加起來。串接兩支服務的總延遲;或「兩檔各買一份」的總報酬。本頁圖上綠色永遠是這個「結果」。
μxμymu x、mu y 平均02 關的 x̄)。下標只是在講「誰的」。本頁固定 μx = 40 ms、μy = 60 ms,因為這關的主角是「抖」不是「快」。 40 / 60
σxσysigma x、sigma y 標準差,也就是「抖動幅度」(02 關)。單位跟資料一樣(ms)。
Var(X)σx2variance 變異數=標準差的平方。單位是 ms2,沒有物理意義,但它才是能相加的那個量,這是本關的核心。
Cov(X, Y)covariance 共變異數03 關):兩個東西「一起偏離自己平均」的程度。正的=同進同退,負的=一個高另一個低。單位 ms×ms。
ρrho(希臘字母 r) 相關係數03 關)= Cov(X,Y) / (σxσy),把單位洗掉之後的共變異數,範圍固定在 −1 到 +1。
θtheta 夾角。03 關說過「相關係數就是中心化之後的餘弦」,所以 cos θ = ρ。⑤ 節會把兩個隨機變數畫成兩根真的箭頭,這個角就看得見了。
aba、b 權重:X 拿幾份、Y 拿幾份。⑤ 節開始出現。a = b = 0.5 就是「兩邊各一半」。
ww(不是希臘字母) 權重向量,就是把 a, b 排成一條向量 w = (a, b)。⑥ 節的主角。
CC 共變異數矩陣03 關):把 4 個統計量排成 2×2 的表,對角線是兩個變異數,非對角線是共變異數。 見 ⑥
wTCww transpose C w 組合的變異數。上標 T 是轉置(把直立的向量躺下來),整串讀作「w 躺下來、乘 C、再乘 w」。⑥ 節會現場一步一步乘給你看。
σpsigma p 組合的標準差(下標 p = portfolio)= √(wTCw)。最佳化 03 關講的「風險」就是它。
nn 抽了幾組。②③④ 節的圖是拿模擬資料畫的,n 就是模擬幾次。
seed種子 亂數種子。本頁的亂數是自己寫的 PRNG(mulberry32),種子固定 ⇒ 每次重新整理拿到同一批數字,文字裡的數才對得上。按「再抽一次」才換種子。

⑤⑥ 節還會冒出 σ1σ2Cijλ —— 各自在第一次出現的地方就地解釋,這裡先不塞。

② 兩台機器同時吐:平均會相加,寬度不會

先不要算任何東西,只看形狀。下面三張圖是拿模擬資料畫的直方圖 —— 把每次量到的延遲丟進 5 ms 一格的桶子裡,數每個桶子有幾筆。桶子越高=那個範圍越常出現。

這一節刻意假設兩支服務互不影響(相關係數 ρ = 0:認證慢的時候,查詢並不會跟著慢)。 交叉項要到 ④ 才登場,這裡先把最乾淨的情況看清楚。

這張圖在幹嘛

你會看到什麼:左邊上下兩張是 X(認證延遲)Y(查詢延遲)各自的直方圖; 右邊那張是 X + Y(總延遲)的直方圖。每張圖上都有一條虛線=平均, 以及一條橫向的「σ 括號」:括號的左右兩端就是「平均 − 一個標準差」到「平均 + 一個標準差」, 括號越寬=抖得越厲害。右圖上多畫了一條紅色虛線括號,那是直覺猜的 σx + σy

你可以動什麼:兩個滑桿分別控制 σxσy(兩支服務各自抖多少); 下拉選單控制模擬幾組;「再抽一次」會換一個亂數種子重抽(種子印在旁邊,同一個種子永遠得到同一批數字)。

要看出什麼:三張圖的 x 軸範圍與柱寬完全一樣,所以寬度可以直接目測比較。你會看到 綠色括號明顯比紅色虛線括號窄 —— 而且不管你怎麼拉滑桿都是這樣。平均相加是對的,寬度相加是錯的。

σx(認證抖動)12 ms
σy(查詢抖動)16 ms
模擬幾組

seed =  (換種子 ⇒ 換一批模擬資料)

縱軸是相對次數:每張圖各自把自己最高的那根柱子當成 1,所以三張圖的高度不能互比、寬度可以(x 軸完全同尺度)。

現在畫面在說什麼

所以這一段的結論是:平均是可以相加的,抖動不行。而且「不行」的方式很有規律 —— 不是隨便少一點,而是每次都剛好少到某個值。下一節把那個值算出來。

③ 公式的來歷:為什麼是畢氏定理,交叉項又是從哪冒出來的

這一節會慢一點,因為整關的地基都在這裡。分三步:先看獨立的情況(結論會是畢氏定理), 再看一般情況(會多出一個交叉項),最後拿模擬資料現場對帳。

第一步:獨立的時候,變異數直接相加

先給結論,再解釋為什麼:

Var(X + Y) = Var(X) + Var(Y)  (僅限「獨立」) 換成標準差就要開根號:σ(X+Y) = √(σx2 + σy2)。 注意這一行是不能約分的 —— √(a2+b2) ≠ a + b

這個式子你其實國中就見過,只是那時候它叫別的名字。 σx = 12、σy = 16、答案 20 —— 12、16、20 就是 3、4、5 放大 4 倍。這是畢氏定理。

為什麼會是畢氏定理?因為 02 關證過「變異數就是一條向量跟自己的內積」, 而 03 關證過「相關係數就是那兩條向量的餘弦」。 兩件事合起來:獨立 ⇒ ρ = 0 ⇒ cos θ = 0 ⇒ 兩條向量垂直。 垂直的兩條向量相加,長度就走畢氏定理 —— 這就是 02 關坑 3 那句「標準差不能相加」的兌現標準差是長度,而兩條垂直向量的長度不能相加。

這張圖在幹嘛

你會看到什麼:一個直角三角形。藍色的底邊長度就是 σx橘色的直邊長度是 σy綠色的斜邊長度就是 σ(X+Y)。右下角那個小方角是直角記號, 它在畫面上代表「這兩個東西獨立」。旁邊還有一條紅色虛線, 長度是 σx + σy(把兩邊接成一直線),也就是直覺的答案。

你可以動什麼:兩個滑桿改 σxσy —— 跟 ② 節是同一組滑桿(同一份狀態),你在這裡拉,上面那三張直方圖也會跟著變。

要看出什麼:斜邊永遠比紅色虛線短,而且短的幅度隨兩邊的比例變化: 兩邊差很多時(例 4 和 20)斜邊幾乎等於長邊、幾乎沒省到;兩邊一樣長時(例 14 和 14)省得最多(省掉約 29%)。 「分散」在這張圖上就是「把兩邊拉成一樣長」。

σx12 ms
σy16 ms
現在畫面在說什麼

第二步:一般情況 —— 交叉項是從「展開平方」掉出來的

真實世界兩個東西通常獨立(兩支服務可能打同一個 DB、兩檔股票可能一起崩)。這時候完整的式子是:

Var(X + Y) = Var(X) + Var(Y) + 2 Cov(X, Y) 最後那一塊就是交叉項。獨立的時候 Cov = 0,它整塊消失,退回上面那條畢氏版。

那個 2Cov 不是硬塞的,它是國中乘法公式 (a + b)2 = a2 + 2ab + b2 的直接後果。五行推完,每一行都只做一件事:

Var(X + Y) = E[ ((X + Y) − (μx + μy))2 ]
變異數的定義:「偏離自己平均的量,平方之後的平均」。E[ ] 讀作「取平均」(expectation,機率統計 01 關)。
= E[ (a + b)2 ]
純粹換個寫法:記 a = X − μxb = Y − μy(兩個「偏差」)。括號重新分組,沒動任何東西。
= E[ a2 + 2ab + b2 ]
國中乘法公式,把平方展開。交叉項 2ab 就是在這一行冒出來的 —— 它一直都在,只是「獨立」的時候它的平均是 0。
= E[a2] + 2 E[ab] + E[b2]
「取平均」可以逐項分開(平均是線性的:一堆東西加起來再平均 = 各自平均再加起來,這就是 02 關的翹翹板)。
= Var(X) + 2 Cov(X, Y) + Var(Y)
三塊各自的名字:E[a2] 是 X 的變異數、E[b2] 是 Y 的變異數、E[ab] 就是共變異數的定義
所以這一段的結論是

「變異數可以相加」不是一條要背的規則,它是 (a+b)2 展開之後的三塊。 而「標準差不能相加」也不是規則 —— 是因為你想加的那個東西(標準差)是開過根號的, 而根號外面沒有乘法公式可用。任何時候你想把幾個抖動合起來,一律:先平方、加完(記得交叉項)、再開根號

順帶:把 Y 換成 −Y 代進去,b 變號、a2b2 不變、只有 2ab 變號,於是 Var(X − Y) = Var(X) + Var(Y) − 2Cov(X, Y)相減的時候只有交叉項變號,兩個變異數還是相加。

第三步:用真資料先對一次帳(不是模擬,是恆等式)

上面那五行是代數恆等式:只要用同一組資料、同一個自由度(本站一律樣本版 n − 1), 左右兩邊會一位小數都不差。拿 03 關那九個同學的真資料驗一次 (每週唸書時數當 X、週考分數當 Y):

這張表在幹嘛

你會看到什麼:左半是「直接把九筆 X+Y 算出來、再算它的變異數」;右半是「用公式三項拼出來」。 最後一列是兩邊的差。

你可以動什麼:這張表沒有互動 —— 它是對帳單,數字全部由頁面現場從那兩欄原始資料算出來,不是我手打的。

要看出什麼:兩邊的差是 0.000000。這不是「很接近」,是相等。 另外注意第二組(X − Y):只有交叉項變號,答案從 79.19 掉到 4.75。

第四步:換成會抖的模擬資料,看抽樣誤差

剛才是「同一組資料、兩種算法」,所以完全相等。真正有趣的問題是另一個: 我設定了 σx、σy、ρ 去生成資料,那生出來的資料回頭算,會不會回到我設定的值? 這就是 機率統計 01 關那件事:手上永遠只有樣本,樣本算出來的統計量會在真值附近晃。

這張表在幹嘛

你會看到什麼:三欄。「公式值」=我拿設定的 σx, σy, ρ 直接代公式(這是母體真值);「模擬值」=把 n 組模擬資料當成手上的樣本,現場用 LAB.M 算(樣本估計,除以 n−1); 最右是兩者的相對誤差。

你可以動什麼:ρ 滑桿(跟 ④ 節共用同一個 ρ)、模擬組數 n、以及 ② 節的「再抽一次」。

要看出什麼:誤差是幾個 % 而不是幾倍 —— 公式沒錯,差的是抽樣誤差。 而且 n 越大誤差平均越小(機率統計 01 關的大數法則,按 1/√n 收)—— 但單一種子的誤差本身是隨機的,不保證每次都變小。多按幾次「再抽一次」看它的散布才準。

ρ(兩支服務的相關係數)0.00
模擬組數 n2000
現在這張表在說什麼

所以這一段的結論是:公式對,資料會抖。兩件事要分開看 —— Var(X+Y) = Var(X) + Var(Y) + 2Cov 是恆等式(永遠成立,不需要任何分布假設), 而「我算出來的 Var 準不準」是抽樣問題(要靠 n 夠大)。

④ 交叉項的意義:分散風險的數學定義,就是把它弄成負的

交叉項 2Cov(X,Y) 裡面唯一會變號的東西是 ρ。 把 Cov = ρσxσy 代進去,整條式子只剩一個旋鈕:

σ(X + Y) = √( σx2 + σy2 + 2ρσxσy ) σx、σy 是各自的抖動(由資料決定,你改不了);ρ 是唯一決定「合起來抖多少」的東西

ρ 的三個特殊值代進去,三個答案都是整數,剛好把整個故事框住 (下面用預設的 σx = 12σy = 16):

ρ兩者的關係公式收成什麼σ(X+Y)
+1完全同步:X 高的時候 Y 一定也高√(σxy)2 = σx + σy 真的相加28
0沒關係(垂直)√(σx2y2) 畢氏定理20
−1完全反向:X 高的時候 Y 一定低√(σy−σx)2 = |σy − σx| 相減4

換句話說:「兩個抖動加起來」只是 ρ = +1 這一個極端情況。 直覺之所以會答 28,是因為它偷偷假設了「兩件事完全同步」,而那是最糟的一種世界。

這張圖在幹嘛

你會看到什麼:左圖是時間序列 —— 橫軸是「第幾次請求」, 藍線是 X 的延遲、橘線是 Y 的延遲、綠線是兩者相加。 三條各自的虛線是各自的平均。右圖是一條曲線:橫軸是 ρ(−1 到 +1), 縱軸是 σ(X+Y)紫色大點就是你現在在哪, 曲線上另外三個小點是 ρ = −1, 0, +1 三個地標。

你可以動什麼:ρ 滑桿(和 ③ 第四步共用)。三顆按鈕直接跳到三個端點。 還有一顆「σx = σy = 16」會把兩邊的抖動調成一樣大。

要看出什麼:ρ 從 +1 拉到 −1, 藍橘兩條線從「一起上下」變成「一個上另一個下」,而綠線從大幅震盪變成幾乎一條直線。 綠線變平 = 總延遲變穩 = 風險變小。這就是「分散」的全部內容。

ρ0.00
現在畫面在說什麼

所以這一段的結論是

分散風險的數學定義,就是把交叉項弄成負的。不是「多買幾檔」(那只是手段), 也不是「別把雞蛋放同一個籃子」(那只是比喻)—— 是字面意義上的 2ρσxσy < 0

ρ = −1 時能不能真的歸零,取決於兩邊的抖動大小: 按「σx = σy = 16」那顆鈕,你會看到綠線變成一條完全水平的直線, 讀數盤上的 σ(X+Y)0.000(模擬值也是 0,因為 16z + (−16z) = 0 逐筆抵銷)。兩邊不一樣大就只能抵掉一部分,剩下差額。

⑤ 加上權重:為什麼 a 要平方

到目前為止都是「一份 X 加一份 Y」。真實情況你會各拿多少: 七成錢買 A、三成買 B;或者呼叫服務 X 兩次、服務 Y 一次。所以式子要能吃權重:

Var(aX + bY) = a2σx2 + b2σy2 + 2ab Cov(X, Y) 推導跟 ③ 一模一樣,只是 a = X − μx 換成 a(X − μx): 展開 (aA + bB)2 = a2A2 + 2abAB + b2B2,係數就這樣掛上去了。

先回答那個「為什麼是平方」

因為變異數本身就是一個平方的量。把它想成02 關那些正方形的面積

權重 a抖動幅度(邊長)x變異數(面積)a2σx2倍率
0.56 ms36面積是 1 倍時的 1/4
112 ms144基準
224 ms576邊長 2 倍 → 面積 4 倍

權重拉 2 倍,抖動幅度 2 倍,面積 4 倍。所以在「變異數」這個帳本上, 權重一定是平方進去的;而交叉項是「兩個不同邊長的長方形」,所以進去的是 ab 而不是 a2。 等你回到標準差(開根號),權重就變回一次方了 —— σ(aX) = |a|σx

換一組資料:把 X、Y 換成兩檔資產

公式一個字都不用改,只是換身分。從這裡開始 XY最佳化 03 關那兩檔資產的年報酬率ab錢怎麼分

資產波動 σ備註
X:大盤 ETF(σ115 %兩者的相關係數 ρ 預設 −0.15(幾乎無關、還微微反向),可以用滑桿改。
Cov = ρσ1σ2 = −11.25
Y:投資級債券(σ25 %

下標從 x/y 換成 1/2 純粹是為了 ⑥ 節能寫成 Cij(第 i 個、第 j 個),意思完全一樣。 這三個數字是最佳化 03 關編的合成資料,不要拿去做投資判斷

畫面上看得見的那條「隨機變數向量」

③ 說過:獨立的兩個隨機變數,在幾何上是垂直的兩根箭頭,長度就是各自的 σ。 不獨立的時候呢?那兩根箭頭的夾角就不是 90° 了 —— 因為 cos θ = ρ(03 關那句話)。於是整條式子變成國中的餘弦定理

|aX + bY|2 = (aσ1)2 + (bσ2)2 + 2(aσ1)(bσ2)cos θ 左邊是「合起來那根箭頭的長度平方」= 組合的變異數;右邊就是上面那條三項式(把 cos θ 換回 ρ 就一模一樣)。 ρ = 0 ⇒ θ = 90° ⇒ 餘弦定理退化成畢氏定理,跟 ③ 那個三角形接上了。
這張圖在幹嘛

你會看到什麼:兩根箭頭從原點出發:藍色長度 1(你投在 ETF 上的風險)、 橘色長度 2(債券),兩者夾角就是 θcos θ = ρ)。 橘色會再複製一份接到藍色的尖端(虛線的平行四邊形), 綠色粗箭頭就是兩者相加、長度即 σp紅色虛線是直覺的答案 1 + bσ2(兩根接成一直線)。

你可以動什麼:兩個權重滑桿 ab這裡不要求 a + b = 1, 想放 0.3 + 0.3 也可以,那只是「只投了六成、其餘放現金」),以及 ρ 滑桿(會改夾角)。

要看出什麼:a,藍箭頭變長,綠箭頭跟著變長 —— 但讀數盤裡的變異數是按平方跳的(a 從 0.5 到 1,那一項從 56.25 跳到 225,四倍)。 而把 ρ 拉到夠負(例如 −0.5),夾角張開超過 90°, 綠箭頭會比藍箭頭還短 —— 多買了一個東西,總風險反而變小。

a(ETF 的權重)0.50
b(債券的權重)0.50
ρ(兩檔的相關係數)−0.15
現在畫面在說什麼

所以這一段的結論是:權重進到變異數裡一定是平方(自己那一項)或相乘(交叉項), 因為變異數是面積。而幾何上,「決定錢怎麼分」就是決定兩根箭頭各拉多長, 「風險」就是合成之後那根箭頭的長度。

⑥ 寫成矩陣:wTCw 就是那三項,一個字都沒多

這是本關的終點。上一節那條三項式已經是完整答案了, 我們現在只做一件事:換一種寫法。做法是把散在式子裡的東西分成兩堆 —— 「我能決定的」跟「資料給定的」:

① 我能決定的:權重排成一條向量

② 資料給定的:四個統計量排成一張表

C 就是 03 關那個共變異數矩陣: 對角線是各自的變異數C11 = σ12C22 = σ22), 非對角線是共變異數C12 = C21 = Cov = ρσ1σ2)。 下標讀法:Cij =「第 i 個跟第 j 個之間那一格」。它一定對稱,因為「X 跟 Y 一起動」和「Y 跟 X 一起動」是同一件事。

這張表在幹嘛

你會看到什麼:四個步驟,把 wTCw 用當前的實際數字一步一步乘開: 先算 Cw(矩陣吃向量,吐一條新向量),再把它跟 w 做內積, 然後把結果攤成三項,最後跟 ⑤ 節那條三項式逐項對位

你可以動什麼:下面的 abρ 滑桿(跟 ⑤ 節是同一組狀態), 以及「2 個變數 / 3 個變數」切換。

要看出什麼:最後一行的對帳 —— 三~四種算法(三項式、逐格加總、LAB.M.quadForm、 再加上 ⑤ 那根綠箭頭的長度平方)給出完全相同的數字,差 0。 切到 3 個變數時,展開式從 3 項變成 6 項、逐格表從 4 格變成 9 格, wTCw 這五個字元一個都沒變

a(第 1 檔的權重)0.50
b(第 2 檔的權重)0.50
c(第 3 檔的權重)0.20
ρ12−0.15

每一格 wiwjCij 攤開來看 (=這一格讓風險變大,=讓風險變小,紫框=對角線的「自己那一項」):

對帳

程式碼版本(就是上面那張表在做的事)

// C 是 n×n 的共變異數矩陣,w 是長度 n 的權重
// 寫法一:兩層迴圈,逐格加總 —— n = 2 是 4 格,n = 3 是 9 格,n = 100 是 10000 格
function quad(C, w) {
  let s = 0;
  for (let i = 0; i < w.length; i++)
    for (let j = 0; j < w.length; j++)
      s += w[i] * w[j] * C[i][j];
  return s;                       // 這就是 wᵀCw
}

// 寫法二:先 Cw 再內積 —— 跟數學式的讀法一致,也是 BLAS 實際在做的
const Cw = matVec(C, w);          // Cw[i] = Σⱼ C[i][j] * w[j]
const varp = dot(w, Cw);          // Σᵢ w[i] * Cw[i]

// 本頁 2×2 的部分直接用共用工具(不另外寫一份,兩份會 drift):
// LAB.M.matVec(C, w) 與 LAB.M.quadForm(C, w)
// 3×3 的部分自己補兩層迴圈,因為 LAB.M 只做 2×2

這個寫法換來三件事

(a) 它就是 05 關那個二次型,只是 v 換了身分

05 關掃描主軸的時候算的是 vTCvv 是一個方向(單位向量),答案是「資料往這個方向看過去有多散」。

這一關算的是 wTCww錢怎麼分(不必是單位向量), 答案是「這樣分之後組合有多抖」。同一台機器,換了輸入的意思。 也因此 05 關的結論可以直接搬過來用:C特徵向量就是「風險的主軸」, 最大的 λ(唸 lambda,就是特徵值)= 最糟方向的變異數, 最小的 λ = 最安全方向的變異數。任何 w 的風險都被這兩個數字夾住。

(b) n 個變數的時候,展開式會爆炸,矩陣寫法不會

2 個變數展開是 3 項(2 個平方項 + 1 個交叉項),3 個變數是 6 項(3 + 3), 10 個變數是 55 項,100 個變數是 5050 項 —— 一般式是 n(n+1)/2。 按上面那顆「3 個變數」,你會親眼看到式子從一行變成三行。

wTCw 這五個字元一個都沒變。 這就是矩陣記號存在的唯一理由:它把「有幾個變數」這件事從式子裡拿掉了。 程式碼那邊也是同一件事 —— 兩層迴圈的寫法不管 n 是 2 還是 100 都是同一段。

(c) 這就是最佳化 03 關那條公式,債還完了

最佳化 03 關開頭那條 σp2 = wTCw 現在不是天上掉下來的了。它的完整來歷是五步:

  1. 變異數的定義是「偏差平方的平均」(02 關)。
  2. 把兩個偏差加起來、展開平方,掉出一個交叉項(本關 ③)。
  3. 那個交叉項叫共變異數(03 關),它的正負決定風險加成還是抵銷(本關 ④)。
  4. 加上權重之後,自己那項配 wi2、交叉項配 wiwj(本關 ⑤)。
  5. 把所有 wiwjCij 加起來,寫成矩陣就是 wTCw(本關 ⑥)。

最佳化 03 關要做的事只剩一件:在「所有 w 加起來等於 1」的限制下,把這個數字壓到最小。 那是最佳化問題,交給 最佳化 01 關最佳化 02 關

⑦ 工程師的「原來如此」

誤差傳播:你的規格書上那個 ± 不能相加

兩個感測器各自標稱 ±0.3°C(把它讀成「標準差 0.3」)。 你把兩個讀數相加當成總熱量的指標,總誤差是多少?

不是 0.6。獨立的話是 √(0.32 + 0.32) = 0.42。 這條規則在量測領域叫誤差傳播(error propagation),它跟本關 ③ 是同一條式子: 任何線性組合 Z = aX + bY,誤差就是 √(a2σx2 + b2σy2 + 2abσxy)

延遲版更有感。一條請求鏈串了三段,每段抖動 σ = 10 ms

  • 三段互相獨立 → 總抖動 √(3 × 100) = 17.3 ms,不是 30 ms。 所以「加一段 middleware」對尾延遲的傷害比你想的小,只要它跟別段真的不相干。
  • 三段共用同一個下游(同一個 DB、同一個連線池、同一台機器的 CPU)→ ρ 往 1 靠。 極限是 10 + 10 + 10 = 30 ms整段公式退化回你的直覺,而且是最糟的那個直覺。

這就是為什麼「共用資源」在容量規劃裡特別毒:它不只讓平均變慢, 它讓各段的抖動從畢氏相加變成直接相加,尾延遲直接惡化 70%。 你在 ρ 滑桿看到的那條曲線,就是這件事的全貌。

年化波動率為什麼是乘 √252 —— 以及這個做法什麼時候會騙你

金融資料裡到處都是「日波動率 × √252 = 年化波動率」(252 是一年的交易日數)。 這個 √ 不是慣例,它就是本關的公式:

R = r1 + r2 + … + r252
一年的報酬 ≈ 252 個日報酬相加(嚴格說是連乘,但日報酬很小的時候取對數就變成加法 —— 基礎 01 關 ④ 節那條「乘變加」)。
Var(R) = 252 × σ2
變異數可以相加(本關 ③),而且假設每天獨立同分布(i.i.d.)⇒ 交叉項全部是 0、每天的變異數都一樣。
σ = √252 × σ
開根號的時候 252 才變成 √252 ≈ 15.87。√ 是「開根號回到標準差」留下的,不是什麼金融慣例。

例:日波動 1.2% → 年化 1.2 × 15.87 = 19.05%

誠實地說:那個 i.i.d. 假設經常不成立。三個常見的破法:

  • 波動叢聚:大跌的隔天更容易大跌,日報酬的絕對值有強自相關。√252 會低估真實的年化風險。
  • 報酬自相關:真有動能或均值回歸時,Cov(rt, rt+1) ≠ 0, 交叉項不是 0,整個 252σ2 就少算了 2ΣCov 那一堆。
  • 流動性差的資產:價格不是每天更新(房地產、私募、冷門債),日報酬被人為平滑, 算出來的 σ 偏小,乘 √252 之後把風險系統性低估。

所以 √252 是個可以用但要知道它假設了什麼的近似。 知道它從哪來,你就知道它什麼時候會壞 —— 這比記住 15.87 有用得多。

⑧ 踩坑

坑 1:能相加的是變異數,不是標準差

這是本關唯一真正重要的一條,而它非常容易在寫程式的時候踩到, 因為你的 dashboard、你的 SLO、你的規格書上寫的全部是標準差(有單位、看得懂的那個)。

流程一律是三段:平方 → 加(含交叉項)→ 開根號。中間那步是唯一能相加的地方。 任何時候你看到程式碼裡出現 sigma_a + sigma_b,那八成是個 bug —— 除非作者真的是刻意在算「最糟情況上界」(ρ = 1),而且註解寫清楚了。

坑 2:「獨立」跟「不相關」不是同一件事

本關所有公式只需要 Cov = 0(不相關),不需要獨立。 這是好消息:條件比你想的弱。

但反過來不成立:Cov = 0 推不出獨立。 03 關給過反例:把點排成一個圓、或排成 V 字形, 共變異數是 0(沒有線性關聯),可是 X 完全決定了 |Y|,兩者顯然不獨立。

什麼時候這個差別會咬你?當你需要的不只是變異數的時候。Var(X+Y) 只要不相關就夠;但要算 P(X + Y > 200)(尾部機率)、 或要主張「X+Y 是常態分布」,那就真的需要獨立(或至少需要聯合分布的完整形狀)—— 那是 機率統計 04 關的事。

坑 3:危機的時候 ρ 會跑掉,分散會失效

你在 ④ 節看到的「把交叉項弄成負的」有一個致命的隱含假設:ρ 是個常數。 它不是。ρ 是從歷史資料估出來的,而它會隨時間變 —— 而且它變大的時機,剛好是你最需要它小的時候。

市場恐慌時大家一起賣所有東西,原本 ρ = 0.2 的兩類資產會一起跌, 實際的 ρ 跳到 0.8 以上。工程上完全一樣:平常互不相干的三個服務, 在下游 DB 掛掉的那一刻同時超時,ρ 瞬間變 1。

所以正確的用法是:拿 ρ 算出的分散效果是平常的好處, 壓力測試一律另外算一次 ρ = 1(也就是「直接相加」那個直覺值)當上界。 直覺答錯的那個 28 ms,其實是壓力情境下的正確答案。

坑 4:相減的時候,交叉項變號 —— 但變異數還是相加

Var(X − Y) = Var(X) + Var(Y) − 2Cov(X, Y)。 兩個地方容易錯:一是把前面兩項也寫成相減(不對,變異數永遠 ≥ 0,相減會算出負的變異數); 二是忘記變號。

這件事在 A/B test 裡天天發生:你要比較兩組的差 A − B, 如果兩組共用同一批使用者、同一段時間(Cov > 0), 差的變異數會小於兩組變異數相加 —— 這正是配對設計(paired test)比獨立雙樣本更靈敏的原因。 套錯公式你會把檢定力浪費掉。

③ 第三步那張對帳表已經用 03 關的真資料算給你看了:同一組九筆資料, 相加的變異數是 79.19,相減的是 4.75。差別全部來自那一項的正負號。

⑨ 這關回答了什麼

為什麼變異數可以相加,標準差就不行?

因為變異數是「偏差平方的平均」,而平方有乘法公式可以展開: (a+b)2 = a2 + 2ab + b2。 展開出來的三塊剛好就是 Var(X)2Cov(X,Y)Var(Y) —— 相加是展開的結果,不是規定。

標準差是變異數開過根號的,而根號外面沒有對應的展開公式: √(a2+b2) 就是不等於 a + b。 幾何上更直白:標準差是長度,而兩條不平行的向量,長度不能相加 —— 那是三角不等式。 只有兩條完全同向(ρ = 1)時才剛好相等。

實用結論:把「加起來」這件事一律在變異數的世界做完,最後再開根號回到標準差。

交叉項 2Cov(X, Y) 到底是什麼?為什麼是 2 倍?

它就是 (a+b)2 裡的 2ab, 只是 ab 換成兩個偏差、然後取平均。 2 倍的來歷完全不神秘:abba 是兩格, 在矩陣的 2×2 表格裡就是 C12C21 兩個對稱的格子,各出一份力。

意義上它是「兩個東西一起偏離平均的程度」。正的代表同進同退,兩邊的抖動會互相放大; 負的代表一個高的時候另一個低,抖動會互相抵銷。④ 節那條曲線就是它從 +1 走到 −1 的完整效果:σ(X+Y) 從 28 一路掉到 4。

為什麼權重要平方?(a 變 2 倍,那一項就變 4 倍)

因為變異數是平方的量,可以想成正方形的面積(02 關)。 權重 a 拉成 2 倍,抖動的幅度(邊長 x)變 2 倍, 面積a2σx2)就變 4 倍。

交叉項配的是 ab 而不是平方,因為它是「兩個不同邊長圍出來的長方形」—— 一邊 x、一邊 y

要注意的是這只發生在變異數的帳本上。回到標準差,權重就變回一次方: σ(aX) = |a| σx(絕對值是因為標準差不能是負的)。 所以「風險對權重是線性還是平方」這個問題本身就有陷阱 —— 要先問「你說的風險是變異數還是標準差」。

wTCw 跟 05 關那個 vTCv 是同一個東西嗎?

是,一模一樣的機器,只是餵進去的東西意思不同。

  • 05 關v方向(單位向量,長度固定 1), vTCv 讀作「資料往這個方向看過去有多散」。找最大值 → 主軸 → PCA。
  • 本關 ⑥:w配置(各拿幾份,長度不限), wTCw 讀作「這樣分之後合起來有多抖」。找最小值 → 最小風險組合 → 最佳化 03 關。

兩者都叫「C 的二次型」。因為是同一個東西,05 關的結論可以整包搬過來: C特徵向量是風險的主軸, 而任何單位長度的 w 算出來的風險,都被最大與最小特徵值夾住。 這也解釋了最佳化 03 關那些橢圓為什麼會長成那樣 —— 機率統計 05 關畫的就是它的等高線。

「獨立」跟「不相關」在這裡有差別嗎?

對本關的公式沒有差別,對別的事情差很多。

Var(X+Y) = Var(X) + Var(Y) 這條只需要 Cov(X,Y) = 0, 也就是「不相關」。獨立是更強的條件(獨立一定不相關,反之不然),這裡用不到那麼強。 所以本關的公式適用範圍比你想的寬 —— 而且它不需要任何分布假設, 不管資料是常態、右偏、雙峰、離散,公式都成立。

差別會在你想問「機率」的時候出現。例如「總延遲超過 200 ms 的機率是多少」, 光有變異數不夠,你需要 X + Y整個分布; 而「兩個常態相加還是常態」這種好事需要獨立(或聯合常態)才成立。 那是 機率統計 02 關機率統計 04 關的地盤。

年化波動率為什麼要乘 √252?

三步,全部是本關的公式: 一年的報酬 ≈ 252 個日報酬相加; 變異數可以相加,若每天獨立同分布則 Var = 252σ2 開根號回到標準差,252 就變成 √252 ≈ 15.87

換句話說,√ 是「變異數 → 標準差」那一步留下的,跟金融無關。 任何「把 k 個獨立同分布的東西加起來」都是 √k: k 段串接的請求延遲、k 次量測取和、k 步隨機漫步走多遠,全是同一條。

但那個 i.i.d. 假設經常不成立(波動叢聚、報酬自相關、資產不常成交), ⑦ 節列了三個常見破法。√252 是個好用的近似,不是定律。

那 Var(X − Y) 呢?

Var(X − Y) = Var(X) + Var(Y) − 2Cov(X, Y)。 把 −Y 代進推導:偏差 b 變號, b2 不變(負負得正),只有 2ab 變號。 兩個變異數還是相加 —— 相減的東西再怎麼減,抖動也不會互相取消,除非它們正相關。

這在 A/B test 與配對實驗裡很關鍵:同一批人做前後測(Cov > 0), 差值的變異數會小於兩組獨立時的和,檢定更靈敏。這也是為什麼「用同一批使用者做對照」是好設計。

⑧ 坑 4 用 03 關的九筆真資料算過:相加 79.19、相減 4.75。

這一整關需要假設資料是常態分布嗎?

完全不需要。Var(aX + bY) = a2σx2 + b2σy2 + 2ab Cov 是從變異數的定義展開來的代數恆等式,對任何分布都成立 —— 右偏的延遲、離散的點擊數、有厚尾的報酬率,全都適用。

本頁的圖之所以用常態來模擬,純粹是因為畫出來的鐘形好認、數字乾淨 (σ 剛好取到 12 / 16 / 20 這種畢氏三元組)。 真實的 API 延遲是右偏的(有長尾),但這不影響本關任何一條公式 —— 只會影響「知道 σ 之後能不能推出 p99」,那才需要分布形狀(機率統計 02 關)。

什麼情況下我會需要用到它?

只要你把幾個會抖的東西合成一個數字的時候。幾個真的會遇到的場合:

  • 容量與 SLO 規劃:串接 k 段服務的總延遲抖動、批次任務的總時長分布。 用相加會高估,用畢氏要先確認各段真的不相干。
  • 量測與監控:任何「幾個帶誤差的讀數合成一個指標」—— 誤差傳播就是本關的公式()。
  • A/B test 與配對實驗:差值的變異數要不要扣交叉項,直接決定樣本量算得對不對。
  • 投資組合與風險預算wTCw 就是全部,最佳化 03 關整關在解它的最小化。
  • 感測器融合 / Kalman filter:兩個估計值加權平均,權重怎麼挑才讓合起來的變異數最小 —— 那是本關 ⑤ 對 a 微分等於 0,也是 最佳化 01 關的一階條件。
這關留下什麼洞

現在你會把兩個會抖的東西加成一個了,而且知道那個「合起來的抖動」怎麼算、 也知道它為什麼可以寫成 wTCw

但「加起來」是一種壓縮:兩個數字變一個,資訊掉了。 有很多問題你不能壓 —— 你要同時看兩個: 「身高 175 而且體重 55」這種組合常見嗎?「延遲正常但錯誤率飆高」是什麼狀況? 這些問題問的不是 X + Y,是 (X, Y) 這一對出現的機會 —— 那叫二維聯合分布,而 C 在那裡會從「一個公式的零件」變成「一張地圖的形狀」。

下一關就把那張地圖畫出來,順便把 03 關欠的另一筆債 (「Cov = 0 不等於獨立」只給了反例、沒給定義)也還掉。