【未來函數】一個悲傷的故事
那麼,為什麼回測結果這麼好,但是在實踐過程中卻屌絲的一比,跑不過大盤?
這就是我們今天要說的:未來函數問題。
我們就簡單地舉一個例子,單均線策略下的未來函數問題。
比如現在有一個這樣的策略,需要如下的數據:
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);
推薦閱讀:
※債券交易員的常見交易策略都有哪些?
※你們幾乎已經沒有機會成為一個偉大的投資者——馬克?塞勒爾
※一種新型的網格交易法則
※風險平價與全天候策略,噱頭?