Rendimento / Max Drawdown (Max Intraday Drawdown o Trade Drawdown)
A volte il Drawdown calcolato non riflette il Drawdown massimo che potremmo avere e che farebbe scattare una richiesta di margine. Ricevo molte strategie con un ottimo rapporto Ret/DD. Ma quando esamino le strategie, vedo che alcune di esse hanno un Drawdown massimo intraday molto più elevato (= massima escursione avversa). Vedere l'immagine.
Questo nuovo codice sceglie il Drawdown maggiore (Max Intraday Drawdown o Trade Drawdown).
Spero che non ci siano errori!
pacchetto SQ.Columns.Databanks;
importare com.strategyquant.lib.*;
importare com.strategyquant.datalib.*;
importare com.strategyquant.tradinglib.*;
//creato da Fabien 17/12/2022
public class ProfitMaxDD extends DatabankColumn {
public ProfitMaxDD() {
super("Profit/MaxDD",
DatabankColumn.Decimal2, // formato di visualizzazione del valore
ValueTypes.Maximize, // se il valore deve essere massimizzato / minimizzato / approssimato a un valore
0, // valore target se è stata scelta l'approssimazione
0, // minimo medio di questo valore
100); // massimo medio di questo valore
setWidth(80); // larghezza predefinita della colonna in pixel
setTooltip("NetProfit/ Max Intraday o Trade DD Ratio");
setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown");
/* Se questa nuova colonna dipende da altre colonne che devono essere calcolate prima, inserirle qui.
Assicurarsi di non creare dipendenze circolari, come ad esempio A dipende da B e B dipende da A.
Le colonne (=valori statistici) sono identificate dal nome della classe)
*/
//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));
}
}
Grazie Fabien!
Come posso conoscere la massima perdita giornaliera aperta di un sistema che potrebbe adattare questo codice?
Grazie per questo codice, molto apprezzato.
Continuo a lottare con il problema descritto da Fabien. Ottengo molte grandi strategie con ottimi rapporti Ret/DD. Ma dal punto di vista della Maximum Adverse Execution MAE molte di esse sono inutili (poiché le chiamate a margine avrebbero ucciso la strategia).
Il team di SQX può includere le metriche MAE/MFE nei filtri del Ranking?
L'ho inserito nel mio sqx con code dieter e ho compilato il codice con successo.
e aprire la colonna nella banca dati, ma perché tutti i dati ProfitMaxDD mostrano 0?
Qualcuno può aiutarmi? Grazie mille