2022-02-01|閱讀時間 ‧ 約 8 分鐘

全距統計量 - 模擬與交易.7

承續前文所述,在小樣本數量限制下,迅速偵測到異常值,然後實施突破策略,尤有甚者,可以在已知的顯著水準值之下,預先得知臨界值,從而反推突破價格,進而達到當根K棒進場的即時效果! 本文利用Max-Min這個全距的概念,來衡量波動度大小,其大小的判斷依據為透過N(0,1)標準常態分配亂數模擬,模擬程序與Excel VBA程式碼分述如下
概念 : 1. 產生標準常態分配亂數、2. 一次性抓取N筆資料、3. 然後取最大值、最小值,然後兩數相減,得到全距、4. 重複步驟1~3、10萬次、5. 製作查表值
明顯地,執行下列程式碼後,可以獲得Max-Min超過五的標準差的大小,即可判斷異常值出現,進而可以執行 Buy next bar at Lowest(High,Len)+5*StdDev(High,Len) stop; SellShort next bar at Highest(Low,Len)-5*StdDev(Low,Len) stop;
Excel VBA 參考程式碼如下 '宣告全域變數,提供模擬結果輸出 Public Const ConstValue = 0.398942283804044 Public Const NumberSimple = 4000 Public Const Pvalue = 100 Public Function RangeTest(ByVal NumValue As Variant) Dim PseudoRnd, PseudoValue, NorValue As Variant Dim ii, kk As Variant Dim tempMaxValue, tempMinValue As Variant Dim RangeValue(1 To NumberSimple) As Variant Dim x(1 To 100) As Variant
For kk = 1 To NumberSimple '常態分配亂數產生器 'Rnd函數的傳回值小於 1,但大於或等於零 '標準常態分配固定參數 1/sqr(2*3.1415926) = 0.398942283804044 '回傳四個標準差範圍的亂數 ii = 1 Do While ii = NumValue PseudoRnd = (Rnd(1) * 8 - 4) PseudoValue = Rnd(1) NorValue = ConstValue * Exp(-0.5 * PseudoRnd * PseudoRnd) x(ii) = 0 If NorValue PseudoValue Then x(ii) = Round(PseudoRnd, 8) 'If x(ii) 2.33 Then jj = jj + 1 '常態分配簡易比例偵查 ii = ii + 1 End If Loop tempMaxValue = -6 tempMinValue = 6 For ii = 1 To NumValue If x(ii) tempMaxValue Then tempMaxValue = x(ii) If x(ii) tempMinValue Then tempMinValue = x(ii) Next ii 'For ii = 1 To NumValue RangeValue(kk) = tempMaxValue - tempMinValue 'Debug.Print kk, ":", RangeValue(kk) Next kk 'For kk = 1 To NumberSimple 'Debug.Print "********************************************************" '*********************************************************************
Dim jj As Variant '雙尾95%信賴區間 'Find the 10000-250th Biggest '計算資料數據內的第n大數值,氣泡排序法 Bubble Sort Dim tempValue As Variant For jj = 1 To Pvalue For ii = 1 To NumberSimple - jj 'SWAP If RangeValue(ii) RangeValue(ii + 1) Then tempValue = "" tempValue = RangeValue(ii + 1) RangeValue(ii + 1) = RangeValue(ii) RangeValue(ii) = tempValue End If 'If RangeValue(ii) RangeValue(ii + 1) Then Next ii 'For ii = 1 To NumberSimple - jj Next jj 'For jj = 1 To Pvalue Debug.Print RangeValue(NumberSimple - Pvalue + 1) 'Debug.Print RangeValue(NumberSimple) End Function
Public Sub Table() '清空即時運算區,本段為主要的執行程式碼 'Application.SendKeys "^g ^a {DEL}" Debug.Print "Num=34", RangeTest(34) Debug.Print "****************************************" Debug.Print "Num=30", RangeTest(30) Debug.Print "****************************************" Debug.Print "Num=25", RangeTest(25) Debug.Print "****************************************" Debug.Print "Num=21", RangeTest(21) Debug.Print "****************************************" Debug.Print "Num=20", RangeTest(20) Debug.Print "****************************************" Debug.Print "Num=15", RangeTest(15) Debug.Print "****************************************" Debug.Print "Num=13", RangeTest(13) Debug.Print "****************************************" Debug.Print "Num=12", RangeTest(12) Debug.Print "****************************************" Debug.Print "Num=11", RangeTest(11) Debug.Print "****************************************" Debug.Print "Num=10", RangeTest(10) Debug.Print "****************************************" Debug.Print "Num=9", RangeTest(9) Debug.Print "****************************************" Debug.Print "Num=8", RangeTest(8) Debug.Print "****************************************" Debug.Print "Num=7", RangeTest(7) Debug.Print "****************************************" Debug.Print "Num=6", RangeTest(6) Debug.Print "****************************************" Debug.Print "Num=5", RangeTest(5) Debug.Print "****************************************" Debug.Print "Num=4", RangeTest(4) Debug.Print "****************************************" End Sub
分享至
成為作者繼續創作的動力吧!
Piemann 只是一位中年大叔 !
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

發表回應

成為會員 後即可發表留言