在開發交易管理系統的早期,我注意到給策略做評價的 KPI 計算出來的分數會出現負數,而負數的出現自然是被評估的那個策略實在太爛的關係。然而所謂的策略績效表現太爛,通常不是策略訊號本身就衰到爆,卻往往是交易成本(稅、費、滑價)把訊號本身的價差獲利吃乾抹淨所致。也就是我常在講座、課程中提到的:我們手上策略賺不了錢的絕大部分原因,是被賭場抽頭給抽死的。
近期,好友(就是凌波微步大)與我討論到把賠到不行的策略對做這件事(他也有發文講這事)。真的要做的話,我們第一件要做的事情就是先把策略績效中的交易成本因素剔除。
由於我們還打算跟超級爛策略對做(你叫多單,我就下空單),所以最好把策略績效修改成,每做一筆交易就算平出也能拿到獎金,如果在這種條件下,還能做到賠錢,那真無疑是地獄倒楣鬼:一空就漲、一多就跌。因此,我先寫個函數來把原始策略績效改成剔除交易成本還附送獎金,產生負面評估的原始材料。
函數名稱: _fancyDaulyEquity(A, B)。參數A:抓取幾天前的 fancyEquity。參數B:每口交易成本設定。其他就自行看 code 研究吧。
由於我們還打算跟超級爛策略對做(你叫多單,我就下空單),所以最好把策略績效修改成,每做一筆交易就算平出也能拿到獎金,如果在這種條件下,還能做到賠錢,那真無疑是地獄倒楣鬼:一空就漲、一多就跌。因此,我先寫個函數來把原始策略績效改成剔除交易成本還附送獎金,產生負面評估的原始材料。
函數名稱: _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 的差別。