寫出自己的多條件機器人決策系統

By | 2017-05-10

跟大家介紹過貝氏理論後,我們可以拿過去的K棒當樣本,用歷史資料來計算出,當某些特徵出現後,股價上漲的機率有多大?  之前跟大家介紹的是符合單一特徵時,上漲機率的算法,今天來介紹有多個策略時,怎麼計算不同排列組合的上漲機率,然後找出在什麼情況下,勝率最高。

自從踏入股市之後,大家開始學到各種的交易知識,然後學會了一個又一個的 交易策略,例如學會用移動平均線,學會用MACD,DMI,MTM,我們會試著把這些學會的東西都放到交易的腳本中,但用那一個指標比較好呢? 有人用KD,有人用MACD,有的人用波浪理論,常常因為用的方法不同,造成結果不同,而起爭議。 於是,很多人開始試著同時用幾個指標一起來作決策。

瀨尿蝦

 

最簡單的方法,就是用condition1,condition2,condition3……來代表各個技術指標的多空情況,然後再透過and 跟 or  來串連這些條件。 或是像用計分卡的方式來處理,符合一個條件算一分,超過多少分訂為買進訊號,我之前跟大家介紹的多空判斷分數就是這麼算出來了。這些方法的麻煩就是,不知道那一個最準,最後往往必須靠人的草根判斷來決定。

應用上一次跟大家介紹的貝氏理論,我們就可以算出各種條件不同排列組合的勝率,然後找出勝率最高的條件組合方式。

舉個例子,我們想透過三個條件來判斷隔天的加權指數能不能收紅(close>open),他們的條件可能性如下圖

2017051001

在這個表裡1代表符合,0代表不符合

透過回測的計算,我們可以算出過去N根BAR裡頭,這八種狀況發生的機率各為多少%

接下來我們想知道的是,這三個條件要全符合上漲的機率高,還是符合那三個的其中兩個上漲的機率高?

所以我們想要計算機率的組合選項是

  1. 外資買超且上漲家數夠多且漲停家數增加
  2. 外資買超且上漲家數夠多
  3. 外資買超且漲停家數增加
  4. 上漲家數夠多且漲停家數增加

然後我們必須算出那一種方式隔天收紅的機率最高,算法跟昨天介紹的貝氏理論算法一樣

我寫的腳本如下:

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…………..等來表示,就可以讓電腦來決定,那幾個策略同時觸發時勝率最高了。

我這裡舉的例子,只用了三個策略,如果要同時把更多策略放進去算,那程式就要寫更長,不過還好寫法都一樣,就是把各種可能的排列組合拿去算機率,再用貝氏理論去估算符合特定排列組合時,收紅的機率有多大? 然後再找出勝率最高的組合方式,讓電腦在這種組合方式條件觸發時通知我們。

 

使用這個方法,我們只要好好寫策略,那幾個策略湊在一起很管用,就讓電腦來幫我們計算,這樣就可以達到策略自動組合決策的功能了。