4. 1. 2023

5 1

Rentabilidad / Reducción máxima (Reducción máxima intradía o reducción por operación)


A veces el Drawdown calculado no refleja el Drawdown máximo que podríamos tener y que provocaría un margin call. Tengo muchas estrategias con gran relación Ret/DD. Pero cuando miro las estrategias puedo ver que algunas de ellas tienen un Max Intraday Drawdown mucho mayor (= Máxima Excursión Adversa). Ver imagen.
Este nuevo código elige el mayor Drawdown (Max Intraday Drawdown o Trade Drawdown).

Espero que no haya errores.

paquete SQ.Columns.Databanks;

import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;

//creado por Fabien 17/12/2022

public class ProfitMaxDD extends DatabankColumna {
    
    public ProfitMaxDD() {
        super("Beneficio/MaxDD",
          DatabankColumn.Decimal2, // formato de visualización del valor
          ValueTypes.Maximize, // si el valor debe maximizarse / minimizarse / aproximarse a un valor
          0, // valor objetivo si se ha elegido la aproximación
          0, // mínimo medio de este valor
          100); // máximo medio de este valor
        
    setWidth(80); // ancho de columna por defecto en píxeles
    
        setTooltip("NetProfit/ Max Intraday o Trade DD Ratio");
    setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown");
    /* Si esta nueva columna depende de otras columnas que tienen que calcularse primero, póngalas aquí.
       Asegúrese de no crear una dependencia circular, como A depende de B y B depende de A.
       Las columnas (=valores de estadísticas) se identifican por el nombre de la clase)
    */
    //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"));
    doble MaxDD = Math.max(maxIntradayDrawdown, DD);

        return round2( SQUtils.safeDivide(netProfit, MaxDD));
    }
}

 

Suscríbase a
Notificar a
1 Comentario
Más antiguo
Más reciente Más votados
Feedbacks de Inline
Ver todos los comentarios
Emmanuel
15. 1. 2023 8:57 am

Gracias, Fabien.