9. Estrategias personalizadas en qteasy
qteasy es una implementación y operación totalmente localizada de kits de herramientas de análisis comercial cuantitativo, con las siguientes funciones:
Adquisición, limpieza, almacenamiento, procesamiento, visualización y uso de datos financieros.
Cree estrategias comerciales cuantitativas y proporcione una gran cantidad de estrategias comerciales básicas integradas.
Backtesting de estrategias comerciales vectorizadas de alta velocidad y evaluación de resultados comerciales
Optimización y evaluación de parámetros de estrategia comercial.
Implementación y operación en vivo de estrategias comerciales.
Aprenderá las funciones principales y el uso de qteasy a través de una serie de ejemplos prácticos en esta serie de tutoriales.
9.1. Antes de empezar
Asegúrese de haber dominado lo siguiente antes de comenzar este tutorial:
Instalar y configurar
qteasy—— QTEASY Tutorial 1Configure una fuente de datos local y haya descargado suficientes datos históricos en su máquina local —— QTEASY Tutorial 2
Aprenda a crear objetos comerciales y a utilizar estrategias comerciales integradas —— QTEASY Tutorial 3
Aprenda a utilizar mezcladores para combinar múltiples estrategias simples en estrategias comerciales más complejas —— QTEASY Tutorial 4
En la QTEASY documentación, puede encontrar más información sobre el uso de estrategias comerciales integradas, la creación de estrategias personalizadas y más. Si no está familiarizado con el uso básico de qteasy, puede ir allí para ver instrucciones más detalladas.
9.2. Objetivo de este capítulo
El kernel de qteasy está diseñado como un marco que equilibra la alta velocidad
Mientras tanto, el marco de backtesting de qteasy también ha sido especialmente diseñado para evitar por completo la importación inadvertida de «funciones futuras» en su estrategia comercial, asegurando que su estrategia comercial se base completamente en datos pasados durante el backtesting, y también utiliza muchas técnicas de preprocesamiento y tecnología JIT para compilar funciones clave del kernel para lograr una velocidad de ejecución comparable a la de C.
Sin embargo, para lograr posibilidades teóricamente infinitas de estrategias comerciales, puede que no sea suficiente utilizar únicamente estrategias comerciales integradas y una combinación de estrategias. Algunas estrategias comerciales específicas o algunas estrategias comerciales particularmente complejas no se pueden crear combinando estrategias integradas. Esto requiere que utilicemos la clase base Strategy proporcionada por qteasy para crear una estrategia comercial personalizada basada en ciertas reglas.
En este capítulo, presentaremos la clase base de estrategia comercial de qteasy y explicaremos en detalle cómo crear una estrategia comercial que le pertenezca solo a usted en función de estas clases base a través de varios ejemplos específicos. Para ser progresivos, comenzamos con un ejemplo relativamente simple.
9.3. Construya una estrategia personalizada
En el flujo de trabajo del comercio cuantitativo, una estrategia comercial es en realidad una función que toma información conocida como entrada y genera decisiones comerciales a través de una serie de deducciones lógicas. Independientemente de la escuela técnica, el estilo comercial o el método de análisis, la definición más fundamental de una estrategia comercial es esta.

Por ejemplo:
Los analistas técnicos utilizan precios de acciones anteriores (datos de entrada) para calcular indicadores técnicos (deducción lógica) y tomar decisiones de compra/venta (decisiones comerciales)
Los inversores en valor utilizan varios indicadores de las empresas que cotizan en bolsa (datos de entrada) para analizar el potencial de crecimiento de la empresa (deducción lógica) y decidir qué acciones comprar/vender (decisiones comerciales)
Los analistas macroeconómicos, incluso si no les importan los precios de las acciones, deben consultar las noticias de actualidad, el sentimiento del mercado (datos de entrada), analizar la tendencia general del mercado (deducción lógica) y decidir si ingresar al mercado (decisiones comerciales).
El comercio de arbitraje de alta o ultra alta frecuencia también necesita analizar los cambios en tiempo real de los precios a corto plazo (datos de entrada), analizar el tamaño del espacio de arbitraje (deducción lógica) e intervenir rápidamente en las operaciones (decisiones comerciales).
Si una estrategia comercial rastrea una pequeña cantidad de productos de inversión con alta frecuencia, se denomina «estrategia comercial de sincronización»; si rastrea una gran cantidad de productos de inversión con baja frecuencia, se denomina «estrategia de selección de acciones».
En resumen, todo comercio cuantitativo es un conjunto de deducciones lógicas ejecutadas regularmente, que extraen los datos más recientes como entrada cada vez que se ejecutan y generan un conjunto de decisiones comerciales. La ejecución repetida de esta manera forma un flujo de operaciones comerciales estable, que no es más que el concepto abstracto de una estrategia comercial.
9.4. Utilice la clase de estrategia Strategy en qteasy
qteasy las estrategias comerciales se definen en función de los conceptos anteriores. Las clases de estrategia definidas por qteasy son portadoras de datos y lógica comercial. Al heredar la clase Strategy y definir su propia clase de estrategia (especificando los datos que necesita la estrategia y la lógica de implementación de la estrategia dentro de esta clase), puede crear una estrategia comercial personalizada.
Por lo tanto, en el diseño de qteasy, una estrategia comercial incluye los siguientes cuatro elementos centrales:
Tiempo de ejecución de estrategias y grupos de estrategias
Tiempo de ejecución de la estrategia —— El grupo de estrategias determina cuándo se ejecuta una estrategia y con qué frecuencia se ejecuta. Al agregar una estrategia a un
Operator, puede especificar los parámetrosrun_freqyrun_timing; Juntos, estos dos parámetros determinan el tiempo de ejecución de la estrategia.
Los parámetros ajustables y los datos históricos de una estrategia.
Las estrategias comerciales en qteasy también tienen un diseño especial: parámetros ajustables. Los parámetros ajustables son parámetros que se ajustan continuamente durante la ejecución de la estrategia, como el período de media móvil, el número de acciones en una clasificación de selección de acciones, etc. Estos parámetros afectan directamente el desempeño de la estrategia, por lo que queremos ajustarlos para encontrar la combinación óptima de parámetros, logrando así el mejor desempeño. qteasy proporciona una interfaz muy conveniente para definir parámetros ajustables. Los usuarios pueden definir cualquier número de parámetros ajustables en los atributos de la estrategia y especificar un nombre, rango de valores, tipo de datos, etc. para cada parámetro ajustable. Estos parámetros ajustables definidos se pasarán automáticamente a la función de implementación de la estrategia y los usuarios pueden utilizar estos parámetros directamente para implementar la lógica comercial.
Parámetros ajustables de una estrategia: parámetros que deben ajustarse en una estrategia, como el período de media móvil, el número de acciones en una clasificación de selección de acciones, etc. Estos parámetros afectan directamente el desempeño de la estrategia, por lo que queremos ajustarlos para encontrar la combinación óptima de parámetros, logrando así el mejor desempeño.
qteasyproporciona una interfaz muy conveniente,Parameters, para definir parámetros ajustables. Los usuarios pueden definir cualquier número de parámetros ajustables en los atributos de la estrategia y especificar un nombre, rango de valores, tipo de datos, etc. para cada parámetro ajustable. Estos parámetros ajustables definidos se pasarán automáticamente a la función de implementación de la estrategia y los usuarios pueden utilizar estos parámetros directamente para implementar la lógica comercial.
Los datos que requiere una estrategia y su lógica de ejecución.
Datos requeridos por la estrategia: las entradas de datos requeridas por la estrategia; por ejemplo, ¿necesita datos de velas diarias (línea K) de los últimos 10 días o la relación P/E del año pasado? La cantidad de datos requeridos por la estrategia se puede definir con total libertad mediante el atributo
Strategy.data_types. Los usuarios pueden utilizar el objetoqt.StgData()para definir cualquier tipo de entrada de datos. La frecuencia de los datos y la longitud de la ventana se pueden definir con total libertad a través de los atributos de la estrategia, yqteasyempaquetará automáticamente los datos de acuerdo con estas definiciones y los introducirá en la función de implementación de la estrategia.Lógica de ejecución de la estrategia —— La lógica de implementación de la estrategia se realiza anulando el método
Strategy.realize(). Los usuarios pueden definir libremente cómo utilizar los datos de entrada para generar señales comerciales.
Las señales de salida de una estrategia
qteasy permite a los usuarios definir diferentes tipos de señales comerciales: PT PS VS, etc. Los usuarios pueden elegir diferentes tipos de señales comerciales según sus necesidades para implementar diferentes tipos de estrategias comerciales. Los significados de las señales comerciales se describen brevemente a continuación. Para ver una introducción detallada a los diferentes tipos de señales comerciales, consulte Señales comerciales.
Señal tipo PT —— Representa el porcentaje de posición. La salida es un valor entre 0 y 1, que indica qué proporción de la posición mantener. Por ejemplo, una salida de 0,5 significa mantener el 50% del puesto; 0 significa no tener ninguno; 1 significa totalmente invertido;
Señal PS: representa el porcentaje de negociación. El resultado es un valor entre -1 y 1, que indica qué proporción de la posición comprar/vender. Por ejemplo, una salida de 0,5 significa comprar el 50% de la posición, -0,5 significa vender el 50% de la posición y 0 significa ninguna acción;
Señal de tipo VS —— Representa la cantidad comercial. El número de salida indica el número de acciones a comprar/vender; por ejemplo, 500 significa comprar 500 acciones y -300 significa vender 300 acciones.
Excepto por la información relacionada con la estrategia anterior, todo el resto del trabajo lo ha realizado qteasy, y todos los datos comerciales se empaquetarán automáticamente en una matriz ndarray de acuerdo con los atributos de la estrategia, que se pueden extraer y utilizar fácilmente; la misma estrategia comercial extraerá automáticamente datos comerciales durante la operación en vivo, generará señales comerciales de acuerdo con la estrategia definida y extraerá automáticamente datos históricos durante las pruebas retrospectivas, generará fragmentos de datos históricos y no formará funciones futuras. Al mismo tiempo, todos los datos comerciales serán
Por tanto, personalizar estrategias en qteasy es muy sencillo:
__init__()Defina todos los parámetros de la estrategia en este método, incluido el nombre de la estrategia, la descripción y, lo más importante, los parámetros ajustables, los tipos de datos, etc. Estos parámetros serán reconocidos automáticamente porqteasyy se pueden usar directamente cuando se ejecuta la estrategia.realize()Defina la lógica de ejecución de la estrategia en este método: extraiga datos históricos y genere señales comerciales basadas en los datos.

Además de los atributos de estrategia mencionados anteriormente, una estrategia personalizada también tiene los mismos atributos básicos que las estrategias comerciales integradas, como parámetros ajustables, etc. Dado que son los mismos que los de las estrategias comerciales integradas, no los repetiremos aquí.
9.5. Hay tres clases base de estrategias personalizadas diferentes
qteasy proporciona tres clases de estrategias diferentes para facilitar a los usuarios la creación de estrategias personalizadas para diferentes situaciones.
GeneralStg: Clase de estrategia comercial general, los usuarios deben proporcionar señales de decisión comercial para todos los activos comerciales en el métodorealize()FactorSorter: Clase de selección de acciones de factor, los usuarios solo necesitan definir el factor de selección de acciones en el métodorealize()y se pueden implementar múltiples acciones de selección de acciones a través de atributos de objeto.RuleIterator: Clase de iterador de reglas, los usuarios solo necesitan definir reglas de selección de acciones o de sincronización para una acción, y las mismas reglas se aplicarán cíclicamente a todas las acciones, y diferentes acciones pueden definir diferentes parámetros
Tres clases base de estrategias comerciales tienen exactamente los mismos atributos y métodos, la única diferencia está en la definición del método realize().
Ahora, aprendamos a crear estrategias personalizadas a través de algunos ejemplos progresivos.
9.6. Definir una estrategia comercial de sincronización de media móvil dual
Nuestro primer ejemplo es la estrategia comercial de sincronización de media móvil dual más simple, que es la estrategia comercial de sincronización más clásica. Esta estrategia de sincronización de media móvil tiene dos parámetros ajustables:
FMA Período de media móvil rápida
SMA Slow moving average period The strategy calculates the simple moving average generated by the above two periods based on the closing price of the past period. Cuando las dos medias móviles se cruzan, se genera una señal comercial:
Cuando la media móvil rápida cruza el límite superior de abajo hacia arriba, se emite una señal de compra completa.
Cuando la media móvil rápida cruza el límite superior de arriba a abajo, se emite una señal de venta completa.

La lógica de esta estrategia es muy simple. Entonces, ¿cómo definimos esta estrategia? Primero, debemos decidir qué tipo de clase base de estrategia comercial utilizar. En muchos casos, las tres clases base de estrategias comerciales se pueden usar para generar la misma estrategia comercial, pero algunas clases base han hecho algunas definiciones de antemano para tipos específicos de estrategias, lo que puede simplificar aún más el código de la estrategia. Esta estrategia es una estrategia de sincronización típica, que es un tipo de estrategia que aplica la misma regla a diferentes productos de inversión, por lo que podemos usar la clase de estrategia RuleIterator para establecer la estrategia. En los siguientes ejemplos, hablaremos de las otras dos clases de estrategia.
Ahora, aclaremos los tres elementos principales de esta estrategia:
Momento de la estrategia —— Para simplificar, definimos que esta estrategia se ejecuta al cierre de cada día.
Datos requeridos por la estrategia ——Para calcular los dos promedios móviles, necesitamos el precio de cierre histórico (
“close”) cada vez que se ejecuta la estrategia, y necesitamos al menos días de SMA de datos históricos para calcular el promedio móvil lento de SMA.Lógica de la estrategia ——Después de extraer el precio de cierre, primero calcule las dos medias móviles y luego determine si la media móvil del día más reciente ha cruzado hacia arriba o hacia abajo. Específicamente, se trata de comparar la relación relativa entre los dos precios promedio móviles de ayer y hoy. Si ayer la SMA era mayor que la FMA y hoy la SMA es menor que la FMA, significa que la FMA ha cruzado la SMA desde abajo y debería generarse una señal de compra completa. Esta señal es 1. Si la situación es exactamente la opuesta, se emite una señal de venta total de -1. En otros casos, se emite 0 y no hay señal comercial.
Con la preparación anterior, veamos cómo se define el código de estrategia. El primer paso en un código de estrategia básica es heredar la clase base de la estrategia (aquí está RuleIterator) y crear una clase personalizada:
from qteasy import RuleIterator
from qteasy import Parameter, StgData
class Cross_SMA(RuleIterator):
# 策略的属性定义在__init__()方法中
def __init__(self):
super().__init__(
)
# 策略的具体实现代码写在策略的realize()函数中
def realize(self):
"""策略的具体实现代码:
"""
pass
Bien, las pocas líneas de código anteriores son el marco completo de nuestra primera estrategia comercial personalizada. Complete los atributos y complemente la lógica de este marco para convertirse en una estrategia comercial completa. ¿Cómo hacerlo? Primero, defina los atributos más básicos de esta estrategia: nombre, descripción y parámetros ajustables:
Tanto el nombre como la descripción son información sobre la estrategia, lo cual es conveniente para comprender el propósito de la estrategia cuando se llame más adelante. Podemos definirlos según nuestras preferencias. El atributo más crítico son los parámetros ajustables.
En esta estrategia personalizada, queremos que los parámetros de cálculo de la media móvil rápida y la media móvil lenta sean ajustables, porque estos dos parámetros afectan directamente las posiciones específicas de las medias móviles rápida y lenta, que afectan directamente los puntos de intersección de las dos medias móviles, formando así diferentes puntos de compra y venta. Consulte las dos figuras siguientes, que muestran la intersección de diferentes medias móviles de velocidad de la misma acción al mismo tiempo. Cuando el período de cálculo de la media móvil es diferente, los puntos de compra y venta generados son completamente diferentes:
Los períodos de promedio móvil en la figura anterior son 15 días/40 días, lo que genera tres señales de compra y dos señales de venta.
Dado que el período de media móvil afecta directamente el rendimiento de la estrategia, naturalmente esperamos encontrar la mejor combinación de períodos de media móvil (combinaciones de parámetros) para que la estrategia funcione mejor. Para lograr este objetivo, qteasy permite a los usuarios definir estos parámetros como «parámetros ajustables» y proporciona algoritmos de optimización para encontrar los mejores parámetros. Para todas las estrategias comerciales integradas, el número y el significado de los parámetros ajustables están definidos y los usuarios no pueden modificarlos. Sin embargo, en las estrategias personalizadas, los usuarios tienen mucha libertad. En teoría, cualquier variable utilizada en el proceso de ejecución de la estrategia se puede definir como un parámetro ajustable.
Aquí, definimos los períodos de los promedios móviles rápido y lento como parámetros ajustables, y los definimos en los atributos de la estrategia de la siguiente manera
Los parámetros ajustables de una estrategia se definen mediante objetos Parameter. Con estos objetos, podemos especificar un nombre, rango de valores, tipo de datos, etc. para cada parámetro ajustable. Estos parámetros ajustables definidos se pasarán automáticamente a la función de implementación de la estrategia y los usuarios pueden usarlos directamente para implementar la lógica comercial.
pars=[Parameter((10, 100), data_type='int', name='fast', value=30),
Parameter((10, 100), data_type='int', name='slow', value=60)], # 策略默认参数是快均线周期30, 慢均线周期60
Definir los datos requeridos por la estrategia.
Los datos requeridos por la estrategia están determinados por el objeto StgData. En qteasy, cada objeto de tipo de datos se puede identificar mediante una identificación única, una frecuencia de datos y un tipo de activo. También puede especificar la longitud de la ventana de datos.
Con los datos definidos, qteasy empaquetará automáticamente los datos dentro de la ventana y los enviará a la función de estrategia realize(). Si todos los datos históricos se empaquetan en una serie de ventanas de datos de acuerdo con las mismas reglas durante el backtesting, el formato de los datos históricos recibidos por la función realize() es completamente el mismo y el método de procesamiento es completamente el mismo, lo que garantiza la coherencia de las operaciones en vivo y de backtesting, y también evita las funciones futuras que puedan ocurrir durante el backtesting:

La definición del tipo de datos StgData es la siguiente. Necesitamos los precios de cierre diarios de los últimos 201 días. La razón por la que necesitamos 201 días de precios de cierre es que definimos el rango máximo del parámetro ajustable como 200; Para calcular una media móvil con un período de 200, necesitamos 201 días de precios de cierre.
data_types=[StgType('close', asset_type='ANY', freq='d', window_length=201)] # 策略基于收盘价计算均线,因此数据类型为'close',历史数据的频率为日,历史数据窗口长度为201,每一次交易信号都是由它之前前201天的历史数据决定的
Según los tipos de datos definidos anteriormente, qteasy asigna a esta estrategia una ID única: close_ANY_d. Con esta ID, puede recuperar datos históricos en la función de implementación de la estrategia; Más adelante presentaremos cómo recuperar datos históricos.
Ahora se han definido todos los atributos importantes de la estrategia comercial personalizada. A continuación, definiremos la implementación de la estrategia.
Realización de una estrategia comercial personalizada: realize()
En el método realize(), necesitamos hacer tres cosas y las resolvemos una por una:
Adquirir datos históricos
Adquirir parámetros ajustables
Crear algoritmo y definir salida.
Adquiera datos históricos y valores de parámetros ajustables:
Como se mencionó anteriormente, el parámetro ajustable de esta estrategia es el período retrospectivo de la media móvil. Por lo tanto, para utilizar el parámetro ajustable como período de cálculo, necesitamos obtener el valor del parámetro ajustable así como los datos históricos específicos.
En el método realize(), es muy fácil obtener parámetros ajustables y datos históricos: use self.get_data() y self.get_pars() respectivamente. Ambos métodos pueden recuperar múltiples series de datos o parámetros a la vez; Los valores recuperados se descomprimirán en un tuple, que los usuarios pueden usar directamente.
def realize(self):
"""策略的具体实现代码
"""
close = self.get_data('close_ANY_d') # 通过数据ID获取数据:最近201天的收盘价
f, s = self.get_pars('fast', 'slow') # 读取快均线(fast)和慢均线(slow)的计算周期
Ahora, todos los elementos necesarios para implementar la lógica de la estrategia están listos y podemos comenzar a implementar la lógica de la estrategia.
Primero necesitamos calcular dos conjuntos de medias móviles. Si el usuario ha instalado la biblioteca ta-lib, podemos llamar directamente a la función SMA de ta-lib para calcular los promedios móviles. Si no está instalado, no es un gran problema, porque qteasy proporciona una versión libre de ta-lib de la función SMA (no todos los indicadores técnicos tienen una versión libre de ta-lib; consulte la documentación de referencia para obtener más detalles), que se puede importar y usar directamente.
def realize(self, h, **kwargs):
"""策略的具体实现代码
"""
...
from qteasy.tafuncs import sma
# 使用qt.sma计算简单移动平均价
s_ma = sma(close, s)
f_ma = sma(close, f)
# 为了考察两条均线的交叉, 计算两根均线昨日和今日的值,以便判断
s_today, s_last = s_ma[-1], s_ma[-2]
f_today, f_last = f_ma[-1], f_ma[-2]
Calcule la media móvil, podemos definir directamente el resultado de la estrategia en el método realize, es decir, la decisión comercial.
Para la estrategia de clase RuleIterator, no importa en cuántas acciones actúe nuestra estrategia al mismo tiempo, solo necesitamos definir un conjunto de reglas, que se llama «iteración de reglas», por lo que solo necesitamos generar un número para representar la decisión comercial. Este número se convertirá automáticamente en diferentes órdenes comerciales mediante qteasy. Las reglas de conversión están determinadas por el modo de trabajo del objeto Operator, que se introdujo en los tutoriales anteriores y no se repetirá aquí.
En este ejemplo, planeamos que las señales emitidas por la estrategia comercial representen qué proporción de los activos totales invertir en el instrumento de inversión. Entonces solo necesitamos generar una señal comercial «1» el día que debemos comprar, generar una señal comercial «-1» el día que debemos vender y generar «0» si no queremos operar:
def realize(self, h, **kwargs):
"""策略的具体实现代码
"""
...
if (f_last < s_last) and (f_today > s_today):
# 当快均线自下而上穿过上边界(即昨日快均线低于慢均线,而今天高于于慢均线),发出全仓买入信号
return 1
elif (f_last > s_last) and (f_today < s_today):
# 当快均线自上而下穿过上边界(即昨日快均线高于慢均线,而今天低于于慢均线),发出全部卖出信号
return -1
else: # 其余情况不产生任何信号
return 0
¡Ahora hemos terminado la definición de una estrategia! qteasy completará todo el trabajo complejo detrás de escena, y los usuarios solo tendrán que concentrarse en resolver los datos y las definiciones lógicas de la estrategia. El código completo es el siguiente (para ahorrar espacio, se eliminan todos los comentarios):
from qteasy import RuleIterator, Parameter, StgData
from qteasy.tafuncs import sma
# 创建双均线交易策略类
class Cross_SMA_PS(RuleIterator):
def __init__(self):
super().__init__(
name='CROSSLINE', # 策略的名称
description='快慢双均线择时策略', # 策略的描述
pars=[Parameter((10, 100), par_type='int', name='fast', value=30),
Parameter((10, 100), par_type='int', name='slow', value=60)],
data_types=[StgData('close', freq='d', asset_type='ANY', window_length=201)],
)
def realize(self):
close = self.get_data('close_ANY_d') # 通过数据ID获取数据:最近201天的收盘价
f, s = self.get_pars('fast', 'slow') # 读取快均线(fast)和慢均线(slow)的计算周期
# 使用qt.sma计算简单移动平均价
s_ma = sma(close, s)
f_ma = sma(close, f)
# 为了考察两条均线的交叉, 计算两根均线昨日和今日的值,以便判断
s_today, s_last = s_ma[-1], s_ma[-2]
f_today, f_last = f_ma[-1], f_ma[-2]
if (f_last < s_last) and (f_today > s_today):
# 当快均线自下而上穿过上边界(即昨日快均线低于慢均线,而今天高于于慢均线),发出全仓买入信号
return 1
elif (f_last > s_last) and (f_today < s_today):
# 当快均线自上而下穿过上边界(即昨日快均线高于慢均线,而今天低于于慢均线),发出全部卖出信号
return -1
else: # 其余情况不产生任何信号
return 0
A continuación, podemos utilizar esta estrategia personalizada como cualquier estrategia comercial integrada.
Necesitamos crear un nuevo objeto Operator y, al crearlo, agregar la estrategia Cross_SMA que acabamos de crear en el Operator, mientras especificamos el tipo de señal de esta estrategia como PS. Esto le indica al Operator que utilice las reglas del PS para interpretar las señales generadas por la estrategia comercial:
op = qt.Operator(strategies=[Cross_SMA_PS()], signal_type='PS')
Echemos un vistazo a los resultados del backtest de esta estrategia.
Resultados del backtest de la primera estrategia
La configuración de los parámetros para realizar pruebas retrospectivas de la estrategia es exactamente la misma que para las estrategias comerciales integradas.
op = qt.Operator([Cross_SMA_PS()], signal_type='PS')
# 设置op的策略参数
op.set_parameter(0,
par_values= (20, 60) # 设置快慢均线周期分别为20天、60天
)
# 设置基本回测参数,开始运行模拟交易回测
res = qt.run(op,
mode=1, # 运行模式为回测模式
asset_pool='000300.SH', # 投资标的为000300.SH即沪深300指数
invest_start='20110101', # 回测开始日期
invest_end='20191231', # 回测结束日期
visual=True # 生成交易回测结果分析图
)
Los resultados del backtesting son los siguientes:

Ahora podemos intentar modificar los parámetros ajustables de la estrategia y ejecutar el backtest nuevamente. El intervalo de backtest es el mismo que el anterior:
op.set_parameter(0,
par_values= (25, 166) # 设置快慢均线周期分别为25天、166天
)
# 设置基本回测参数,开始运行模拟交易回测,回测参数完全一样
res = qt.run(op,
mode=1, # 运行模式为回测模式
asset_pool='000300.SH', # 投资标的为000300.SH即沪深300指数
invest_start='20110101', # 回测开始日期
visual=True # 生成交易回测结果分析图
)
Como puede ver, los resultados del backtest de la estrategia han cambiado significativamente después de cambiar los parámetros: para aprender cómo optimizar los parámetros de la estrategia, consulte los siguientes capítulos de este tutorial.
====================================
| |
| BACKTEST REPORT |
| |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 111.0 ms
time consumption for operation back testing: 2.1 ms
investment starts on 2011-01-04 15:00:00
ends on 2019-12-30 15:00:00
Total looped periods: 9.0 years.
-------------operation summary:------------
Only non-empty shares are displayed, call
"loop_result["oper_count"]" for complete operation summary
Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH 6 7 13 46.8% -0.0% 53.2%
Total operation fee: ¥ 283.00
total investment amount: ¥ 100,000.00
final value: ¥ 180,675.40
Total return: 80.68%
Avg Yearly return: 6.80%
Skewness: -1.01
Kurtosis: 17.32
Benchmark return: 27.96%
Benchmark Yearly return: 2.78%
------strategy loop_results indicators------
alpha: -1.011
Beta: -4.128
Sharp ratio: 0.368
Info ratio: 0.009
250 day volatility: 0.134
Max drawdown: 31.58%
peak / valley: 2015-06-08 / 2015-07-08
recovered on: 2018-01-22
==================END OF REPORT===================

En este punto, hemos implementado una estrategia comercial de sincronización personalizada simple. Entonces, ¿cómo implementamos las otras dos clases de estrategia? Usaremos más ejemplos para explicar en el próximo capítulo.
9.7. Resumen
En esta sección, aprendimos sobre la definición abstracta de estrategias comerciales en qteasy, entendimos los elementos básicos contenidos en una estrategia comercial y sus métodos de definición, y creamos una estrategia comercial de media móvil dual personalizada a través del ejemplo más simple.
Como próximo paso, continuaremos introduciendo estrategias comerciales personalizadas. Debido a que hay mucho contenido relacionado, los tutoriales relacionados con estrategias comerciales personalizadas ocuparán tres capítulos. En el siguiente capítulo, aprenderemos cómo utilizar las otras dos clases base de estrategias personalizadas (FactorSorter clase base de selección de acciones de factor y GeneralStg clase base de estrategia general) para crear estrategias comerciales. Luego, usaremos otro capítulo para presentar una estrategia comercial personalizada más compleja para mostrar la flexibilidad de qteasy. ¡Nos vemos en la siguiente sección!