2017年9月29日 星期五

函數(_fancyDailyEquity):爽歪歪版日權益

在開發交易管理系統的早期,我注意到給策略做評價的 KPI 計算出來的分數會出現負數,而負數的出現自然是被評估的那個策略實在太爛的關係。然而所謂的策略績效表現太爛,通常不是策略訊號本身就衰到爆,卻往往是交易成本(稅、費、滑價)把訊號本身的價差獲利吃乾抹淨所致。也就是我常在講座、課程中提到的:我們手上策略賺不了錢的絕大部分原因,是被賭場抽頭給抽死的。

近期,好友(就是凌波微步大)與我討論到把賠到不行的策略對做這件事(他也有發文講這事)。真的要做的話,我們第一件要做的事情就是先把策略績效中的交易成本因素剔除。

由於我們還打算跟超級爛策略對做(你叫多單,我就下空單),所以最好把策略績效修改成,每做一筆交易就算平出也能拿到獎金,如果在這種條件下,還能做到賠錢,那真無疑是地獄倒楣鬼:一空就漲、一多就跌。因此,我先寫個函數來把原始策略績效改成剔除交易成本還附送獎金,產生負面評估的原始材料。



函數名稱: _fancyDaulyEquity(A, B)。參數A:抓取幾天前的 fancyEquity。參數B:每口交易成本設定。其他就自行看 code 研究吧。
input: DaysAgo(Numeric), costPerContract(Numeric);
var: tradeAmount(0), totalCost(0), totalContracts(0), fancyEquity(0);
array: DailyfancyEquity[](0);




tradeAmount= i_CurrentContracts;

if tradeAmount<>tradeAmount[1] then
  totalContracts= totalContracts + pos(tradeAmount-tradeAmount[1]);

totalCost= totalContracts * costPerContract;
fancyEquity= i_OpenEquity + 2*totalCost;


once array_setmaxindex( DailyfancyEquity, 1 );

if sessionlastbar then begin
  array_setmaxindex( DailyfancyEquity, array_getmaxindex(DailyfancyEquity)+1 ); 
  _arrayShift( DailyfancyEquity );
  DailyfancyEquity[1]= fancyEquity;
end;  



if totalContracts>0 then begin
  
  if DaysAgo=0 or sessionlastbar then
    _fancyDailyEquity= fancyEquity
  else
    _fancyDailyEquity= DailyfancyEquity[DaysAgo];

end;    




我們用個指標畫圖來比較一下 _fancyDailyEquity 與 i_openEquity 的差別。
第一筆交易進場1口,空 8268 收 8269,價差 -200,交易成本每口設 600,所以 i_openEquity = -800,而 _fancyDailyEquity 則是價差 -200,不計交易成本,還送獎金 600,所以 +400。後續以此類推。


經過幾筆交易後... 應該很容易體會到為什麼這個函數會被取名成 fancy 了 ^_^


這只是用來辨識地獄倒楣鬼的起步,用來看出有"對做"價值策略的原始材料,後面還要做不少工作,才能納進交易管理系統。