alexliou 發表於 16-4-5 09:46

用自訂標準做最佳化排序

在作策略比較或策略選擇時, 先要決定績效衡量標準(Criteria)
這標準可能是淨利, MDD, 淨利/MDD, Sharpe Ratio,.....
Multicharts 在作最佳化時, 內建的排序基準大多只考慮獲利或風險單一層面, 少有獲利與風險同時考量的Criteria.
Profit Factor 勉強算是有同時考慮獲利與風險, 但是仍不夠周延.
且大多數交易人愛用的淨利/MDD與 Sharpe Ratio都不在其中

如果要用內建Criteria以外的績效指標來衡量績效, 有兩個方法:
1. 利用最佳化功能中的 Custom Criteria

按下Edit之後, 可以用sript language 輸入你想要使用 Criteria
裡面有個現成的淨利/MDD, 只要點取 Custom Criteria 就生效了
只要把Sort的主Key設定為Custom Criteria,
最佳化報表就會把不同參數的淨利/MDD顯示出來, 並將結果依淨利/MDD的高低來排序


但Custom Critria 的限制是: 在script language中, user 只能取用策略的整體績效數據來做運算,
個別K棒裡的數據則無法取得, 如此一來, Sharpe Ratio等需要每日報酬的Criteria 就無法使用這個方法了



alexliou 發表於 16-4-5 10:04

2. 利用 SetCustomFitnessValue 這個指令
在最佳化報表裡有一欄叫Custom Fitness Value,
這個變數可以在Study中被取用到.
MC 內建有一個 !optimize by Sharpe ratio! 的Signal,
就利用到SetCustomFitnessValue 這個指令來達成以Sharpe Ratio來對策略作排序.
這個Signal該如何搭配你的主Singal服用呢?
只要在策略設定時, 將 !optimize by Sharpe ratio! 訊號加入即可

如果要使用月報酬率來計算Sharpe Ratio, input設0.
如果要使用日報酬率來計算Sharpe Ratio, input設1.

如此一來, 最佳化報表中custom fitness value 就會顯示出sharpe value的值了




alexliou 發表於 16-4-5 11:17

本帖最後由 alexliou 於 16-4-5 13:04 編輯

自訂Sharpe Ratio函數
但內建的Sharpe Ratio函數(其實它挺複雜的)有幾個缺點:
1.沒有年化, 所以用月報酬和使用日報酬無法同時比較
2. 採取複利的概念, 對於永遠是一口單的策略不是很適用
3. 它以日曆日(or月)來計算報酬率, 而非交易日
4. 策略未持倉的日數, 不納入統計報酬率平均數與標準差的統計
第4點對永遠有單的策略有利, 因為空手時間多的策略, 通常損益的波動度較低,
如空手的交易日不列入計算標準差, 會使得分母變小,標準差相對變大.

所以我自己寫了一個MySharpeRatio函數,
它以交易日的日損益為基礎, 不考慮 Initial Capital
計算Sharpe Ratio = (日損益平均數 / 日損益標準差)* SQRT(252)
這個函數可以:
a) 在圖形上方顯示Sharpe Ratio的值

b) 可以選擇是否要將每日損益輸出到檔案供進一步分析
c) 會自動判斷是否在最佳化過程中, 在最佳化時, 則只設定Custom Fitness Value,
而不作上述兩個動作以節省時間與避免無謂輸出


該如何服用這個函數呢?
只要在你的主信號最後一行加入
Z_MySharpeRatio(lastBaronChart_s, true, "D:\Trading\DailyReturn.csv");
(請先確定有D:\Trading 此一目錄)

如不要把每日損益輸出至檔案, 就改成
Z_MySharpeRatio(lastBaronChart_s, false, "D:\Trading\DailyReturn.csv");



kk20037 發表於 16-10-9 20:10

alexliou 發表於 16-4-5 11:17
自訂Sharpe Ratio函數
但內建的Sharpe Ratio函數(其實它挺複雜的)有幾個缺點:
1.沒有年化, 所以用月報酬和 ...

您好請問我編譯此函數時 Z_MySharpeRatio
跳出錯誤 SetCustomFitnessValue 說這個函數找不到 怎麼辦??

謝謝!

alexliou 發表於 16-10-11 08:28

kk20037 發表於 16-10-9 20:10
您好請問我編譯此函數時 Z_MySharpeRatio
跳出錯誤 SetCustomFitnessValue 說這個函數找不到 怎麼辦??
...

SetCustomFitnessValue 是內建指令, 不是函數應該不會找不到才對
是不是因為您用的是券商版
任何輸出相關的功能都被除去了呢?



qeagle 發表於 23-1-8 15:10

我用12版,出現錯誤訊息是
MultiCharts Standard does not allow using the following reserved words: DefineDLLFunc, External, External Method. The words is available in MultiCharts Gold.
試了一下不是SetCustomFitnessValue不能用,因為我把原來這個函式拿去另外的地方編譯是會過的,printToFile都註解掉就行了

alanboy362 發表於 23-2-23 13:25

太好了 這個正是我尋找很久的東西 感謝alexliou大
頁: [1]
查看完整版本: 用自訂標準做最佳化排序