【未來函數】一個悲傷的故事

有很多剛剛開始炒股的人一定聽說過很多投資策略,稍有計算機背景的,也都會用到一些經典的投資策略,例如「均線策略」,這種偽量化的東西,來進行交易。在一個策略寫好之後,我們經常要進行一個回測,也就是用歷史數據的波動,來形成一個結果,別名「馬後炮」,來檢驗一下這個交易的穩定性。但是有的時候卻出現了回測結果很好,但是最後實踐中就很差,甚至跑不過大盤。

那麼,為什麼回測結果這麼好,但是在實踐過程中卻屌絲的一比,跑不過大盤?

這就是我們今天要說的:未來函數問題。

我們就簡單地舉一個例子,單均線策略下的未來函數問題。

比如現在有一個這樣的策略,需要如下的數據:

1. 每日大盤收盤價。

2. 每30日大盤均線,也就是移動平均值。

3. 一個容差d:也就是說在價格變化的一定程度內,我們不會賣出或者買入或者變動現在的空倉或滿倉持有。

我們的策略是:

1.當大盤收盤價低於(移動平均值-容差)且滿倉,我們就賣出。

2.當大盤收盤價高於(移動平均值+容差)且空倉,我們就買入。

3.其餘任何時刻,保持倉位原狀態不變。

這樣,我們就構造了一個最簡單的均線策略,這個策略額回測圖形,以容差0.02,交易成本千分之三計,是這樣的:

其中,藍線是投資,黃線是同期大盤的走勢。雖然感覺並沒有特別出彩,但是還是相對比較好的,和同期大盤走勢相近,並且止損和盈利的態勢都很不錯。

那麼,這個策略實盤操作會怎麼樣呢?

我敢保證,賠的你褲衩都沒有。

為什麼呢?這就是因為用了一個東西:未來函數。

所謂未來函數,就是在今天用了明天的值去做決策的一種概念,放在實盤操作里,就好像我已經能夠知道明天的收盤價一樣。

那你可能很有疑問:這個策略明明沒有利用明天的數據,都是在用歷史數據去逼近,怎麼能說是用了未來函數呢?

這就引出一個所謂未來函數的特點:隱蔽性。

問題就出在「收盤價」這三個字上。你利用的股票數據是日收盤價,那麼在一天的交易結束之前,你是不能知道當天晚上的價格的。但是,我們的交易策略卻在當天就知道了收盤價,而且果斷的買入,賣出或者持有,這是不科學的。所以,真正「科學」,「實際的」交易策略,應該是在第二天轉換才對,你不可能今天就買入或者賣出,提前知道收盤價的對不對?

如果第二天進行交易,其實問題又來了,第二天反彈的很大,又插到上面去,交易策略由成了買入怎麼辦?

手動cry。

這個時候我們就默默地唱一首歌吧:

(龍的傳人旋律)巨龍巨龍你差兩年,永永遠遠你差兩年~

當然,有人也嘗試過,我可以再股票價格連續低於或者高於兩天以後再買入或者賣出,不就很開心了嗎?

(旋律再起)只要你還用收盤價~其實你還是差兩年~

寫這篇文章是想告訴大家,在聚寬或者其他的一些交易平台看回測的時候,不論結果好不好,一定要看看他是不是用了這樣的未來函數。

當然,解決也不是沒有方法,那就是所謂的「纏論」——多重時間架構的問題。當然解決起來非常麻煩。

另外,當大家百度或者搜索「纏論」的時候,經常會出現濕吻,女上文,貼面舞等等不可描述的辭彙。所以還是去搜多重時間架構下的選股策略吧。這個至少不會出現各種玄學的玩意兒。有些人覺得自己挺有文化,就必須搞一些神神道道的東西,感覺不裝老中醫說話,就說不出來自己的高深了。對於這些人,下圖代表我的心:

=================最後附一下渣代碼==================

由於是一開始學matlab寫的,for循環賦值玩起來沒完沒了,雖然想改一改但是太懶了。

就醬。

%導入數據,聲明變數%

price=xlsread(rawindex.xlsx,2);

date=xlsread(rawindex.xlsx,1);

d=0.02;

c=0.003;

days=30;

l=length(price);

%MA移動平均%

movavg=ones(1,days)/days;

movavgprice30=filter(movavg,1,price);

%定義倉位%

initial=10000;

pos=zeros(l,1);

%收益序列%

Return=zeros(l,1);

%策略%

for i=5:l;

%風格轉換信號%

signalBuy=(price-price*c>=movavgprice30*(1+d));

signalSell=(price-price*c<movavgprice30*(1-d));

end;

%買賣策略%

for i=2:l

%如果買入信號&空倉,買入%

if (signalBuy(i)==1 & pos(i-1)==0)

pos(i)=1;

%賣出信號&多倉,賣出%

elseif (signalSell(i)==1 & pos(i-1)==1)

pos(i)=0;

%其他情況一律不操作%

else pos(i)=pos(i-1);

end

end;

%資金變化情況%

Return(1)=initial;

for i=2:l

if pos(i)==0 & pos(i-1)==0

Return(i)=Return(i-1);

continue;

end

if pos(i)==1 & pos(i-1)==0

Return(i)=Return(i-1)*(1-c);

continue;

end

if pos(i)==1 & pos(i-1)==1

Return(i)=Return(i-1)*price(i)/price(i-1);

continue;

end

if pos(i)==0 & pos(i-1)==1

Return(i)=Return(i-1)*price(i)/price(i-1)*(1-c);

continue;

end

end;

for i=1:l;

tinvest(i)=price(i)*initial/3438;

invest=tinvest;

end;

plot(invest);

hold on;

plot(price);


推薦閱讀:

債券交易員的常見交易策略都有哪些?
你們幾乎已經沒有機會成為一個偉大的投資者——馬克?塞勒爾
一種新型的網格交易法則
風險平價與全天候策略,噱頭?

TAG:金融 | 投资策略 | 股票 |