基礎回測框架介紹

每次回測的時候,大家一定會有疑問,雖然已經寫了程式交易的選股的條件,但實際上到底是怎麼運作的?這篇文章會介紹這個程式交易回測的方式。這篇比較數學一點,但用這種方法表示會比較明確,有線性代數的基礎就夠了。

首先我們先假設營業日,從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)/nn+1

於是,我們在 d 天晚上,用 cd 來決定明天如何買股:

Screenshot 2020 07 09 at 15.31.58

其中,hd+1​​​​ 代表明天每支股票要分多少錢,hdT​​ 代表今晚持股(單位為一張),而 m 為帳戶資金 pd 代表收盤價乘以1000。其實它只是看起來醜了點,概念很簡單,計算所有的資產,並且將資產平均分配給符合條件的股票。 以上的持股方式,就是一種完美分散的概念,是美好的想像,通常是blog中回測權益曲線的**藍線**,但現實生活中,資產不可能分散得如此完美,所以還必須算出可以買幾張股票:

Screenshot 2020 07 09 at 15.37.13

這邊有點要注意,hd+1*​​ 的單位是張數,而原本的 hd+1​​ 的單位是投資金額。乘以 1.1 是為了在開盤時用漲停板買入。然而這條公式每天都會計算,所以在歷史回測中,每天的張數是浮動的,也就是說,某天我買了6張某股,隔天我可能會變成5張、或7張某股,都是有可能的。

考慮了張數的,更貼近真實情況,通常是blog中回測權益曲線的紅線

目前所知道的缺點

  1. 長線還算堪用,但短線上這種直接平分資產的方式,手續費還是太高了,到底要怎麼降低手續費呢?有沒有辦法不要單純平均分散?可以做到智慧型的平均分散?
  2. 這個方法並沒有資產利用最大化(因為無條件捨去法),有沒有讓資產最大化、又可以考慮手續費的選股方法呢?

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!