回測框架介紹

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

首先我們先假設營業日,從1到ndn^{d}天,代表所有回測的天數: d=1,...,ndd=1,...,n^{d}

另外還有一群股票,是我們可能買入的對象

s=1,...,nss=1,...,n^{s}

另外,而選股條件(constraints)叫做

c(d,s){0,1}c(d,s)\in\{0,1\}

假如某日 dd ,我們發現 ss 股票符合條件,那我們可以說c(d,s)=1c(d,s)=1,假如不符合條件,就是c(d,s)=0c(d,s)=0 為了方便,我們用一個向量來表示第 dd 天每支股票是否符合條件:

cd=[c(d,1),...,c(d,ns)]T\bold{c}_{d}=[c(d, 1),...,c(d, n^s)]^T

然而我們只希望每 nn 天換一次手上的持股,不要每天都換,不然會花太多手續費,所以我們定義一個過 nn 天才檢查一次股票是否符合條件: cd=c(d1)/nn+1\bold{c}_{d}^{*} = \bold{c}_{\left\lfloor (d-1)/n\right\rfloor n+1}

於是,我們在dd 天晚上,用 cd\bold{c}_{d}^{*} 來決定明天如何買股: hd+1=(m+hdTpdsum(cd)cd)T\bold{h}_{d+1} = \left(\frac{m+\bold{h}_{d}^{*T}\bold{p}_{d}}{\text{sum}(\bold{c}_{d}^{*})}\bold{c}_{d}^{*}\right)^T

其中,hd+1\bold{h}_{d+1} 代表明天每支股票要分多少錢, hdT\bold{h}_{d}^{*T} 代表今晚持股(單位為一張),而 mm 為帳戶資金 pd\bold{p}_{d} 代表收盤價乘以1000。其實它只是看起來醜了點,概念很簡單,計算所有的資產,並且將資產平均分配給符合條件的股票。 以上的持股方式,就是一種完美分散的概念,是美好的想像,通常是blog中回測權益曲線的**藍線**,但現實生活中,資產不可能分散得如此完美,所以還必須算出可以買幾張股票: hd+1=[hd+1,11.1pd,1,...,hd+1,ns1.1pd,ns]T\bold{h}_{d+1}^{*}=\left[\left\lfloor \frac{h_{d+1,1}}{1.1p_{d,1}}\right\rfloor ,...,\left\lfloor \frac{h_{d+1,n^{s}}}{1.1p_{d,n^{s}}}\right\rfloor \right]^{T}

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

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

目前所知道的缺點

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

假如覺得文章不錯,那更不能錯過我們的影音課程喔!
或我們按個 鼓勵一下吧!