把兩個隨機變數加起來,會抖多少?
玩完這關,你會知道「兩個會抖的東西加起來」為什麼不是把兩個抖加起來 —— 然後親手把答案寫成 wTCw。最佳化 03 關那條天上掉下來的風險公式,就是在這一關長出來的。
① 這關在解什麼問題
上一關給了你什麼 機率統計 02 ⑤ 把一台機器的形狀講完了:μ 搬左右、σ 管胖瘦, 兩顆旋鈕就決定一整條曲線。但那整關從頭到尾只有一台機器。 這一關擺兩台上桌,然後問最土的問題:把它們的輸出加起來,會抖多少? 你會發現答案裡多冒出一項 2Cov(X, Y) —— 而那個 Cov 不是新東西,就是 03 關那張 C 的非對角線。 這一關就是 C 第一次被拿去「算後果」,而不只是「描述形狀」。
最佳化 03 關(有效邊界)整關的主角是 σp2 = wTCw。 那條式子在那一關是天上掉下來的 —— 直接宣告「組合的變異數等於這個」,沒有任何來歷。
02 關更早就欠了一筆:它的坑 3 說「標準差不能直接相加」, 給了結論(3 和 4 合起來是 5 不是 7),但那句話有一個沒說出口的前提叫「獨立」, 而且完全沒處理「不獨立的時候怎麼辦」。
這一關把這兩筆一起還掉:從「兩個會抖的東西加起來抖多少」出發, 一路推到 wTCw,中間不跳任何一步。 這是線性代數跟最佳化之間那塊橋。
先講具體的麻煩
你有兩支服務。前端呼叫一次要先打認證、再打查詢,兩段串起來跑:
| 這一段 | 平均延遲 | 抖動(標準差) |
|---|---|---|
| ■ X:認證服務 | 40 ms | 12 ms |
| ■ Y:查詢服務 | 60 ms | 16 ms |
問題:總延遲會抖多少?直覺會這樣回答:
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%)。 這個「風險打折、報酬不打折」的免費午餐,數學上就是本關 ④ 的交叉項, 而它是整個投資組合理論唯一的引擎。
先把符號認一遍
這一整頁只會用到下面這些符號。每一個都只是某句中文的縮寫,最右欄是它現在的值(你動任何滑桿它就跟著變):
| 符號 | 怎麼唸 | 它到底是什麼 | 現在的值 |
|---|---|---|---|
| X | X | 第一個會抖的東西。②③④ 節是「認證服務的單次延遲(ms)」,⑤⑥ 節換成「大盤 ETF 的年報酬(%)」。會抖就是「每次量到的數字不一樣」,這就是「隨機變數」這個詞的全部意思(機率統計 01 關)。 | — |
| Y | Y | 第二個會抖的東西。②③④ 是「查詢服務的延遲」,⑤⑥ 是「投資級債券的年報酬」。 | — |
| X + Y | — | 兩個加起來。串接兩支服務的總延遲;或「兩檔各買一份」的總報酬。本頁圖上綠色永遠是這個「結果」。 | — |
| μx、μy | mu x、mu y | 平均(02 關的 x̄)。下標只是在講「誰的」。本頁固定 μx = 40 ms、μy = 60 ms,因為這關的主角是「抖」不是「快」。 | 40 / 60 |
| σx、σy | sigma x、sigma y | 標準差,也就是「抖動幅度」(02 關)。單位跟資料一樣(ms)。 | — |
| Var(X) = σx2 | variance | 變異數=標準差的平方。單位是 ms2,沒有物理意義,但它才是能相加的那個量,這是本關的核心。 | — |
| Cov(X, Y) | covariance | 共變異數(03 關):兩個東西「一起偏離自己平均」的程度。正的=同進同退,負的=一個高另一個低。單位 ms×ms。 | — |
| ρ | rho(希臘字母 r) | 相關係數(03 關)= Cov(X,Y) / (σxσy),把單位洗掉之後的共變異數,範圍固定在 −1 到 +1。 | — |
| θ | theta | 夾角。03 關說過「相關係數就是中心化之後的餘弦」,所以 cos θ = ρ。⑤ 節會把兩個隨機變數畫成兩根真的箭頭,這個角就看得見了。 | — |
| a、b | a、b | 權重:X 拿幾份、Y 拿幾份。⑤ 節開始出現。a = b = 0.5 就是「兩邊各一半」。 | — |
| w | w(不是希臘字母) | 權重向量,就是把 a, b 排成一條向量 w = (a, b)。⑥ 節的主角。 | — |
| C | C | 共變異數矩陣(03 關):把 4 個統計量排成 2×2 的表,對角線是兩個變異數,非對角線是共變異數。 | 見 ⑥ |
| wTCw | w transpose C w | 組合的變異數。上標 T 是轉置(把直立的向量躺下來),整串讀作「w 躺下來、乘 C、再乘 w」。⑥ 節會現場一步一步乘給你看。 | — |
| σp | sigma p | 組合的標準差(下標 p = portfolio)= √(wTCw)。最佳化 03 關講的「風險」就是它。 | — |
| n | n | 抽了幾組。②③④ 節的圖是拿模擬資料畫的,n 就是模擬幾次。 | — |
| seed | 種子 | 亂數種子。本頁的亂數是自己寫的 PRNG(mulberry32),種子固定 ⇒ 每次重新整理拿到同一批數字,文字裡的數才對得上。按「再抽一次」才換種子。 | — |
⑤⑥ 節還會冒出 σ1、σ2、Cij、λ —— 各自在第一次出現的地方就地解釋,這裡先不塞。
② 兩台機器同時吐:平均會相加,寬度不會
先不要算任何東西,只看形狀。下面三張圖是拿模擬資料畫的直方圖 —— 把每次量到的延遲丟進 5 ms 一格的桶子裡,數每個桶子有幾筆。桶子越高=那個範圍越常出現。
這一節刻意假設兩支服務互不影響(相關係數 ρ = 0:認證慢的時候,查詢並不會跟著慢)。 交叉項要到 ④ 才登場,這裡先把最乾淨的情況看清楚。
你會看到什麼:左邊上下兩張是 X(認證延遲)和 Y(查詢延遲)各自的直方圖; 右邊那張是 X + Y(總延遲)的直方圖。每張圖上都有一條虛線=平均, 以及一條橫向的「σ 括號」:括號的左右兩端就是「平均 − 一個標準差」到「平均 + 一個標準差」, 括號越寬=抖得越厲害。右圖上多畫了一條紅色虛線括號,那是直覺猜的 σx + σy。
你可以動什麼:兩個滑桿分別控制 σx、σy(兩支服務各自抖多少); 下拉選單控制模擬幾組;「再抽一次」會換一個亂數種子重抽(種子印在旁邊,同一個種子永遠得到同一批數字)。
要看出什麼:三張圖的 x 軸範圍與柱寬完全一樣,所以寬度可以直接目測比較。你會看到 綠色括號明顯比紅色虛線括號窄 —— 而且不管你怎麼拉滑桿都是這樣。平均相加是對的,寬度相加是錯的。
seed = — (換種子 ⇒ 換一批模擬資料)
縱軸是相對次數:每張圖各自把自己最高的那根柱子當成 1,所以三張圖的高度不能互比、寬度可以(x 軸完全同尺度)。
—
所以這一段的結論是:平均是可以相加的,抖動不行。而且「不行」的方式很有規律 —— 不是隨便少一點,而是每次都剛好少到某個值。下一節把那個值算出來。
③ 公式的來歷:為什麼是畢氏定理,交叉項又是從哪冒出來的
這一節會慢一點,因為整關的地基都在這裡。分三步:先看獨立的情況(結論會是畢氏定理), 再看一般情況(會多出一個交叉項),最後拿模擬資料現場對帳。
第一步:獨立的時候,變異數直接相加
先給結論,再解釋為什麼:
這個式子你其實國中就見過,只是那時候它叫別的名字。 σ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%)。 「分散」在這張圖上就是「把兩邊拉成一樣長」。
—
第二步:一般情況 —— 交叉項是從「展開平方」掉出來的
真實世界兩個東西通常不獨立(兩支服務可能打同一個 DB、兩檔股票可能一起崩)。這時候完整的式子是:
那個 2Cov 不是硬塞的,它是國中乘法公式 (a + b)2 = a2 + 2ab + b2 的直接後果。五行推完,每一行都只做一件事:
「變異數可以相加」不是一條要背的規則,它是 (a+b)2 展開之後的三塊。 而「標準差不能相加」也不是規則 —— 是因為你想加的那個東西(標準差)是開過根號的, 而根號外面沒有乘法公式可用。任何時候你想把幾個抖動合起來,一律:先平方、加完(記得交叉項)、再開根號。
順帶:把 Y 換成 −Y 代進去,b 變號、a2 與 b2 不變、只有 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 收)—— 但單一種子的誤差本身是隨機的,不保證每次都變小。多按幾次「再抽一次」看它的散布才準。
—
所以這一段的結論是:公式對,資料會抖。兩件事要分開看 —— Var(X+Y) = Var(X) + Var(Y) + 2Cov 是恆等式(永遠成立,不需要任何分布假設), 而「我算出來的 Var 準不準」是抽樣問題(要靠 n 夠大)。
④ 交叉項的意義:分散風險的數學定義,就是把它弄成負的
交叉項 2Cov(X,Y) 裡面唯一會變號的東西是 ρ。 把 Cov = ρσxσy 代進去,整條式子只剩一個旋鈕:
把 ρ 的三個特殊值代進去,三個答案都是整數,剛好把整個故事框住 (下面用預設的 σx = 12、σy = 16):
| ρ | 兩者的關係 | 公式收成什麼 | σ(X+Y) |
|---|---|---|---|
| +1 | 完全同步:X 高的時候 Y 一定也高 | √(σx+σy)2 = σx + σy 真的相加 | 28 |
| 0 | 沒關係(垂直) | √(σx2+σy2) 畢氏定理 | 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, 藍橘兩條線從「一起上下」變成「一個上另一個下」,而綠線從大幅震盪變成幾乎一條直線。 綠線變平 = 總延遲變穩 = 風險變小。這就是「分散」的全部內容。
—
分散風險的數學定義,就是把交叉項弄成負的。不是「多買幾檔」(那只是手段), 也不是「別把雞蛋放同一個籃子」(那只是比喻)—— 是字面意義上的 2ρσxσy < 0。
而 ρ = −1 時能不能真的歸零,取決於兩邊的抖動大小: 按「σx = σy = 16」那顆鈕,你會看到綠線變成一條完全水平的直線, 讀數盤上的 σ(X+Y) 是 0.000(模擬值也是 0,因為 16z + (−16z) = 0 逐筆抵銷)。兩邊不一樣大就只能抵掉一部分,剩下差額。
⑤ 加上權重:為什麼 a 要平方
到目前為止都是「一份 X 加一份 Y」。真實情況你會各拿多少: 七成錢買 A、三成買 B;或者呼叫服務 X 兩次、服務 Y 一次。所以式子要能吃權重:
先回答那個「為什麼是平方」
因為變異數本身就是一個平方的量。把它想成02 關那些正方形的面積:
| 權重 a | 抖動幅度(邊長)aσx | 變異數(面積)a2σx2 | 倍率 |
|---|---|---|---|
| 0.5 | 6 ms | 36 | 面積是 1 倍時的 1/4 |
| 1 | 12 ms | 144 | 基準 |
| 2 | 24 ms | 576 | 邊長 2 倍 → 面積 4 倍 |
權重拉 2 倍,抖動幅度 2 倍,面積 4 倍。所以在「變異數」這個帳本上, 權重一定是平方進去的;而交叉項是「兩個不同邊長的長方形」,所以進去的是 ab 而不是 a2。 等你回到標準差(開根號),權重就變回一次方了 —— σ(aX) = |a|σx。
換一組資料:把 X、Y 換成兩檔資產
公式一個字都不用改,只是換身分。從這裡開始 X、Y 是 最佳化 03 關那兩檔資產的年報酬率,a、b 是錢怎麼分:
| 資產 | 波動 σ | 備註 |
|---|---|---|
| ■ X:大盤 ETF(σ1) | 15 % | 兩者的相關係數 ρ 預設 −0.15(幾乎無關、還微微反向),可以用滑桿改。 Cov = ρσ1σ2 = −11.25。 |
| ■ Y:投資級債券(σ2) | 5 % |
下標從 x/y 換成 1/2 純粹是為了 ⑥ 節能寫成 Cij(第 i 個、第 j 個),意思完全一樣。 這三個數字是最佳化 03 關編的合成資料,不要拿去做投資判斷。
畫面上看得見的那條「隨機變數向量」
③ 說過:獨立的兩個隨機變數,在幾何上是垂直的兩根箭頭,長度就是各自的 σ。 不獨立的時候呢?那兩根箭頭的夾角就不是 90° 了 —— 因為 cos θ = ρ(03 關那句話)。於是整條式子變成國中的餘弦定理:
你會看到什麼:兩根箭頭從原點出發:藍色長度 aσ1(你投在 ETF 上的風險)、 橘色長度 bσ2(債券),兩者夾角就是 θ(cos θ = ρ)。 橘色會再複製一份接到藍色的尖端(虛線的平行四邊形), 綠色粗箭頭就是兩者相加、長度即 σp。 紅色虛線是直覺的答案 aσ1 + bσ2(兩根接成一直線)。
你可以動什麼:兩個權重滑桿 a、b(這裡不要求 a + b = 1, 想放 0.3 + 0.3 也可以,那只是「只投了六成、其餘放現金」),以及 ρ 滑桿(會改夾角)。
要看出什麼:拉 a,藍箭頭變長,綠箭頭跟著變長 —— 但讀數盤裡的變異數是按平方跳的(a 從 0.5 到 1,那一項從 56.25 跳到 225,四倍)。 而把 ρ 拉到夠負(例如 −0.5),夾角張開超過 90°, 綠箭頭會比藍箭頭還短 —— 多買了一個東西,總風險反而變小。
—
所以這一段的結論是:權重進到變異數裡一定是平方(自己那一項)或相乘(交叉項), 因為變異數是面積。而幾何上,「決定錢怎麼分」就是決定兩根箭頭各拉多長, 「風險」就是合成之後那根箭頭的長度。
⑥ 寫成矩陣:wTCw 就是那三項,一個字都沒多
這是本關的終點。上一節那條三項式已經是完整答案了, 我們現在只做一件事:換一種寫法。做法是把散在式子裡的東西分成兩堆 —— 「我能決定的」跟「資料給定的」:
① 我能決定的:權重排成一條向量
② 資料給定的:四個統計量排成一張表
C 就是 03 關那個共變異數矩陣: 對角線是各自的變異數(C11 = σ12、C22 = σ22), 非對角線是共變異數(C12 = C21 = Cov = ρσ1σ2)。 下標讀法:Cij =「第 i 個跟第 j 個之間那一格」。它一定對稱,因為「X 跟 Y 一起動」和「Y 跟 X 一起動」是同一件事。
你會看到什麼:四個步驟,把 wTCw 用當前的實際數字一步一步乘開: 先算 Cw(矩陣吃向量,吐一條新向量),再把它跟 w 做內積, 然後把結果攤成三項,最後跟 ⑤ 節那條三項式逐項對位。
你可以動什麼:下面的 a、b、ρ 滑桿(跟 ⑤ 節是同一組狀態), 以及「2 個變數 / 3 個變數」切換。
要看出什麼:最後一行的對帳 —— 三~四種算法(三項式、逐格加總、LAB.M.quadForm、
再加上 ⑤ 那根綠箭頭的長度平方)給出完全相同的數字,差 0。
切到 3 個變數時,展開式從 3 項變成 6 項、逐格表從 4 格變成 9 格,
但 wTCw 這五個字元一個都沒變。
每一格 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
這個寫法換來三件事
05 關掃描主軸的時候算的是 vTCv: v 是一個方向(單位向量),答案是「資料往這個方向看過去有多散」。
這一關算的是 wTCw:w 是錢怎麼分(不必是單位向量), 答案是「這樣分之後組合有多抖」。同一台機器,換了輸入的意思。 也因此 05 關的結論可以直接搬過來用:C 的 特徵向量就是「風險的主軸」, 最大的 λ(唸 lambda,就是特徵值)= 最糟方向的變異數, 最小的 λ = 最安全方向的變異數。任何 w 的風險都被這兩個數字夾住。
2 個變數展開是 3 項(2 個平方項 + 1 個交叉項),3 個變數是 6 項(3 + 3), 10 個變數是 55 項,100 個變數是 5050 項 —— 一般式是 n(n+1)/2。 按上面那顆「3 個變數」,你會親眼看到式子從一行變成三行。
但 wTCw 這五個字元一個都沒變。 這就是矩陣記號存在的唯一理由:它把「有幾個變數」這件事從式子裡拿掉了。 程式碼那邊也是同一件事 —— 兩層迴圈的寫法不管 n 是 2 還是 100 都是同一段。
最佳化 03 關開頭那條 σp2 = wTCw 現在不是天上掉下來的了。它的完整來歷是五步:
- 變異數的定義是「偏差平方的平均」(02 關)。
- 把兩個偏差加起來、展開平方,掉出一個交叉項(本關 ③)。
- 那個交叉項叫共變異數(03 關),它的正負決定風險加成還是抵銷(本關 ④)。
- 加上權重之後,自己那項配 wi2、交叉項配 wiwj(本關 ⑤)。
- 把所有 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 是一年的交易日數)。 這個 √ 不是慣例,它就是本關的公式:
例:日波動 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 有用得多。
⑧ 踩坑
這是本關唯一真正重要的一條,而它非常容易在寫程式的時候踩到, 因為你的 dashboard、你的 SLO、你的規格書上寫的全部是標準差(有單位、看得懂的那個)。
流程一律是三段:平方 → 加(含交叉項)→ 開根號。中間那步是唯一能相加的地方。
任何時候你看到程式碼裡出現 sigma_a + sigma_b,那八成是個 bug ——
除非作者真的是刻意在算「最糟情況上界」(ρ = 1),而且註解寫清楚了。
本關所有公式只需要 Cov = 0(不相關),不需要獨立。 這是好消息:條件比你想的弱。
但反過來不成立:Cov = 0 推不出獨立。 03 關給過反例:把點排成一個圓、或排成 V 字形, 共變異數是 0(沒有線性關聯),可是 X 完全決定了 |Y|,兩者顯然不獨立。
什麼時候這個差別會咬你?當你需要的不只是變異數的時候。 算 Var(X+Y) 只要不相關就夠;但要算 P(X + Y > 200)(尾部機率)、 或要主張「X+Y 是常態分布」,那就真的需要獨立(或至少需要聯合分布的完整形狀)—— 那是 機率統計 04 關的事。
你在 ④ 節看到的「把交叉項弄成負的」有一個致命的隱含假設:ρ 是個常數。 它不是。ρ 是從歷史資料估出來的,而它會隨時間變 —— 而且它變大的時機,剛好是你最需要它小的時候。
市場恐慌時大家一起賣所有東西,原本 ρ = 0.2 的兩類資產會一起跌, 實際的 ρ 跳到 0.8 以上。工程上完全一樣:平常互不相干的三個服務, 在下游 DB 掛掉的那一刻同時超時,ρ 瞬間變 1。
所以正確的用法是:拿 ρ 算出的分散效果是平常的好處, 壓力測試一律另外算一次 ρ = 1(也就是「直接相加」那個直覺值)當上界。 直覺答錯的那個 28 ms,其實是壓力情境下的正確答案。
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, 只是 a、b 換成兩個偏差、然後取平均。 2 倍的來歷完全不神秘:ab 和 ba 是兩格, 在矩陣的 2×2 表格裡就是 C12 和 C21 兩個對稱的格子,各出一份力。
意義上它是「兩個東西一起偏離平均的程度」。正的代表同進同退,兩邊的抖動會互相放大; 負的代表一個高的時候另一個低,抖動會互相抵銷。④ 節那條曲線就是它從 +1 走到 −1 的完整效果:σ(X+Y) 從 28 一路掉到 4。
為什麼權重要平方?(a 變 2 倍,那一項就變 4 倍)
因為變異數是平方的量,可以想成正方形的面積(02 關)。 權重 a 拉成 2 倍,抖動的幅度(邊長 aσx)變 2 倍, 面積(a2σx2)就變 4 倍。
交叉項配的是 ab 而不是平方,因為它是「兩個不同邊長圍出來的長方形」—— 一邊 aσx、一邊 bσ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 關)。
什麼情況下我會需要用到它?
只要你把幾個會抖的東西合成一個數字的時候。幾個真的會遇到的場合:
現在你會把兩個會抖的東西加成一個了,而且知道那個「合起來的抖動」怎麼算、 也知道它為什麼可以寫成 wTCw。
但「加起來」是一種壓縮:兩個數字變一個,資訊掉了。 有很多問題你不能壓 —— 你要同時看兩個: 「身高 175 而且體重 55」這種組合常見嗎?「延遲正常但錯誤率飆高」是什麼狀況? 這些問題問的不是 X + Y,是 (X, Y) 這一對出現的機會 —— 那叫二維聯合分布,而 C 在那裡會從「一個公式的零件」變成「一張地圖的形狀」。
下一關就把那張地圖畫出來,順便把 03 關欠的另一筆債 (「Cov = 0 不等於獨立」只給了反例、沒給定義)也還掉。