Documentación

Aplicaciones

Última actualización el 18. 5. 2020 by Mark Fric

SQN Relación muestra entrante / muestra saliente

En este ejemplo añadiremos una nueva métrica (columna del banco de datos) que se calculará como cociente de dos valores de columna ya calculados. En nuestro caso, queremos obtener la relación entre SQN (IS) y SQN (OOS).

Así que la fórmula será sencilla:

Ratio SQN IS OOS = SQN (IS) / SQN (OOS)

 

Iremos paso a paso:

Crear un nuevo fragmento de columna del banco de datos

Cambie al editor de código:

a continuación, haga clic en Crear nuevo botón:

Establezca SQNRatioISOOS como nombre de la nueva columna y elija el tipo de columna Banco de datos:

Esto creará un nuevo fragmento de columna con una plantilla estándar.

Este nuevo fragmento no hace mucho. Se añadirá una nueva columna al banco de datos después de recompilar y
reinicie SQ, pero mostrará el valor de Beneficio neto normal porque este es el cálculo de ejemplo en el
plantilla estándar.

 

Calcular el valor deseado en el fragmento

Para que el snippet calcule el valor que queremos necesitamos hacer algunas modificaciones.

En primer lugar, modificaremos su constructor (primer método)

El código original era:

public SQNRatioISOOS() {
  super("SQNRatioISOOS",
        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("Su tooltip aquí");
  
  /* Si esta nueva columna depende de otras columnas que tienen que ser calculadas primero, ponlas aquí.
     Asegúrate de no crear dependencias circulares, 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");
}

 

lo cambiaremos por:

public SQNRatioISOOS() {
  super("SQN Ratio IS/OOS",
        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("Relación SQN (IS) / SQN (OOS)");
}

No hicimos nada especial, sólo especificamos un nombre mejor para nuestro snippet y establecimos la ayuda tooltip. También eliminamos comentarios con dependencias que no necesitamos.

 

A continuación eliminaremos el método compute()

Normalmente utilizaríamos este método para calcular el valor del fragmento. Este método se puede utilizar para calcular el valor métrico de la lista de operaciones o como una relación entre algunos campos ya calculados.

Lamentablemente, en nuestro caso necesitamos calcular la relación entre el mismo valor estadístico (SQN) pero calculado para dos partes diferentes de los datos: en la muestra y fuera de la muestra.

Esto no se puede hacer en el método compute(), así que podemos eliminarlo.

 

 Añadir el método getValue()

tenemos que anular un método especial getValue() que se llama cuando la cuadrícula del banco de datos recupera el valor de esta celda.

En este método podemos recuperar estadísticas separadas para la parte IS y OOS, y de ellas los valores de SQN de la parte IS y OOS.

public String getValue(ResultsGroup results, String resultKey, byte direction, byte plType, byte sampleType) throws Exception {
    // obtiene las estadísticas de las partes IS y OOS
    SQStats statsIS = results.subResult(resultKey).stats(Directions.Both, PlTypes.Money, SampleTypes.InSample);
    SQStats statsOOS = results.subResult(resultKey).stats(Directions.Both, PlTypes.Money, SampleTypes.OutOfSample);

    doble sqnIS = 0, sqnOOS = 0;
    
    // obtener valores de SQN para IS y OOS. Debemos asegurarnos de que los objetos stats no son nulos
    if(statsIS != null) sqnIS = statsIS.getDouble("SQN");
    if(statsOOS != null) sqnOOS = statsOOS.getDouble("SQN");

    // nw calcular y devolver su relación - tenga en cuenta que usamos safeDivide porque sqnOOS también puede ser cero
    double ratio = SQUtils.safeDivide(sqnIS, sqnOOS);

    return String.format("%.2f", ratio);
}

esto es todo lo que se necesita. Ahora el snippet calculará el valor de esta celda como un ratio de los valores ya existentes de SQN (IS) y SQN (OOS).

Hit Compile y debería ver el resultado con una compilación correcta:

 

Ahora reinicia SQ y deberias ver esta nueva columna en columnas disponibles. Para utilizarla, abra Gestionar vista en algún banco de datos y cree o edite una vista:

Guarde, seleccione esta vista en su banco de datos y debería ver su nueva columna correctamente calculada:

Eso es todo - tenemos un nuevo fragmento de columna del banco de datos.

¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil

Suscríbase a
Notificar a
5 Comentarios
Más antiguo
Más reciente Más votados
Feedbacks de Inline
Ver todos los comentarios
Emmanuel
27. 11. 2021 8:34 am

muy útil !!! gracias

Emmanuel
27. 11. 2021 16:24

excelente idea, gracias

Emmanuel
27. 11. 2021 16:34

Este método permite obtener estadísticas separadas para las partes IS y OOS."es importante saberlo.
¿Existe algún otro método como el cálculo en el que no podamos obtener IS y OOS?
Sería útil conocer otras limitaciones de cada clase, como el acceso al instrumento de datos y otras

tomas262
Admin
Responder a  Emmanuel
29. 11. 2021 8:48 pm

Puede consultar nuestra documentación sobre la API para ver todos los métodos disponibles https://strategyquant.com/sqxapi/

Ciber
20. 6. 2022 4:17 am

Esto funcionó en las estrategias generadas por una tarea de construcción. Sin embargo, se muestra cero cuando he añadido esto en un WFO. ¿Hay una manera diferente de hacer que funcione en WFO?