跟大家介紹過貝氏理論後,我們可以拿過去的K棒當樣本,用歷史資料來計算出,當某些特徵出現後,股價上漲的機率有多大? 之前跟大家介紹的是符合單一特徵時,上漲機率的算法,今天來介紹有多個策略時,怎麼計算不同排列組合的上漲機率,然後找出在什麼情況下,勝率最高。
自從踏入股市之後,大家開始學到各種的交易知識,然後學會了一個又一個的 交易策略,例如學會用移動平均線,學會用MACD,DMI,MTM,我們會試著把這些學會的東西都放到交易的腳本中,但用那一個指標比較好呢? 有人用KD,有人用MACD,有的人用波浪理論,常常因為用的方法不同,造成結果不同,而起爭議。 於是,很多人開始試著同時用幾個指標一起來作決策。
最簡單的方法,就是用condition1,condition2,condition3……來代表各個技術指標的多空情況,然後再透過and 跟 or 來串連這些條件。 或是像用計分卡的方式來處理,符合一個條件算一分,超過多少分訂為買進訊號,我之前跟大家介紹的多空判斷分數就是這麼算出來了。這些方法的麻煩就是,不知道那一個最準,最後往往必須靠人的草根判斷來決定。
應用上一次跟大家介紹的貝氏理論,我們就可以算出各種條件不同排列組合的勝率,然後找出勝率最高的條件組合方式。
舉個例子,我們想透過三個條件來判斷隔天的加權指數能不能收紅(close>open),他們的條件可能性如下圖
在這個表裡1代表符合,0代表不符合
透過回測的計算,我們可以算出過去N根BAR裡頭,這八種狀況發生的機率各為多少%
接下來我們想知道的是,這三個條件要全符合上漲的機率高,還是符合那三個的其中兩個上漲的機率高?
所以我們想要計算機率的組合選項是
- 外資買超且上漲家數夠多且漲停家數增加
- 外資買超且上漲家數夠多
- 外資買超且漲停家數增加
- 上漲家數夠多且漲停家數增加
然後我們必須算出那一種方式隔天收紅的機率最高,算法跟昨天介紹的貝氏理論算法一樣
我寫的腳本如下:
input:n(500,"樣本數"); settotalbar(n); condition1=false; condition2=false; condition3=false; condition4=false; value1=GetField("外資買賣超金額");//單位元 value2=GetField("漲停家數","D"); value3=GetField("上漲家數","D"); variable:c1(0),c2(0),c3(0),c4(0),c5(0),c6(0),c7(0),c8(0),c9(0); variable:s1(0),s2(0),s3(0),p1(0),p2(0),p3(0),p4(0); variable:v1(0),v2(0),v3(0),v4(0); if value1[1]>1000000000//外資買超十億 then condition1=true; if value2[1]>value2[2] and value2[1]>10 then condition2=true; //漲停家數超過十家且在增加中 if value3[1]>450 then condition3=true; //上漲家數夠多 if close>open then condition4=true;//收紅 if condition1 and condition2 and condition3 then c1=c1+1; if condition1 and condition2 then c2=c2+1; if condition1 and condition3 then c3=c3+1; if condition2 and condition3 then c4=c4+1; if condition4 then c5=c5+1; //計算狀況一的勝率 if condition1 and condition2 and condition3 and condition4 then p1=p1+1; s1=c1/n;//三種全符合的機率 s2=c5/n;//收紅的機率 s3=p1/n;//三種全符合且上漲的機率 if s1<>0 then v1=s3*s2/s1;//狀況一的勝率 //計算狀況二的勝率 if condition1 and condition2 and condition4 then p2=p2+1; var:d1(0),d2(0),d3(0); d1=c2/n;//前兩種符合的機率 d2=c5/n;//收紅的機率 d3=p2/n;//前兩種符合且收紅的機率 if d1<>0 then v2=d3*d2/d1;//狀況二的勝率 //計算狀況三的勝率 if condition1 and condition3 and condition4 then p3=p3+1; var:e1(0),e2(0),e3(0); e1=c3/n; e2=c5/n; e3=p3/n; if e1<>0 then v3=e3*e2/e1; //計算狀況四的勝率 if condition2 and condition3 and condition4 then p4=p4+1; var:f1(0),f2(0),f3(0); f1=c4/n; f2=c5/n; f3=p4/n; if f1<>0 then v4=f3*f2/f1; switch maxlist(v1,v2,v3,v4) begin case v1: if condition1 and condition2 and condition3 then ret=1; case v2: if condition1 and condition2 then ret=1; case v3: if condition1 and condition3 then ret=1; case v4: if condition2 and condition3 then ret=1; end;
透過類似的寫法,就可以把不同的策略放進來,然後先算出那一個策略跟那一個策略同時觸發時勝率最大,再用這個組合來當成訊 號觸發的條件,這麼一來,就可以讓電腦根據歷史資料來自動計算那一種情況勝率最高,這樣我們只要專注在策略的開發上,未來只要把不同的策略觸發條件用condition1 , condition2…………..等來表示,就可以讓電腦來決定,那幾個策略同時觸發時勝率最高了。
我這裡舉的例子,只用了三個策略,如果要同時把更多策略放進去算,那程式就要寫更長,不過還好寫法都一樣,就是把各種可能的排列組合拿去算機率,再用貝氏理論去估算符合特定排列組合時,收紅的機率有多大? 然後再找出勝率最高的組合方式,讓電腦在這種組合方式條件觸發時通知我們。
使用這個方法,我們只要好好寫策略,那幾個策略湊在一起很管用,就讓電腦來幫我們計算,這樣就可以達到策略自動組合決策的功能了。