リターン / 最大ドローダウン(最大日中ドローダウンまたはトレード・ドローダウン)
計算されたドローダウンが、発生し得てマージンコールを引き起こすような最大ドローダウンを常に反映しているとは限りません。優れたリターン/ドローダウン比率を持つ多くの戦略を目にしますが、それらの戦略を詳しく見ると、最大イントラデイ・ドローダウン(=最大不利エクスカージョン)がはるかに大きいものがいくつか含まれていることが分かります。画像をご覧ください。.
この新しいコードは、大きい方のドローダウン(最大日中ドローダウンまたはトレード・ドローダウン)を選択します。.
間違いがないことを願っています!
package SQ.Columns.Databanks;
import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;
//作成者:Fabien 2022年12月17日
public class ProfitMaxDD extends DatabankColumn {
public ProfitMaxDD() {
super("Profit/MaxDD",
DatabankColumn.Decimal2, // 値の表示形式
ValueTypes.Maximize, // 値を最大化する/最小化する/値
0, // 近似を選択した場合の目標値
0, // この値の平均最小値
100); // この値の平均最大値
setWidth(80); // デフォルトの列幅(ピクセル単位)
setTooltip("NetProfit/ 最大日次または取引DD比率");
setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown");
/* この新しい列が、先に計算する必要がある他の列に依存している場合は、それらをここに記述してください。
AがBに依存し、BがAに依存するといった循環依存関係が生じないよう注意してください。
列(=統計値)はクラスの名前で識別されます)
*/
//setDependencies("DrawdownPct", "NumberOfTrades");
}
//------------------------------------------------------------------------
@Override
public double compute(SQStats stats, StatsTypeCombination combination, OrdersList ordersList, SettingsMap settings, SQStats statsLong, SQStats statsShort) throws Exception {
double netProfit = stats.getDouble("NetProfit");
double maxIntradayDrawdown = stats.getDouble("MaxIntradayDrawdown");
double DD = Math.abs(stats.getDouble("Drawdown"));
double MaxDD = Math.max(maxIntradayDrawdown, DD);
return round2( SQUtils.safeDivide(netProfit, MaxDD));
}
}
ファビアン、ありがとう!
このコードを適用できるシステムの1日の最大オープン損失を知るにはどうすればよいですか?
コードをご提供いただきありがとうございます。大変助かりました。.
私はファビアンが上で説明した問題に今でも苦労しています。素晴らしいRet/DD比率を持つ優れた戦略を数多く手に入れていますが的最大不利執行(MAE)の観点から見ると、その多くは役に立ちません(マージンコールによって戦略が破綻してしまうためです)。.
SQXチームは、ランキングフィルターにMAE/MFEメトリクスを追加していただけないでしょうか?
私はそれをコードダイエッターを使ってsqxに入れ、コードのコンパイルに成功しました。.
そして、データバンクでその列を開いてみたのですが、なぜProfitMaxDDのデータがすべて0になっているのでしょうか?
どなたか助けていただけませんか?本当にありがとうございます