每次回測的時候,大家一定會有疑問,雖然已經寫了程式交易的選股的條件,但實際上到底是怎麼運作的?這篇文章會介紹這個程式交易回測的方式。這篇比較數學一點,但用這種方法表示會比較明確,有線性代數的基礎就夠了。
首先我們先假設營業日,從1到nd天,代表所有回測的天數:
d = 1, …, nd
另外還有一群股票,是我們可能買入的對象
s = 1, …, ns
另外,而選股條件(constraints)叫做
c(d, s) ∈ {0, 1}
假如某日 d ,我們發現 s 股票符合條件,那我們可以說 c(d, s) = 1,假如不符合條件,就是 c(d, s) = 0 為了方便,我們用一個向量來表示第 d 天每支股票是否符合條件:
cd = [c(d, 1), …, c(d, ns)]T
然而我們只希望每 n 天換一次手上的持股,不要每天都換,不然會花太多手續費,所以我們定義一個過 n 天才檢查一次股票是否符合條件:
cd = c⌊(d−1)/n⌋n+1
於是,我們在 d 天晚上,用 cd 來決定明天如何買股:
其中,hd+1 代表明天每支股票要分多少錢,hd∗T 代表今晚持股(單位為一張),而 m 為帳戶資金 pd 代表收盤價乘以1000。其實它只是看起來醜了點,概念很簡單,計算所有的資產,並且將資產平均分配給符合條件的股票。 以上的持股方式,就是一種完美分散的概念,是美好的想像,通常是blog中回測權益曲線的**藍線**,但現實生活中,資產不可能分散得如此完美,所以還必須算出可以買幾張股票:
這邊有點要注意,hd+1* 的單位是張數,而原本的 hd+1 的單位是投資金額。乘以 1.1 是為了在開盤時用漲停板買入。然而這條公式每天都會計算,所以在歷史回測中,每天的張數是浮動的,也就是說,某天我買了6張某股,隔天我可能會變成5張、或7張某股,都是有可能的。
考慮了張數的,更貼近真實情況,通常是blog中回測權益曲線的紅線。
目前所知道的缺點
- 長線還算堪用,但短線上這種直接平分資產的方式,手續費還是太高了,到底要怎麼降低手續費呢?有沒有辦法不要單純平均分散?可以做到智慧型的平均分散?
- 這個方法並沒有資產利用最大化(因為無條件捨去法),有沒有讓資產最大化、又可以考慮手續費的選股方法呢?