Documentación
Aplicaciones
Última actualización el 18. 5. 2020 by Mark Fric
SQN Relación muestra entrante / muestra saliente
Contenido de la página
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
muy útil !!! gracias
excelente idea, gracias
“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
Puede consultar nuestra documentación sobre la API para ver todos los métodos disponibles https://strategyquant.com/sqxapi/
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?