電子信箱 service [at] bituzi.com
幣圖誌首頁 facebook粉絲團 google plus google plus


程式獵人知識庫-淺談資料對程式的影響


不知道大家有沒有這樣的經驗,
把網路上的程式碼貼下來放在自己的程式中去跑,
結果發現跟網路上的績效會有差異,
怎麼會這樣呢?一定覺得非常納悶,
難道見鬼了,不過鬼月已經過了,好兄弟都回家去了。
到底為什麼會這樣呢?我們就來探討一下原因。



請問?誰的資料最準確?
答案是:期交所盤後公布的資料。
那盤中呢?
在盤中沒有人的資料會是最準確的,
每台電腦接收期交所資料源的方式不同,
網路速度不同,接收時間不完全一致,
所以每個人接收到的資料當然不會完全相同,
那相同的程式在不同人的電腦跑出來的績效報表也會一樣嗎?

獵人有兩台電腦在接收資料,
一台是用DDE的形式去接收的,
另外一台是下單軟體直接餵資料給GlobalServer。
然後獵人每天都會觀察兩台電腦中相同程式在盤中執行的情況,
結果發現,有時候進場點位相同,有時候會相差一兩點。
再者,當兩台電腦時間相差個幾秒鐘時,
可能剛好價格快要打到某個程式的進場點,
電腦時間較快的程式因為還沒碰到價格,到整點時就取消單子了,
結果另一台時間較慢的電腦,剛好很衰,
也可能是好運啦,就碰到價格進場了。
問題就發生了,明明兩台電腦的程式一樣,
結果一台程式沒進場,另一台程式進場了。
所以我們就發現到,資料對程式當然有很大的影響,
因為你的程式是用資料裡面幾百根、幾千根的K棒在做運算,
就像蝴蝶效應一樣,你改變一小個點,足以讓整個空間都改變了。
舉例來說,可能會發生一種情況就是,
當你這次的進場點或出場點沒出現,
或是進出場早了一根或是晚了一根K棒,
接下來你每個進出場點可能就不太相同了,
所以程式跑出來的報表就會有差異。


接下來我們用之前的改良過的移動平均線指標程式
來看看進場點數對策略的影響。

回測時間,SHOW TIME!

回測目標:進場點數差異對獲利的影響

回測標的:用台指15分K線作留倉交易。

回測成本設定:費用來回設定為1000元。

回測時間:從今天往回3000天。

進場方式
我們使用均線策略來作測試,進場方式如下-
(1)當短期(4根K棒)移動平均線由下往上突破長期(18根K棒)移動平均線時,
啟動買進訊號,當價格向上突破前3根K棒高點時進場做多。
當短期(4根K棒)移動平均線由上往下突破長期(18根K棒)移動平均線時,
啟動賣出訊號,當價格往下突破前3根K棒低點時進場做空。
(2) 當短期(4根K棒)移動平均線由下往上突破中期(9根K棒)移動平均線時,
以及短期(4根K棒)移動平均線由下往上突破長期(18根K棒)移動平均線時,
啟動買進訊號,當價格向上突破前3根K棒高點時進場做多。
當短期(4根K棒)移動平均線由上往下突破中期(9根K棒)移動平均線時,
以及短期(4根K棒)移動平均線由上往下突破長期(18根K棒)移動平均線時,
啟動賣出訊號,當價格往下突破前3根K棒低點時進場做空。

測試方式:因為我們是用收盤價來計算均線,為了要測試點數對績效的影響,我們把計算用的收盤價每隔60根K棒加減點數再去計算移動平均線,點數從-2點到+2點。

出場方式:(1)設定停損點數為80點。
(2)到期當天出場,等到下次訊號出現時在進場,此方式可以避免到期換月問題。

我們將報表整理如下:



上圖為五種情況的歷年績效表



上圖為五種情況的歷年績效直方圖



上圖為五種情況的其他重要數據表



上圖為五種情況的今年各月績效表



上圖為五種情況的今年各月績效直方圖

我們可以發現,雖然只有改變其中一點點K棒的點數,
對實際上的績效還是有些許改變,
雖然大趨勢是不會有什麼太大差異的,
不過勝率跟總獲利還是有點差異。
所以我們只改變這麼一點點的地方都會有些影響,
更不用說在兩台不同電腦所接收的資料跑出來的績效,
也許就不是1、2點的差異。
當然,你K棒的時間間隔越小,差異性也越大,
像日K跟1分K,日K的開盤價跟收盤價可能就不太受影響,
但是1分K影響可能就會很嚴重,也許你是紅K棒,
但是他的是十字K棒。

因此這裡衍生出一個問題,
因為收盤價跟開盤價跟電腦接收資料的時間點有關,
而最高價跟最低點是一個相對的極端點,跟時間關係較小,
當我們的程式中,使用了過多的收盤價跟開盤價做計算的話,
其績效可能就會很不穩定,在不同的電腦差異性就會越大,
因此我們在寫程式的時候,最好可以避免使用太多的close跟open,
尤其是當沖的程式,點數的差異對當沖的影響一定比留倉大,
改天有機會我們再來測試看看點數的差異對當沖程式的影響,
在來分析看看差異性多大。

最後一樣再把程式碼附上給大家做參考,
var : TodayHigh(0),TodayLow(99999),s(0),u(0),BuyFlag(false),SellFlag(false),newclose(0),aa(0);

if date <> date[1] then begin
TodayHigh = 0;
TodayLow = 99999;
{ BuyFlag = False;
SellFlag = False; 獵人在之前的文章這邊不小心多打了這兩個條件,
不過大家可以思考一下這樣會有什麼差別。
當然省略後,次數會多很多,績效也變差,不像之前那麼好。
}
TodayHigh=opend(0)+avgtruerange(6);
TodayLow =opend(0)-avgtruerange(6);
end;

if barnumber=1 then aa=0;

newclose=close;

if barnumber=60*(1+aa) then begin
aa=aa+1;
newclose=close-2;
end;

if AverageFC(newclose,4) cross over AverageFC(newclose,9) then begin
s=1;
u=0;
end;

if AverageFC(newclose,4) cross under AverageFC(newclose,9) then begin
s=0;
u=1;
end;

if s=1 and AverageFC(newclose,4) cross over AverageFC(newclose,18) then begin
BuyFlag=true;
SellFlag=false;
end;

if u=1 and AverageFC(newclose,4) cross under AverageFC(newclose,18) then begin
SellFlag=true;
BuyFlag=false;
end;

if time<1330 and buyflag=true and high > Todayhigh then buy next bar at highest(high,3)+1 stop;

if time<1330 and sellflag=true and low < Todaylow then sell next bar at lowest(low,3)-1 stop;

if marketposition>0 then exitlong next bar at entryprice-80 stop;

if marketposition<0 then exitshort next bar at entryprice+80 stop;

Condition1=(dayofweek(date)=3 and dayofmonth(date) > 14 and 22 > dayofmonth(date)) or date=1040127 or date=1070226 or date=1100617 or date=1100222;
if condition1=true then begin
if time>1314 then begin
exitlong on close;
exitshort on close;
end;
end;


上面的newclose就是我們改變過後的收盤價格。

0 意見: