Volver Probar y evaluar la estrategia
qteasy todas las estrategias comerciales se implementan a través del objeto qteast.Operator (comerciante) para pruebas retrospectivas y operación. El objeto Operator es un contenedor de estrategias, y un operador puede gestionar simultáneamente múltiples estrategias comerciales diferentes, incluso si estas estrategias comerciales tienen diferentes tiempos y frecuencias operativas, o diferentes propósitos. Por ejemplo, se utiliza una estrategia para la selección de acciones, otra estrategia para la sincronización del mercado y otra estrategia para el control de riesgos. Los usuarios pueden agregar o modificar de manera flexible las estrategias en el objeto Operator.
Después de entregar la estrategia a Operator, siempre que se establezcan la clase de activo para negociar, el tamaño del conjunto de activos y el momento operativo y la frecuencia de cada estrategia, el objeto Operator iniciará la estrategia comercial correspondiente en el momento adecuado, generará señales de estrategia y combinará (blend) todas las señales de estrategia para resolverlas en señales comerciales.
Para obtener más información sobre el objeto Operator, consulte la documentación qteasy.
qteasy proporciona dos formas de crear estrategias comerciales:
Uso de combinaciones de estrategias comerciales integradas
qteasyproporciona una variedad de estrategias comerciales integradas para que los usuarios las utilicen sin creación manual. Al hacer referencia al nombre de la estrategia integrada (para obtener documentación detallada sobre todas las estrategias integradas), los usuarios pueden establecer estrategias rápidamente y también combinar múltiples estrategias simples en estrategias compuestas más complejas.
A través de la clase de estrategia para crear estrategias
Si la estrategia del usuario es muy compleja, se puede personalizar una estrategia a través de la clase
qteasy.Strategy.
Crear estrategias comerciales, realizar pruebas retrospectivas de los resultados comerciales de las estrategias comerciales utilizando datos históricos y evaluar los resultados comerciales son una de las funciones principales de qteasy. qteasy resume una serie de estrategias comerciales a través de un objeto comercial (Operator) y simula la operación de las estrategias comerciales dentro de un período histórico determinado utilizando la función qt.run(), generando señales comerciales, simulando operaciones utilizando precios históricos, generando resultados comerciales, calculando indicadores de evaluación y mostrándolos en forma visual como gráficos.
A continuación se muestra un ejemplo de una estrategia común de inversión en el momento oportuno de un fondo, que demuestra el siguiente contenido:
Cree una estrategia de inversión de sincronización DMA simple, cree un objeto comercial usando esta estrategia y demuestre cómo modificar y agregar estrategias.
Con
qt.configure()establezca las variables de entorno relevantes, utilice los datos históricos del índice CSI 300 de los últimos 10 años para realizar una prueba retrospectiva del rendimiento de la estrategia.Optimice los parámetros de la estrategia utilizando los datos históricos del índice CSI 300 durante los últimos 10 años y finalmente demuestre los resultados después de la optimización.
Primero importamos el módulo qteasy. Para imprimir gráficos en línea, use matplotlib inline para configurar el modo de impresión de gráficos en impresión en línea.
Crear estrategia y objetos Operator
Cada estrategia comercial en qteasy se define como un objeto de estrategia comercial (Estrategia). Cada objeto comercial contiene una serie de reglas comerciales, que incluyen tres aspectos:
Las reglas de ejecución de la estrategia incluyen la frecuencia de operación de la estrategia, el tipo de datos históricos utilizados y la duración de la ventana de datos históricos, que definen cómo opera la estrategia y cómo utilizar los datos históricos.
Reglas de generación de señales Las reglas para generar señales comerciales, es decir, cómo generar qué tipo de señales comerciales en función de datos históricos relevantes, que es el núcleo de la estrategia comercial.
Tipos de señales comerciales Los diferentes tipos de señales comerciales determinan cómo el módulo comercial de simulación procesa las señales comerciales
En qteasy, las estrategias comerciales las ejecuta el objeto comercial (Operator). Al mismo tiempo, solo se puede ejecutar un objeto Operator, pero el mismo operador puede ejecutar una o más estrategias comerciales simultáneamente. Estas estrategias comerciales pueden negociarse en la misma cartera y los usuarios pueden definir métodos de «mezcla» específicos para combinar múltiples estrategias comerciales simples en una estrategia comercial compleja.
Crear objeto de estrategia
Crear un objeto de estrategia es más fácil usando el módulo qt.built_in y también se puede crear al crear el objeto Operator.
import qteasy as qt
# 通过qt内置策略模块创建一个DMA则时策略
stg = qt.built_in.DMA()
# 通过stg.info()可以查看策略的主要信息:
stg.info()
Strategy_type: RuleIterator
Strategy name: DMA
Description: Quick DMA strategy, determine long/short position according to differences of moving average prices with simple timing strategy
Strategy Parameter: (12, 26, 9)
Strategy Properties Property Value
-------------------------------------------------
Param. count 3
Param. types ['int', 'int', 'int']
Param. range [(10, 250), (10, 250), (5, 250)]
Run parameters d @ close
Data types ['close']
Data parameters 270 d
Podemos ver la información básica de esta estrategia comercial en el resultado. Además del nombre y la descripción, la información importante incluye:
Parámetro de estrategia. El parámetro de estrategia es el parámetro externo requerido durante la operación de la estrategia. Dependiendo de las diferentes reglas de la estrategia, los parámetros utilizados por la estrategia también son diferentes. Estos parámetros afectan el funcionamiento de la estrategia y diferentes parámetros afectan el resultado de la estrategia. Por ejemplo, en una estrategia de media móvil dual, el período de cálculo de la media móvil larga y el período de cálculo de la media móvil corta son dos parámetros de la estrategia.
Tipos/rango de parámetros: Diferentes parámetros de estrategia pueden afectar en gran medida el resultado final de una estrategia. Después de configurar el rango de valores y el tipo de parámetros, qteasy puede buscar los mejores parámetros en el espacio de parámetros a través de diferentes métodos para optimizar el rendimiento de la estrategia.
Frecuencia de datos de estrategia/Frecuencia de muestra. La frecuencia de operación de la estrategia y la frecuencia de los datos requeridos, como una vez a la semana, una vez al mes o una vez por minuto, etc. En términos generales, la frecuencia de los datos está relacionada con la frecuencia de ejecución.
Tipos de datos: los tipos de datos históricos necesarios para ejecutar la estrategia. Para la estrategia DMA, sólo se necesita el precio de cierre.
Si desea ver todas las estrategias integradas, puede utilizar la función qt.built_ins(). Si no proporciona los parámetros de la función, se mostrará una lista de todas las estrategias integradas. Si proporciona parámetros, mostrará información detallada sobre la estrategia integrada especificada. Por ejemplo:
qt.built_ins('dma')
Resultado:
DMA择时策略
策略参数:
s, int, 短均线周期
l, int, 长均线周期
d, int, DMA周期
信号类型:
PS型:百分比买卖交易信号
信号规则:
在下面情况下产生买入信号:
1, DMA在AMA上方时,多头区间,即DMA线自下而上穿越AMA线后,输出为1
2, DMA在AMA下方时,空头区间,即DMA线自上而下穿越AMA线后,输出为0
3, DMA与股价发生背离时的交叉信号,可信度较高
策略属性缺省值:
默认参数:(12, 26, 9)
数据类型:close 收盘价,单数据输入
采样频率:天
窗口长度:270
参数范围:[(10, 250), (10, 250), (8, 250)]
策略不支持参考数据,不支持交易数据
Más funciones de estrategia integradas incluyen:
qt.built_ins(stg_id=None)
Si stg_id=Ninguno, muestra una lista de todas las estrategias integradas; de lo contrario, muestra información detallada sobre la estrategia integrada especificada.
qt.built_in_list(stg_id=None)
Si stg_id=Ninguno, devuelve una lista de todas las estrategias integradas; de lo contrario, devuelve información detallada sobre la estrategia integrada especificada.
qt.built_in_strategies(stg_id=None)
Si stg_id=Ninguno, devuelve una lista de todas las estrategias integradas; de lo contrario, devuelve información detallada sobre la estrategia integrada especificada.
qt.get_built_in_strategy(stg_id)
Según el ID de la estrategia incorporada proporcionada, devuelve el objeto de la estrategia incorporada.
Crear objeto Operator
La creación de un objeto Operator se puede realizar usando qt.Operator(). Después de crear un objeto Operator, todas las estrategias comerciales las ejecuta el objeto comercial. Al crear el objeto comercial, puede especificar cómo manejar las señales comerciales y cómo ejecutar las operaciones:
qt.Operator(strategies=None, signal_type=None, op_type=None)
strategies: Las estrategias comerciales en el objeto comercial pueden ser una o más estrategias comerciales, o una lista de una estrategia comercial. Si no se especifica ninguna estrategia comercial, se crea un objeto comercial vacío y la estrategia comercial se puede agregar o eliminar más adelante. Una vez que se agrega una estrategia comercial, el objeto comercial asigna una identificación única a cada estrategia comercial, que puede usarse para hacer referencia a esta estrategia comercial. Al mismo tiempo, el objeto comerciante asignará automáticamente un tiempo operativo a cada estrategia comercial de acuerdo con la frecuencia operativa y el tiempo de la estrategia. Sólo cuando llegue el momento de operación el objeto comerciante ejecutará esta estrategia comercial y generará señales comerciales.signal_type: El tipo de señal comercial puede ser'pt','ps'o'vs', de forma predeterminada'pt', que representa señales de índice de tenencia objetivo, señales comerciales de porcentaje y señales comerciales de cantidad, respectivamente. Los diferentes tipos de señales comerciales determinan cómo el objeto comercial procesa las señales comerciales y cómo el objeto comercial mezcla las señales comerciales de múltiples estrategias comerciales en una sola señal comercial.op_type: El modo de funcionamiento del objeto comercial puede ser'batch'o'realtime', de forma predeterminada'batch', que representa el modo de operación por lotes y el modo de operación en tiempo real, respectivamente. En el modo de operación por lotes, el objeto comercial generará señales comerciales por adelantado en el modo de prueba retrospectiva u optimización, y luego realizará transacciones simuladas en lotes, lo cual es más rápido. En el modo de operación en tiempo real, el objeto comerciante generará señales comerciales y simulará inmediatamente el comercio. Después de generar resultados comerciales simulados, generará la siguiente señal comercial, que es adecuada para el modo de operación comercial real o el modo de backtesting especial.
Para qteasy, las señales comerciales de las estrategias comerciales y las órdenes comerciales de acciones/fondos son dos conceptos diferentes.
Todas las estrategias comerciales se basan en datos históricos para generar señales comerciales, mientras que el objeto comercial genera órdenes comerciales basadas en señales comerciales, simulando el comportamiento comercial del comerciante y, en última instancia, generando resultados comerciales.
Tres tipos de señales estratégicas
En qteasy, las señales comerciales son números de punto flotante, y la misma señal comercial puede representar diferentes significados, que el objeto comercial interpreta como diferentes órdenes comerciales. El significado de la señal comercial está determinado por el tipo de señal del objeto comercial, que puede ser 'pt', 'ps' o 'vs', que representan señales de índice de tenencia objetivo, señales comerciales de porcentaje y señales comerciales de cantidad, respectivamente.
Hay tres tipos de señales comerciales:
PT: Esta señal comercial representa el índice de tenencia objetivo, lo que significa que el valor de las acciones mantenidas representa la proporción de los activos totales. Por ejemplo, cuando los activos totales actuales son 1 millón de yuanes, 0,2 significa controlar la cantidad de tenencias de una determinada acción o fondo para que su valor de mercado sea el 20% de 1 millón de yuanes, que es 200.000 yuanes. En este caso, la cantidad de acciones compradas o vendidas depende de la cantidad actual de acciones que se poseen. Si el número actual de acciones que posee es 0, compre acciones por valor de 200.000 yuanes. Si el valor actual de las acciones mantenidas es de 300.000 yuanes, entonces venda el valor de 100.000 yuanes.
PS: Esta señal comercial representa directamente la relación compra/venta. En este caso, la cantidad de acciones compradas o vendidas no está relacionada con la cantidad actual de acciones poseídas, sino solo con los activos totales. Si los activos totales son 1 millón de yuanes, 0,2 significa comprar acciones por valor de 200.000 yuanes.
VS: En este caso, la señal comercial representa directamente la cantidad de compra/venta. En este caso, la cantidad de acciones compradas o vendidas no está relacionada con los activos totales o la cantidad de acciones poseídas. 2000 significa comprar 2000 acciones.
Además, si las órdenes comerciales generadas difieren según el tipo de cuenta operada por el operador (como una cuenta de acciones o una cuenta de futuros), las órdenes comerciales generadas también diferirán. La explicación específica se muestra en la siguiente tabla:
| 账户类型 | 信号类型 | 交易信号 | 信号含义 | 信号举例 | 交易订单举例 |
|---|---|---|---|---|---|
| 股票账户 | PT | sig > 0 | 持有该资产,并使持有资产的市值为总资产的sig倍 | 0.5 | 根据当前持有的资产比例确定交易订单,如果已经满仓持有,则卖掉50%仓位,如果持仓为0,则买入至50%仓位 |
| sig = 0 | 清空全部持有的资产,持有资产为0 | 0 | 根据当前持有的资产比例确定交易订单,如果持仓则卖掉全部持仓,如果没有持仓则不交易 | ||
| sig < 0 | 无意义 | N/A | N/A | ||
| PS | sig > 0 | 买入该资产,买入的金额占总资产的比例为sig | 0.5 | 总资产为100,000,则此时花费50,000元金额买入资产(含手续费) | |
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | sig < 0 | 卖出该资产,卖出的部分占当前持有数量的比例为sig | -0.5 | 假设当前持有1000股,则此时应卖出500股 |
| VS | sig > 0 | 买入该资产,买入的数量为sig | 500 | 买入500股 | |
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | sig < 0 | 卖出该资产,卖出的数量为abs(sig) | -500 | 卖出500股 |
| 期货账户 (未实现) | PT | sig > 0 | 平掉所有空仓,开多仓,并使持有合约价值为总资产的sig倍 | 1.5 | 假设总资产为100,000,开多仓持有总价150,000的合约 *当保证金比例<1时,持仓比例可以大于100% |
| sig = 0 | 平掉全部持有的仓位,持有头寸为0 | 0 | 平掉所有持有的多仓和空仓 | ||
| sig < 0 | 平掉所有多仓,开空仓,并使持有合约价值为总资产的sig倍 | -1.5 | 总资产为100,000,则开空仓持有总价150,000的合约 * 如果保证金比例<1时,持空仓比例可以大于100% |
||
| PS | sig > 0 | 如果持有空仓:平部分空仓,平空仓的数量占总持有的比例为sig | 0.5 | 如果总持仓为1,000手,则此时平仓500手 * 此时sig必须小于等于1 |
|
| 如果持有多仓:开多仓,开仓的合约价值占总资产的比例为sig | 1.5 | 如果总资产为100,000,则开多仓持有总价150,000元的合约 * 如果保证金比例<1时,sig可以大于1 |
|||
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | ||
| sig < 0 | 如果持有多仓:平部分多仓,平仓的数量占总持有的比例为sig | 0.5 | 如果总持仓为1,000手,则此时平仓500手 * 此时sig必须小于等于1 |
||
| 如果持有空仓:开空仓,开仓的合约价值占总资产的比例为sig | 1.5 | 如果总资产为100,000,则开空仓持有总价150,000元的合约 * 如果保证金比例<1时,sig可以大于1 |
|||
| VS | sig > 0 | 平空仓或开多仓,开平仓的数量为sig。如果持有空头数量超过sig则忽略剩余部分 | 1500 | 如果持有1500手以上空头仓位,则平仓1500手,如果当前没有持仓,则开多仓持有1500手合约 | |
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | sig < 0 | 平多仓或开空仓,开平仓的数量为sig。如果持有多头数量超过sig则忽略剩余部分 | -500 | 如果持有1500手以上多头仓位,则平仓1500手,如果当前没有持仓,则开空仓持有1500手合约 |
Combinación de señales comerciales
Aunque el mismo objeto Operator solo puede generar un tipo de señal al mismo tiempo, dado que el objeto Operator puede acomodar un número infinito de estrategias comerciales diferentes, también puede producir un número infinito de conjuntos del mismo tipo de estrategias comerciales. Para ahorrar gastos computacionales durante las pruebas retrospectivas comerciales, evitar que las señales comerciales conflictivas o duplicadas ocupen recursos informáticos y aumentar la flexibilidad de las señales comerciales, todas las señales comerciales deben mezclarse en un conjunto antes de enviarse al programa de pruebas retrospectivas para su prueba.
Sin embargo, en un objeto Operator, las señales comerciales generadas por diferentes estrategias pueden ejecutarse a diferentes precios comerciales. Por ejemplo, algunas estrategias generan señales comerciales de precios de apertura, mientras que otras generan estrategias comerciales de precios de cierre. En este caso, no se deben mezclar diferentes señales de precios comerciales. Pero aparte de eso, mientras los precios de negociación sean los mismos, todas las señales deberían ser contradictorias.
Combinar señales comerciales significa varias operaciones o funciones de señales comerciales, desde operaciones lógicas simples y operaciones de suma/resta hasta funciones personalizadas complejas. Siempre que se puedan aplicar a una función ndarray, en teoría se pueden utilizar para mezclar señales comerciales, siempre que la señal comercial de salida final sea significativa.
La combinación de señales se basa en una serie de operaciones y funciones predefinidas, a las que se hace referencia como «funciones atómicas» u «operadores». Los usuarios utilizan estos «operadores» para manipular las señales comerciales generadas por el objeto Operator y transformar múltiples conjuntos de señales comerciales en un conjunto único de señales comerciales manteniendo su forma y números significativos.
Las señales se combinan mediante una expresión de combinación blender, por ejemplo, s0 and (s1 + s2) * avg(s3, s4)
Las expresiones blender admiten las siguientes funciones:
Elemento |
Ejemplo |
Nota |
|---|---|---|
Índice de estrategia |
|
Una cadena que comienza con s y termina con un número, donde el número es el número de secuencia de la estrategia en |
Dígitos |
|
Cualquier número válido, un número que participa en operaciones de expresión. |
Operadores |
|
Incluye |
Operadores lógicos |
|
Admite operadores lógicos en formas como |
Funciones |
|
Las funciones admitidas se muestran en la siguiente tabla |
Peréntesis |
|
Operaciones combinadas |
Para obtener más ejemplos de combinación de expresiones, consulte qteasy Tutorial 04 - Usar estrategias integradas
op = qt.Operator()
OPERATOR INFO:
=========================
Information of the Module
=========================
Total 0 operation strategies, requiring 0 types of historical data:
0 types of back test price types:
[]
El objeto Operator es un contenedor de estrategias y se puede agregar cualquier cantidad de estrategias comerciales a un objeto Operator. Al mismo tiempo, el método de combinación (licuadora), el método de procesamiento de señales comerciales y el método de operación comercial de la estrategia comercial se pueden administrar en el objeto Operator.
Los atributos y métodos normales de Operator son los siguientes:
Obtener información básica del objeto Operator
op.info()
Imprimir información importante del objeto Operator
op.strategies
Obtenga la lista de todas las estrategias comerciales en el objeto Operator
op.strategy_ids
Obtenga los ID de todas las estrategias comerciales en el objeto Operator
op.strategy_count
Obtenga la cantidad de estrategias comerciales en el objeto Operator
op.signal_type
Tipo de señal del objeto Operator, que representa el significado y el método de procesamiento de las señales comerciales:
“pt”: señal del índice de tenencia objetivo; en este modo, el operador se centra en el índice de tenencia de cada acción componente de una cartera. Mediante compras y ventas oportunas, mantener el índice de tenencia de cada acción componente en un valor objetivo;
“ps”: señal comercial porcentual, en este modo, el operador se centra en la proporción de señales comerciales generadas a intervalos regulares, comprando o vendiendo acciones de acuerdo con las señales comerciales proporcionalmente
“vs”: Señal comercial de cantidad, en este modo, el operador se concentra en las señales comerciales generadas a intervalos regulares, comprando o vendiendo una cierta cantidad de acciones de acuerdo con las señales comerciales
op.op_type
Modo de ejecución del objeto Operator:
“batch”: modo de operación por lotes, en modo de prueba retrospectiva u optimización, genera listas comerciales por adelantado y luego realiza transacciones simuladas en lotes, lo cual es más rápido
“tiempo real”: modo de operación en tiempo real, genera señales comerciales y simula el comercio inmediatamente. Después de generar resultados comerciales simulados, genere la siguiente señal comercial, que es adecuada para el modo de operación en tiempo real o el modo especial de backtesting.
Obtenga una estrategia comercial
op.get_stg(stg_id)
Obtenga el objeto de estrategia por ID de estrategia. Los siguientes métodos tienen el mismo efecto y pueden usarse para obtener estrategias por secuencia numérica
stg = op.get_stg(stg_id)
stg = op[stg_id]
stg = op[stg_idx]
Agregar o modificar la estrategia comercial
op.add_strategy(stg, **kwargs)
Agregue una estrategia a Operator y establezca los parámetros de la estrategia al mismo tiempo
op.add_strategies(strategies)
Agregue una serie de estrategias a Operator en lotes y no puede establecer parámetros de estrategia al mismo tiempo
op.remove_strategy(id_or_pos=None)
Eliminar una estrategia de Operator
op.clear_strategies()
Eliminar todas las estrategias comerciales en Operator
Establecer parámetros de estrategia o parámetros Operator
op.set_parameter(stg_id, pars=None, opt_tag=None, par_range=None, par_types=None, data_freq=None, run_freq=None, window_length=None, data_types=None, strategy_run_timing=None, **kwargs)
Dada una ID de estrategia comercial, establezca los parámetros de la estrategia u otros atributos de esta estrategia comercial
op.set_blender(price_type=None, blender=None)
Establezca el método de combinación de la estrategia comercial. Cuando hay múltiples estrategias comerciales en Operator, cada estrategia comercial se ejecuta por separado para generar múltiples conjuntos de señales comerciales y luego genera un conjunto de señales comerciales de acuerdo con reglas comerciales definidas por el usuario.
Podemos usar el siguiente código para agregar la estrategia DMA recién creada a Operator y establecer los parámetros de estrategia necesarios
Todas las configuraciones de parámetros se pueden realizar utilizando el método operator.set_parameter y se pueden pasar varios parámetros al mismo tiempo. Al configurar el opt_tag de la estrategia, puede controlar si la estrategia participa en la optimización, mientras que el parámetro par_range define el espacio de parámetros necesario para la optimización de la estrategia. En este momento, no sabemos cuáles son los parámetros de sincronización óptimos de DMA para los últimos 15 años del índice CSI 300, por lo que podemos ingresar algunos parámetros aleatorios para realizar una prueba retrospectiva y ver cómo funciona.
op.clear_strategies()
op.add_strategy(stg, pars=(26, 35, 189), opt_tag=1)
print(f'Operator strategies: {op.strategies}')
print(f'Strategy IDs are: {op.strategy_ids}')
op.info(verbose=True)
Operator strategies: [RULE-ITER(DMA)]
Strategy IDs are: ['custom']
OPERATOR INFO:
=========================
Information of the Module
=========================
Total 1 operation strategies, requiring 1 types of historical data:
close
1 types of back test price types:
['close']
for backtest histoty price type - close:
[RULE-ITER(DMA)]:
no blender
Parameters of GeneralStg Strategies:
Strategy_type: RuleIterator
Strategy name: DMA
Description: Quick DMA strategy, determine long/short position according to differences of moving average prices with simple timing strategy
Strategy Parameter: (26, 35, 189)
Strategy Properties Property Value
---------------------------------------
Parameter count 3
Parameter types ['int', 'int', 'int']
Parameter range [(10, 250), (10, 250), (10, 250)]
Data frequency d
Sample frequency d
Window length 270
Data types ['close']
=========================
Configurar los parámetros de backtesting de qteasy
Las pruebas retrospectivas pueden comenzar después de que se crea el objeto Operator y se agregan estrategias
qteasy proporciona parámetros de entorno enriquecidos para controlar el proceso específico de backtesting. Todos los valores de las variables de los parámetros de entorno se pueden ver a través de qt.Configuration() y configurar a través de qt.Configure().
qt.configuration()
Marque qteasy variables de entorno en ejecución
qt.configure()
Establecer qteasy variables de entorno de ejecución
Los parámetros de variables de entorno relacionados con el backtesting incluyen:
Acciones/índice objetivo para realizar pruebas retrospectivas
Periodo de inicio y finalización del backtesting.
Monto de inversión inicial para backtesting
Tarifas comerciales y reglas comerciales para el backtesting
Índice de referencia para evaluar los resultados comerciales
Todos los parámetros comerciales de backtesting anteriores se pueden configurar a través de qt.configure()
qt.configure(
mode=1, # 设置运行模式为:1-回测模式
benchmark_asset = '000300.SH', # 设置交易评价基准(类型由系统根据代码自动推断)
asset_pool = '000300.SH', # 设置交易资产组合
asset_type = 'IDX', # 交易资产组合的资产类型
trade_batch_size = 0.01, # 设置允许最小交易批量(最小0.01)
invest_start = '20100105', # 设置交易开始日期
invest_end = '20201231', # 设置交易终止日期
invest_cash_amounts = [1000000], # 设置初始交易投资金额为十万元
visual=True # 输出可视化交易结果图表
)
Inicie qteasy y ejecute Operator
qt.run(operator, **config)
Comience a ejecutar Operator. Dependiendo del modo de operación, qteasy ingresará diferentes modos de operación y generará diferentes resultados:
modo 0 Modo en tiempo real: lea los datos más recientes (en tiempo real) y genere las últimas señales comerciales. En este modo, puede configurar qteasy para que se ejecute periódicamente, lea los datos más recientes periódicamente y genere señales comerciales en tiempo real periódicamente.
modo 1 Modo de prueba retrospectiva: lea datos históricos durante un período de tiempo, genere señales comerciales utilizando esos datos y simule operaciones para generar los resultados de las operaciones simuladas.
modo 2 Modo de optimización: lea datos históricos durante un período de tiempo, ejecute repetidamente el mismo conjunto de estrategias comerciales pero use diferentes combinaciones de parámetros para buscar los parámetros de estrategia con mejor rendimiento durante este período.
Operator se puede iniciar ejecutando qteasy.run(operator, **config), donde **config es el parámetro del entorno de prueba. Las variables de entorno pasadas como parámetros en qt.run() solo son válidas para esta ejecución, pero las variables de entorno establecidas en qt.configure() seguirán siendo válidas hasta que se cambien la próxima vez.
Los activos finales de la prueba retrospectiva son 190.000 yuanes, el rendimiento anualizado es de solo el 4,83%, el índice de Sharpe es de solo 0,0783 y el rendimiento es inferior al del índice CSI 300 durante el mismo período.
qt.run(op)
El sistema leerá automáticamente los datos históricos, realizará pruebas retrospectivas, completará la evaluación de resultados e imprimirá el informe de pruebas retrospectivas después de ejecutar qteasy.
El informe de backtesting incluirá la siguiente información:
Tiempo total necesario para el backtesting
Fechas de inicio y finalización del intervalo de backtesting, duración y otra información
Estadísticas comerciales: como número de compras, número de ventas, índice de posición llena, índice de posición vacía, costos comerciales totales, etc.
Información de retorno: monto de inversión inicial, monto de activo final, tasa de retorno total, tasa de retorno anualizada, tasa de retorno total de referencia, tasa de retorno anualizada de referencia, curtosis y asimetría de la tasa de retorno
Indicadores para la evaluación de carteras: Alfa, Beta, ratio de Sharpe, ratio de información, volatilidad y reducción máxima
====================================
| |
| BACK TESTING RESULT |
| |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 1s 164.2ms
time consumption for operation back looping: 6s 720.2ms
investment starts on 2010-01-05 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 11.0 years.
-------------operation summary:------------
Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH 53 53 106 54.0% 0.0% 46.0%
Total operation fee: ¥ 20,382.34
total investment amount: ¥1,000,000.00
final value: ¥1,052,696.57
Total return: 5.27%
Avg Yearly return: 0.47%
Skewness: -0.76
Kurtosis: 11.44
Benchmark return: 46.22%
Benchmark Yearly return: 3.52%
------strategy loop_results indicators------
alpha: -0.047
Beta: 1.000
Sharp ratio: -0.077
Info ratio: -0.018
250 day volatility: 0.156
Max drawdown: 46.12%
peak / valley: 2010-11-08 / 2014-06-19
recovered on: 2015-04-17
===========END OF REPORT=============
A excepción del informe de backtesting, también se imprimirá un gráfico visual que muestra información detallada de todo el proceso de backtesting.
La siguiente información se mostrará en este cuadro de información:
Curva de tasa de retorno de todo el historial de backtesting (que muestra el período de tenencia, puntos de compra/venta, curva de tasa de retorno de referencia y período máximo de reducción)
Curva de tasa de retorno y punto de referencia en escala logarítmica
Gráfico de cambio de tasa de retorno diario
Gráfico de cambio de índice de Sharpe y tasa alfa (evaluación de rentabilidad de la cartera)
Gráfico de volatilidad de Rooling y cambio de tasa beta (evaluación de riesgo de cartera)
Gráfico de análisis de reducción (gráfico submarino)
Mapa de calor y gráfico de barras de la tasa de retorno mensual y anual
Histograma de frecuencia estadística de tasa de retorno mensual

Se puede establecer una gran cantidad de parámetros en el proceso comercial simulado de qteasy, como por ejemplo:
Cantidad total de fondos invertidos, fecha o programado para invertir en lotes varias veces;
Tarifas comerciales para compra y venta, incluida la tasa de comisión, tarifa mínima, tarifa fija y deslizamiento. Se pueden establecer varias tarifas por separado para compra y venta.
Tiempo de entrega de transacciones de compra y venta, es decir, sistema de entrega T+N
Tamaño mínimo de lote para transacciones de compra y venta, por ejemplo, si se permiten acciones fraccionarias o si se requieren acciones enteras o incluso cientos de acciones para negociar.
Los resultados finales del backtesting impreso son los resultados finales después de considerar todos los parámetros comerciales anteriores, para que pueda ver los costos comerciales totales. Para conocer la configuración detallada de los parámetros comerciales, consulte la documentación detallada.
Además, qteasy también proporciona varios indicadores sobre el desempeño de la estrategia: alfa y beta son 0,067 y 1,002 respectivamente, mientras que el índice de Sharpe es 0,041. La máxima caída se produjo del 3 de agosto de 2009 al 10 de julio de 2014, con una caída del 35,0%, y no fue hasta el 16 de diciembre de 2014 que se dio la vuelta.
En los resultados de las pruebas anteriores, configuramos el parámetro visual=False. Si configuramos visual=True, podemos obtener resultados de backtesting visuales en forma de gráficos y proporcionar información visual:
Curva de capital de la estrategia de inversión.
Curva histórica de datos de referencia (índice CSI 300)
Puntos de compra y venta (se muestran con flechas rojas y verdes en los datos de referencia)
Período de tenencia (el verde indica tenencia)
Indicadores de evaluación de la estrategia de inversión (alfa, agudo, etc.)
Análisis de reducciones (que muestra las cinco reducciones más importantes)
Mapa de calor de tasa de retorno, gráfico de acumulación de montañas y otros gráficos
qteasy proporciona opciones ricas de backtesting de estrategias, tales como:
Fecha de inicio y finalización del backtesting
Indicadores de evaluación de la estrategia de inversión
Si se permiten posiciones negativas durante el backtesting (se utiliza para simular el comportamiento de venta en corto en el comercio de futuros, o se pueden usar algoritmos especiales de simulación del comercio de futuros)
Se pueden encontrar más opciones en la documentación detallada.
Optimización de la estrategia de sincronización única.
Obviamente, los parámetros no optimizados no pueden lograr resultados de backtesting ideales, por lo que debemos realizar una optimización.
Podemos configurar el método de optimización y controlar el proceso de optimización configurando varios parámetros del objeto de contexto: Los significados de los siguientes parámetros son los siguientes:
El método de optimización se establece en 1 y se utiliza la optimización Monte Carlo, que tiene una buena capacidad de optimización para un espacio de parámetros más grande.
La cantidad del resultado de salida se establece en 30
El número de iteraciones en el proceso de optimización es 1000.
Si el parámetro paralelo se establece en Verdadero, todos los núcleos del procesador multinúcleo se utilizarán para la computación paralela para ahorrar tiempo.
Luego comience la optimización, utilizando las variables perfs_dma y pars_dma para almacenar los resultados de la optimización. Se mostrará una barra de progreso durante el proceso de optimización y los resultados de la optimización se mostrarán una vez finalizado.
pars_dma = qt.run(op,
mode=2,
opti_method=1,
opti_sample_count=1000,
opti_start='20101231',
opti_end='20201231',
opti_cash_dates='20101231',
test_start='20101231',
test_end='20201231',
test_cash_dates='20101231',
parallel=True)
print(f'optimization completed, 50 parameters found, they are\n'
f'{pars_dma}')
[########################################]1000/1000-100.0% best performance: 340613.629
Optimization completed, total time consumption: 38"247
[########################################]30/30-100.0% best performance: 340613.629
====================================
| |
| OPTIMIZATION RESULT |
| |
====================================
qteasy running mode: 2 - Strategy Parameter Optimization
investment starts on 2010-12-31 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 10.0 years.
total investment amount: ¥ 100,000.00
Reference index type is 000300.SH at IDX
Total Benchmark rtn: 66.59%
Average Yearly Benchmark rtn rate: 5.23%
statistical analysis of optimal strategy messages indicators:
total return: 161.24% ± 29.73%
annual return: 10.01% ± 1.18%
alpha: 0.048 ± 0.014
Beta: 1.001 ± 0.001
Sharp ratio: 0.625 ± 0.089
Info ratio: 0.013 ± 0.004
250 day volatility: 0.151 ± 0.006
other messages indicators are listed in below table
Strategy items Sell-outs Buy-ins ttl-fee FV ROI Benchmark rtn MDD
0 (147, 157, 57) 25.0 25.0 1,213.16 231,710.13 131.7% 66.6% 38.1%
1 (88, 108, 127) 16.0 15.0 1,009.93 233,554.10 133.6% 66.6% 44.3%
2 (105, 160, 29) 21.0 20.0 1,344.78 232,247.09 132.2% 66.6% 26.4%
3 (149, 194, 24) 19.0 19.0 1,062.61 233,932.11 133.9% 66.6% 33.4%
4 (105, 185, 25) 18.0 17.0 1,094.07 236,171.54 136.2% 66.6% 40.6%
5 (86, 147, 107) 11.0 10.0 668.08 234,827.39 134.8% 66.6% 39.7%
6 (88, 157, 101) 11.0 10.0 715.01 236,851.09 136.9% 66.6% 31.6%
7 (144, 181, 57) 19.0 19.0 1,093.20 240,445.16 140.4% 66.6% 33.8%
8 (94, 165, 78) 12.0 11.0 724.66 240,825.90 140.8% 66.6% 38.1%
9 (68, 113, 142) 13.0 12.0 819.42 244,805.70 144.8% 66.6% 42.5%
10 (80, 64, 57) 30.0 30.0 1,767.04 245,084.54 145.1% 66.6% 28.8%
11 (101, 124, 65) 23.0 22.0 1,726.89 245,504.45 145.5% 66.6% 30.7%
12 (150, 189, 33) 20.0 20.0 1,142.62 246,185.41 146.2% 66.6% 34.3%
13 (119, 200, 30) 12.0 11.0 705.66 248,111.42 148.1% 66.6% 24.1%
14 (52, 111, 136) 14.0 13.0 810.29 254,764.49 154.8% 66.6% 40.5%
15 (55, 151, 87) 14.0 13.0 896.37 248,370.33 148.4% 66.6% 38.2%
16 (98, 129, 45) 22.0 21.0 1,480.50 252,764.13 152.8% 66.6% 37.1%
17 (101, 59, 50) 27.0 26.0 1,505.08 255,487.88 155.5% 66.6% 28.8%
18 (179, 240, 25) 19.0 19.0 1,149.62 259,380.09 159.4% 66.6% 33.8%
19 (82, 127, 144) 12.0 11.0 810.46 268,321.59 168.3% 66.6% 37.4%
20 (44, 135, 117) 13.0 12.0 741.60 268,837.16 168.8% 66.6% 42.6%
21 (103, 127, 57) 22.0 21.0 1,628.33 269,776.04 169.8% 66.6% 30.3%
22 (128, 152, 92) 15.0 15.0 883.81 272,170.16 172.2% 66.6% 32.6%
23 (91, 198, 13) 17.0 16.0 1,209.55 277,214.25 177.2% 66.6% 43.3%
24 (102, 110, 129) 26.0 25.0 2,056.58 311,876.36 211.9% 66.6% 33.4%
25 (129, 204, 16) 14.0 14.0 840.49 279,142.60 179.1% 66.6% 32.6%
26 (90, 185, 45) 11.0 10.0 735.84 279,320.37 179.3% 66.6% 40.6%
27 (104, 111, 107) 30.0 29.0 2,207.23 317,371.14 217.4% 66.6% 41.0%
28 (101, 150, 24) 23.0 22.0 2,012.97 331,442.65 231.4% 66.6% 26.4%
29 (104, 142, 87) 15.0 14.0 1,044.25 340,613.63 240.6% 66.6% 23.5%
===========END OF REPORT=============
[########################################]30/30-100.0% best performance: 340613.629
====================================
| |
| OPTIMIZATION RESULT |
| |
====================================
qteasy running mode: 2 - Strategy Parameter Optimization
investment starts on 2010-12-31 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 10.0 years.
total investment amount: ¥ 100,000.00
Reference index type is 000300.SH at IDX
Total Benchmark rtn: 66.59%
Average Yearly Benchmark rtn rate: 5.23%
statistical analysis of optimal strategy messages indicators:
total return: 161.24% ± 29.73%
annual return: 10.01% ± 1.18%
alpha: 0.048 ± 0.014
Beta: 1.001 ± 0.001
Sharp ratio: 0.625 ± 0.089
Info ratio: 0.013 ± 0.004
250 day volatility: 0.151 ± 0.006
other messages indicators are listed in below table
Strategy items Sell-outs Buy-ins ttl-fee FV ROI Benchmark rtn MDD
0 (105, 160, 29) 21.0 20.0 1,344.78 232,247.09 132.2% 66.6% 26.4%
1 (88, 108, 127) 16.0 15.0 1,009.93 233,554.10 133.6% 66.6% 44.3%
2 (147, 157, 57) 25.0 25.0 1,213.16 231,710.13 131.7% 66.6% 38.1%
3 (105, 185, 25) 18.0 17.0 1,094.07 236,171.54 136.2% 66.6% 40.6%
4 (88, 157, 101) 11.0 10.0 715.01 236,851.09 136.9% 66.6% 31.6%
5 (149, 194, 24) 19.0 19.0 1,062.61 233,932.11 133.9% 66.6% 33.4%
6 (144, 181, 57) 19.0 19.0 1,093.20 240,445.16 140.4% 66.6% 33.8%
7 (86, 147, 107) 11.0 10.0 668.08 234,827.39 134.8% 66.6% 39.7%
8 (68, 113, 142) 13.0 12.0 819.42 244,805.70 144.8% 66.6% 42.5%
9 (94, 165, 78) 12.0 11.0 724.66 240,825.90 140.8% 66.6% 38.1%
10 (150, 189, 33) 20.0 20.0 1,142.62 246,185.41 146.2% 66.6% 34.3%
11 (101, 124, 65) 23.0 22.0 1,726.89 245,504.45 145.5% 66.6% 30.7%
12 (80, 64, 57) 30.0 30.0 1,767.04 245,084.54 145.1% 66.6% 28.8%
13 (119, 200, 30) 12.0 11.0 705.66 248,111.42 148.1% 66.6% 24.1%
14 (55, 151, 87) 14.0 13.0 896.37 248,370.33 148.4% 66.6% 38.2%
15 (98, 129, 45) 22.0 21.0 1,480.50 252,764.13 152.8% 66.6% 37.1%
16 (52, 111, 136) 14.0 13.0 810.29 254,764.49 154.8% 66.6% 40.5%
17 (101, 59, 50) 27.0 26.0 1,505.08 255,487.88 155.5% 66.6% 28.8%
18 (179, 240, 25) 19.0 19.0 1,149.62 259,380.09 159.4% 66.6% 33.8%
19 (82, 127, 144) 12.0 11.0 810.46 268,321.59 168.3% 66.6% 37.4%
20 (44, 135, 117) 13.0 12.0 741.60 268,837.16 168.8% 66.6% 42.6%
21 (103, 127, 57) 22.0 21.0 1,628.33 269,776.04 169.8% 66.6% 30.3%
22 (128, 152, 92) 15.0 15.0 883.81 272,170.16 172.2% 66.6% 32.6%
23 (91, 198, 13) 17.0 16.0 1,209.55 277,214.25 177.2% 66.6% 43.3%
24 (129, 204, 16) 14.0 14.0 840.49 279,142.60 179.1% 66.6% 32.6%
25 (90, 185, 45) 11.0 10.0 735.84 279,320.37 179.3% 66.6% 40.6%
26 (104, 111, 107) 30.0 29.0 2,207.23 317,371.14 217.4% 66.6% 41.0%
27 (102, 110, 129) 26.0 25.0 2,056.58 311,876.36 211.9% 66.6% 33.4%
28 (101, 150, 24) 23.0 22.0 2,012.97 331,442.65 231.4% 66.6% 26.4%
29 (104, 142, 87) 15.0 14.0 1,044.25 340,613.63 240.6% 66.6% 23.5%
===========END OF REPORT=============

optimization completed, 50 parameters found, they are
[(147, 157, 57), (105, 160, 29), (88, 108, 127), (149, 194, 24), (86, 147, 107), (105, 185, 25), (88, 157, 101), (144, 181, 57), (94, 165, 78), (68, 113, 142), (80, 64, 57), (101, 124, 65), (150, 189, 33), (119, 200, 30), (55, 151, 87), (98, 129, 45), (52, 111, 136), (101, 59, 50), (179, 240, 25), (82, 127, 144), (44, 135, 117), (103, 127, 57), (128, 152, 92), (91, 198, 13), (129, 204, 16), (90, 185, 45), (102, 110, 129), (104, 111, 107), (101, 150, 24), (104, 142, 87)]
Después de la optimización, podemos ver treinta conjuntos de mejores parámetros, e incluso el peor puede lograr un activo final de más de 60.000 yuanes. Podemos seleccionar manualmente los mejores parámetros entre ellos y realizar otro backtest:
Podemos encontrar que el valor final se ha disparado desde los 19.000 del último backtest hasta los 124.000, con una rentabilidad anualizada del 18,9%, y el ratio de Sharpe también ha subido hasta el 0,833.
op.set_parameter('dma', pars=(104, 142, 87))
qt.run(op,
mode=1, visual=True)
Los resultados del backtesting de salida son los siguientes:
====================================
| |
| BACK TESTING RESULT |
| |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 55.7ms
time consumption for operation back looping: 885.7ms
investment starts on 2010-12-31 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 10.0 years.
-------------operation summary:------------
Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH 15 14 29 52.6% 0.0% 47.4%
Total operation fee: ¥ 1,044.25
total investment amount: ¥ 100,000.00
final value: ¥ 340,613.63
Total return: 240.61%
Avg Yearly return: 13.03%
Skewness: -0.78
Kurtosis: 13.36
Benchmark return: 66.59%
Benchmark Yearly return: 5.23%
------strategy loop_results indicators------
alpha: 0.087
Beta: 1.001
Sharp ratio: 0.751
Info ratio: 0.020
250 day volatility: 0.140
Max drawdown: 23.53%
peak / valley: 2015-12-31 / 2016-01-28
recovered on: 2017-08-28
===========END OF REPORT=============

Crear una estrategia personalizada
qteasy no solo permite el uso de estrategias integradas, sino también la creación de estrategias personalizadas. A continuación se muestra un ejemplo sencillo que define una estrategia comercial de rotación simple.