2022-01-31|閱讀時間 ‧ 約 6 分鐘

兩兩距離平方和統計量 - 模擬與交易.6

迅速地在小樣本中判斷是否有異常值發生,然後讓下列的Multicharts程式碼發出訊號,一值是開發者重點
If Condition1 then Buy next bar at Highest(High,8) stop;
相較於標準差的計算方式,每個價格數據與平均數的距離取平方,然後再取和,這是廣為人知的波動度評估方法。本文介紹另外一種概念,利用標準常態分配亂數來模擬,自製一張查表值,模擬價格數據之間,兩兩的距離差異取平方,然後給予加總,如此便有距離的平方加總和與標準差之間的比例,透過該比例的大小排序,便可判斷價格數據是否來到波動度放大的階段,進而實施突破進場策略 本文以8筆資料為例,運用兩兩彼此間的距離平方和,作為判斷依據,數據加工模擬程序與程式碼依序陳列如下 1. 數據資料標準化,意即 x=Average(High,8); y=StdDev(High,8); z[1]=(High[0]-x)/y; z[2]=(High[1]-x)/y; ... z[8]=(High[7]-x)/y; 2. u=Power(z[1]-z[2],2)+Power(z[1]-z[3],2)+...+Power(z[6]-z[8],2)+Power(z[7]-z[8],2); 3. 如果u超過顯著水準5%的門檻值,那麼就運作過高就突破買進的策略 4. u的顯著水準值(十萬次模擬約介於112~113之間,模擬的收斂效率尚可)如何事先求取 ? 5. 事實上u的值,可以透過MC的參數最佳化過程給予取得,不過更為科學的方式是透過常態分配亂數來模擬,以界定合理的數值範圍
本文利用Excel VBA執行下列模擬程序以產生查表值 a. 自製8筆N(0,1)標準常態分配亂數 b. 取其兩兩距離差異平方和 c. 針對步驟a.、b. 重覆1萬次,每次模擬後的數字給予記錄在陣列之中 d. 對1萬次的模擬數字,進行大小排序,取其前9501大者即為5%水準 e. 在針對其他的資料筆數做相關的模擬,例如資料筆數N=8、N=9、...N=30,如此就能事前掌握相關的門檻值
Excel VBA程式碼參考如下 Const FixConst As Variant = 0.398942284 '1/sqr(2*3.1415926) Public Sub avgRank() '模擬常態分配隨機變數的兩兩距離平方和統計量期望值 Dim seed, seedCalc, nextSeed, NorValue As Variant Dim ArrNorRandom(1 To 8) As Variant Dim iith, testNum As Long Dim x(1 To 100000), ii, jj, xTemple As Variant
For testNum = 1 To 100000 iith = 1 Do seed = Int(Rnd() * 1000000) seedCalc = ((seed - 500000) * 0.000001) * 8 '模擬4個標準差範圍的 N(0,1) 常態分配變數 NorValue = Format(FixConst * Exp(-0.5 * seedCalc * seedCalc), "0.000000") '常態分配機率函數的數值 nextSeed = 0 nextSeed = Int(0.001 * (seed * seed)) nextSeed = Format(0.000001 * nextSeed - Int(0.000001 * nextSeed), "0.000000") nextSeed = Int(1000000 * nextSeed) nextSeed = Int(((23 + iith * 0.01) * nextSeed + 1011 * iith)) Mod 999999 nextSeed = Format(nextSeed * 0.00001 * FixConst, "0.000000") 'Debug.Print seedCalc, NorValue, nextSeed If (nextSeed) NorValue Then ArrNorRandom(iith) = seedCalc 'Debug.Print ArrNorRandom(iith) iith = iith + 1 End If Loop While iith = 8 'Debug.Print testNum x(testNum) = 0 For ii = 1 To 7 For jj = 2 To 8 If jj ii Then xTemple = ArrNorRandom(ii) - ArrNorRandom(jj) x(testNum) = x(testNum) + xTemple * xTemple End If 'If jj ii Then Next 'jj Next 'ii Next 'For testNum = 1 To 100000 '泡沫排序法 Dim swapTemp As Variant For jj = 0 To 4999 For ii = 1 To 100000 - 1 - jj If x(ii) x(ii + 1) Then swapTemp = "" swapTemp = x(ii + 1) x(ii + 1) = x(ii) x(ii) = swapTemp End If Next ii Next jj Debug.Print x(95001) '十萬次模擬,取5%顯著水準 '112.042587003904 '112.342800089536 '112.1389010928 '112.23079087968 End Sub
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.