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

2022/02/01閱讀時間約 10 分鐘
承續前文所述,在小樣本數量限制下,迅速偵測到異常值,然後實施突破策略,尤有甚者,可以在已知的顯著水準值之下,預先得知臨界值,從而反推突破價格,進而達到當根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
Piemann
Piemann 只是一位中年大叔 !
留言0
查看全部
發表第一個留言支持創作者!