7. Construye tu primera estrategia
qteasy es un conjunto de herramientas de análisis comercial cuantitativo para implementación y operación totalmente localizado, con las siguientes funciones:
Adquirir, limpiar, almacenar, procesar, visualizar y utilizar 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 tiempo real de estrategias comerciales.
Comprenderá las funciones básicas y el uso de qteasy a través de una serie de ejemplos prácticos en esta serie de tutoriales.
7.1. Antes de empezar
Asegúrese de dominar el siguiente contenido antes de comenzar este tutorial:
Instale y actualice
qteasya la última versión y complete la configuración de inicialización deqteasyPrepare la fuente de datos local, domine el método de descarga de diversos datos financieros y pueda descargar varios datos históricos de precios, datos de estados financieros, etc. de índices y acciones al local.
En el [tutorial anterior] (2.0-get-data.md), expliqué cómo configurar una fuente de datos local, buscar y descargar datos financieros localmente y extraer datos de la fuente de datos local. Si aún no ha completado este paso, consulte el tutorial anterior para aprender cómo descargar y trabajar con los datos.
7.2. Objetivo de este capítulo
Probaremos una estrategia comercial de rotación de pequeña y gran capitalización mediante la creación del módulo qteasy en este capítulo.
La rotación de gran-pequeña capitalización es una estrategia comercial muy básica y común. Esta estrategia comercial captura las características del ascenso y la caída asincrónicas de las acciones de gran capitalización y de pequeña capitalización, y alternativamente mantiene acciones de gran capitalización y acciones de pequeña capitalización con la esperanza de obtener mayores rendimientos. Al crear esta estrategia comercial, podemos comprender fácilmente cómo usar qteasy para crear estrategias comerciales, llamar a estrategias comerciales de prueba histórica de precios, analizar el desempeño de las estrategias y mejorarlas.
Ahora, necesitamos crear la estrategia de rotación más simple: rotar entre los dos índices mencionados anteriormente y mantener el índice con el mayor aumento posible en el futuro todos los días:
Calcule el aumento de los dos índices en los últimos 20 días, es decir, el aumento del precio de hoy en relación con el precio de hace 20 días.
Elija el índice con el aumento mayor, manténgalo al día siguiente y venda el índice con el aumento menor.
7.3. Realizar la estrategia
De acuerdo con la idea de estrategia anterior, podemos implementar fácilmente dicha estrategia de selección de acciones de rotación en qteasy, porque qteasy tiene casi 70 estrategias comerciales integradas, todas las estrategias integradas tienen nombres únicos y estas estrategias integradas se pueden usar directamente haciendo referencia a los nombres. Todas las estrategias comerciales en qteasy deben incluirse en un objeto llamado Operator, que en realidad es un contenedor de estrategias. Se puede entender que un comerciante puede gestionar múltiples estrategias al mismo tiempo y ejecutar estas estrategias al mismo tiempo para generar señales comerciales.
Se puede crear un objeto Operator directamente a través de qt.Operator(), y se puede pasar el parámetro strategies al crear para crear estrategias comerciales al mismo tiempo:
>>> import qteasy as qt
>>> op = qt.Operator(
... strategies = 'ndayrate', # 创建交易员对象时,同时创建一个交易策略“ndayrate”
... run_freq='d', # 交易策略的运行频率为每天运行一次
... run_timing='close', # 交易策略的运行时机为每天股票收盘时运行
... )
Con el código anterior, ya hemos creado una estrategia de selección de acciones de un solo factor (ndayrate) en qteasy. Esta estrategia es una estrategia de selección de acciones incorporada: selecciona acciones en función del «aumento de precio de N días». Su lógica de selección es evaluar el aumento de precio de N días de todas las acciones en el grupo de acciones y luego seleccionar acciones o activos en función de ese aumento de precio (por supuesto, el método de selección se configura mediante parámetros, que se mencionarán a continuación).
Con la función qt.built_ins(), puede ver descripciones detalladas de las estrategias integradas:
>>> qt.built_in_doc('ndayrate', print_out=True)
El resultado es el siguiente:
以股票过去N天的价格或数据指标的变动比例作为选股因子选股
基础选股策略:根据股票以前n天的股价变动比例作为选股因子
策略参数:
n: int, 股票历史数据的选择期
信号类型:
PT型: 百分比持仓比例信号
信号规则:
在每个选股周期使用过去N日内价格变动率作为选股因子进行选股
通过以下策略属性控制选股方法:
- max_sel_count: float, 选股限额,表示最多选出的股票的数量,默认值: 0.5,表示选中50%的股票
- condition: str , 确定股票的筛选条件,默认值any
- any :默认值,选择所有可用股票
- greater :筛选出因子大于ubound的股票
- less :筛选出因子小于lbound的股票
- between :筛选出因子介于lbound与ubound之间的股票
- not_between:筛选出因子不在lbound与ubound之间的股票
- lbound: float, 执行条件筛选时的指标下界, 默认值np.-inf
- ubound: float, 执行条件筛选时的指标上界, 默认值np.inf
- sort_ascending: bool, 排序方法,默认值: False,
- True: 优先选择因子最小的股票,
- False, 优先选择因子最大的股票
- weighting: str , 确定如何分配选中股票的权重,默认值: even
- even :所有被选中的股票都获得同样的权重
- linear :权重根据因子排序线性分配
- distance :股票的权重与他们的指标与最低之间的差值(距离)成比例
- proportion :权重与股票的因子分值成正比
策略属性缺省值:
默认参数: (14,)
数据类型: close 收盘价,单数据输入
窗口长度: 150
参数范围: [(2, 150)]
策略不支持参考数据,不支持交易数据
Ahora se han creado un objeto Operator y una estrategia comercial.
Podemos usar Operator.info() para ver información detallada sobre el objeto comercial y las estrategias comerciales. Mientras tanto, podemos acceder a todas las estrategias comerciales a través del atributo Operator.strategies.
>>> op.info()
>>> stg = op.strategies[0] # 获取op的第一个策略,下面的几种方法是等效的
>>> # stg = op[0]
>>> # stg = op['ndayrate']
>>> # stg = op.get_strategy_by_id('ndayrate')
El resultado es el siguiente:
==============================Operator Information==============================
Name: None
Run Mode: batch - All history operation signals are generated before back testing
Groups: 1 Strategy(s) in 1 Group(s)
------------------------------------Group_1-------------------------------------
Signal Type: pt - Position Target, signal represents position holdings in percentage of total value
Run Timing: close @ d - days
Strategies (1): ['ndayrate']
Signal blenders: ndayrate
------------------------------Strategies in group-------------------------------
stg_id name parameters
--------------------------------------------------------------------------------
ndayrate N-DAY RATE (14,)
================================================================================
También puede ver información y parámetros de estrategia más detallados a través del método info() de la estrategia comercial:
>>> stg.info()
Salida de la siguiente manera
============================= Strategy: N-DAY RATE =============================
Strategy FACTOR(N-DAY RATE)
Parameters: ['n'] = (14,)
Date Types: close_ANY_d x 150
----------------------------- Selection Properties -----------------------------
Max select count 50.0%
Sort Ascending False
Weighting even
Filter Condition any
Filter ubound inf
Filter lbound -inf
Podemos ver en la información anterior que la estrategia ndayrate tiene muchos parámetros configurables. Al ajustar estos parámetros, podemos ajustar el método de selección de acciones de la estrategia, ajustando así el rendimiento de la estrategia comercial.
Ahora, necesitamos realizar algunos ajustes básicos para asegurarnos de que esta estrategia de selección de acciones seleccione las acciones que queremos. Todos los parámetros del objeto Operator se pueden implementar mediante el método op.set_parameter().
>>> op.set_parameter(0, # 指定需要设置参数的交易策略:即设置策略0的参数
... sort_ascending=False, # 设置选择涨幅最大的指数
... max_sel_count=1, # 设置选股数量,每次最多从投资池里选择一支股票
... par_values=(20, ), # 策略参数N=20,比较20日涨幅
... data_types=[qt.StgData('close', # 使用收盘价计算涨幅
freq='d', # 使用每日收盘价
asset_type='ANY', # 适用于任何类型的资产
use_latest_data_cycle=True, # 使用最新的数据周期,每次选股数据包括当天收盘价在内
window_length=25, # 数据窗口长度为25天
)],
... )
En el fragmento de código anterior, configuramos el comportamiento básico de la estrategia de selección de acciones a través de varias configuraciones de parámetros simples:
sort_ascending=False: Orden de clasificación: esta estrategia ordena la métrica de selección y toma las entradas principales. Debido a que necesita el mayor rendimiento, debe ordenarse en orden descendente. Si desea el retorno más pequeño, establezcasort_ascending=True.max_sel_count=1: Número de valores seleccionados: Este parámetro controla la cantidad de valores seleccionados. Como siempre elige uno de dos índices, este parámetro se establece en 1.par_values=(20, ): Valores de los parámetros de la estrategia: esta estrategia utiliza un parámetro ajustable N, lo que significa que selecciona valores en función del rendimiento de N días. Establecerlo en 20 significa utilizar el rendimiento del precio de 20 días como factor de selección.data_types=[qt.StgData(...)]: Tipos de datos: Determina qué datos utiliza la estrategia para calcular el factor de selección. Aquí se utiliza un objeto StgData que contiene los siguientes parámetros:freq='d': Aquí utilizamos el precio de cierre para calcular los rendimientos del precio y establecemos la longitud de la ventana en 25, de modo que cada vez que se ejecute la estrategia, leerá el día actual yasset_type='ANY': Tipo de activo: Esta estrategia aplica para cualquier tipo de activo. Por supuesto, también se puede configurar para un tipo de activo específico, como acciones, índices, fondos, etc.use_latest_data_cycle=True: Ciclo de datos: este parámetro controla el ciclo de datos utilizado cada vez que se ejecuta la estrategia. Establecerlo en Verdadero significa utilizar el último ciclo de datos, es decir, cada selección de acciones incluye el precio de cierre de ese día. Si se establece en False, los datos vistos por cada ejecución de estrategia no incluyen el precio de cierre de ese día. En operaciones reales, en realidad es imposible operar utilizando el precio de cierre exacto del día, porque no se puede operar después del cierre del mercado. Sin embargo, podemos operar utilizando el precio en tiempo real un minuto antes del cierre; este precio suele estar muy cerca del precio de cierre. En este caso, utilizar el precio de cierre del día es un enfoque de backtesting simplificado.window_length=25: longitud de la ventana de datos. qteasy garantiza que cada vez que se ejecuta la estrategia, solo pueda ver datos de un período retrospectivo desde el tiempo de ejecución actual, evitando así el sesgo de anticipación. Establecerlo en 25 significa que cada vez que seleccione acciones, solo podrá ver los 25 precios desde hace 25 días hasta el día actual, lo que garantiza que haya suficientes datos al calcular el rendimiento de 20 días.
Preparar datos de backtest
Después de configurar la estrategia de selección de acciones, es necesario verificar el desempeño de la estrategia mediante pruebas retrospectivas, es decir, llamar a los datos históricos reales de los dos índices Shanghai y Shenzhen 300 y ChiNext, realizar operaciones simuladas y ver si los resultados de las operaciones simuladas pueden superar al mercado. En la práctica, no es fácil comprar y vender índices de gran capitalización, pero en general es fácil encontrar fondos ETF que sigan índices de gran capitalización para reemplazar los índices de gran capitalización. Para simplificar, invertiremos en los índices Shanghai y Shenzhen 300 y ChiNext desde el 1 de enero de 2011 hasta el 31 de diciembre de 2020, suponiendo una tasa de comisión de transacción de una milésima, y veremos cómo son los resultados de la inversión.
Anteriormente, aprendimos cómo descargar datos históricos. Aquí necesitamos todos los datos de los índices Shanghai y Shenzhen 300 y ChiNext desde 2013 hasta finales de 2022.
Nota Al descargar datos históricos para realizar pruebas retrospectivas, los datos descargados deben ser superiores al punto de inicio de la fecha de la prueba retrospectiva. Por ejemplo, si el backtesting comienza el 1 de enero de 2013, en realidad se necesitan más datos, por lo que el punto de partida de los datos descargados debería comenzar en septiembre de 2012. Para obtener un análisis detallado de esto, consulte el documento de referencia
Descargue los datos históricos correspondientes utilizando el siguiente código:
>>> qt.refill_data_source(tables='index_daily', symbols='399006, 000300', start_date='20100901', end_date='20201231')
Confirme si los datos se descargaron correctamente:
>>> qt.candle('000300.SH', start='20110101', end='20201231', asset_type='IDX', mav=[])
>>> qt.candle('399001.SZ', start='20110101', end='20201231', asset_type='IDX', mav=[])


Configurar parámetros de prueba retrospectiva
Una vez que los datos estén listos, puede comenzar a configurar los parámetros de backtest y comenzar a realizar backtesting. La estrategia de backtesting de qteasy está completamente parametrizada. Antes de realizar el backtesting, debemos informarle al sistema toda la información relevante, como la variedad de productos de inversión, la cantidad de fondos invertidos, las fechas de inicio y finalización del backtesting, el método de cálculo de la tarifa de transacción durante el backtesting y el lote de transacciones, etc. Podemos usar qt.configure() para configurar los parámetros del backtest:
>>> qt.configure(asset_pool=['000300.SH',
... '399006.SZ'], # 投资股票池里包括沪深300和创业板指数两个指数,分别代表大盘和小盘股
... invest_cash_amounts=[100000], # 投入金额为十万元
... asset_type='IDX', # 为简单起见,直接投资于指数
... cost_rate_buy=0.0001, # 买入资产时交易费用万分之一
... cost_rate_sell=0.0001, # 卖出资产时的交易费用为万分之一
... invest_start='20110101', # 模拟交易开始日期
... invest_end='20201231', # 模拟交易结束日期
... trade_batch_size=0.01, # 买入资产时最小交易批量
... sell_batch_size=0.01, # 卖出资产时最小交易批量
... )
El significado de la configuración anterior es el siguiente
asset_pool=['000300.SH', '399006.SZ']:El índice objetivo de inversión se proporciona en forma de lista. Si desea invertir en otros índices o fondos ETF, puede pasar directamente el código de seguridad. Si desea seleccionar acciones de tres o más valores, puede agregarlas directamente a la lista.invest_amounts=100000:El monto de la inversión es de cien mil yuanes. Si necesita simular varias inversiones por lotes, también puede pasar una lista, pero debe especificar la fecha específica de cada inversión por separado.asset_type='IDX':Tipo de objetivo de inversión:'E'representa acciones,'IDX'representa índices,'FD'representa fondos,'FT'representa futuros,'OPT'representa opcionescost_rate_buy=0.0001:Establece la relación de tarifas de transacción de compra y venta.qteasytambién admite la configuración de la tarifa mínima, la tarifa fija, etc. Aquí, solo es necesario establecer la tarifa.cost_rate_sell=0.0001:invest_start='20110101':Fecha de inicio del comercio de simulacióninvest_end='20201231':Fecha de finalización del comercio de simulacióntrade_batch_size=0.01: el tamaño mínimo del lote comercial al comprar activos; el mínimo permitido es0.01. Un valor de 1 significa que sólo puede negociar acciones/unidades enteras; aquí puede ingresar cualquier número mayor o igual a0.01.sell_batch_size=0.01: el tamaño mínimo del lote comercial al vender activos; el mínimo permitido es0.01.
qteasy también tiene otros parámetros de configuración; consulte la QTEASY documentación.
7.4. Resultados del backtesting de la estrategia
Es muy sencillo realizar una prueba retrospectiva de la estrategia de qteasy. Después de establecer todas las configuraciones, puede comenzar a realizar pruebas retrospectivas. Puede llamar al qt.run() para comenzar a realizar pruebas retrospectivas. Al mismo tiempo, habilitamos la salida de gráficos visuales y el registro de detalles comerciales abiertos:
>>> res = qt.run(op, mode=1, visual=True, trade_log=True) # 调用qteasy的run方法,启动回测交易
Después de esperar un momento, se completa la prueba retrospectiva y qteasy imprimirá el informe de prueba retrospectiva en el terminal.
El resultado es el siguiente:
En el informe, puede ver directamente una comparación entre el rendimiento total de nuestra inversión y el rendimiento del índice CSI 300 durante el mismo período:
====================================
| |
| BACKTEST REPORT |
| |
====================================
qteasy running mode: 1 - History back testing
... 内容略,详见下文报告解析
-------------operation summary:------------
... 内容略,详见下文报告解析
Total operation fee: ¥ 10,666.34
total investment amount: ¥ 100,000.00 # 投入的总金额为十万元
final value: ¥ 611,231.20 # 回测结束时的资产总额
Total return: 511.23% # 投资的总收益率
Avg Yearly return: 19.86% # 投资的年化收益率为19.86%
... 内容略,详见下文报告解析
Benchmark return: 60.32% # 同期沪深300指数的总回报率为60.32%
Benchmark Yearly return: 4.84% # 同期沪深300指数的年化收益率仅有4.84%
------strategy loop_results indicators------
... 内容略,详见下文报告解析
==================END OF REPORT===================
A partir de los resultados del backtest, es fácil ver que esta estrategia superó al índice de referencia CSI 300. Durante estos diez años, el rendimiento anualizado del CSI 300 fue sólo de un mísero ~5% (4,84%), incluso peor que el de algunos productos a plazo fijo de mayor rendimiento, mientras que el rendimiento de la inversión anualizado de nuestra estrategia alcanzó el 19,86%. En diez años, los activos totales crecieron de 100.000 yuanes a más de 600.000 yuanes, es decir, un aumento de más de seis veces.
7.5. Mejora de la estrategia
Nuestra estrategia algo exitosa. Sin embargo, basta con observar la tasa de retorno total para explicar completamente el problema. ¿Cómo se comporta la estrategia a lo largo de los diez años? Esto requiere un análisis más profundo para ver si la estrategia se puede mejorar aún más. En este momento, debemos verificar más a fondo los resultados del backtest, especialmente los resultados visuales y los registros de detalles comerciales, para encontrar las deficiencias y los puntos de mejora de la estrategia a través de estos registros e informes.
Para mejorar aún más, necesitamos analizar el desempeño de la estrategia con mayor profundidad, identificar sus deficiencias y encontrar direcciones para mejorar. Con este fin, qteasy proporciona las siguientes herramientas para ayudar a los usuarios a analizar los resultados del backtest:
Informe de prueba: debe configurar
report=True. El informe de backtest resume los resultados del backtest en forma de texto, lo que facilita comprender rápidamente el retorno de la inversión y las métricas de evaluación clave.Informe visual: establezca
visual=True. Un gráfico compuesto visual presenta el contenido del informe de backtest en forma gráfica y proporciona información más detallada, lo que facilita a los usuarios comprender los resultados del backtest de forma más intuitiva.Archivo de registro comercial: Requiere configuración:
trade_log=True. El archivo de registro comercial registra cada estrategia ejecutada durante la prueba retrospectiva en forma de archivo CSV, incluidas las variables clave de la ejecución de la estrategia y los resultados de la selección de acciones cada vez. Esto facilita a los usuarios analizar cómo se ejecuta la estrategia, identificar sus deficiencias y encontrar direcciones de mejora.Informe detallado del comercio: establezca
trade_log=True. El informe detallado de la operación registra información detallada de cada operación en un archivo CSV, lo que facilita a los usuarios analizar los detalles de cada operación, identificar las deficiencias de la estrategia y encontrar direcciones para mejorar.
A continuación, analizaremos detalladamente el contenido y el uso de cada herramienta para ayudarnos a analizar los resultados del backtest, identificar las deficiencias de la estrategia y encontrar direcciones para mejorar.
Explicación detallada del informe backtest:
El informe de backtest de qteasy contiene una gran cantidad de información estadística sobre los resultados del backtest. Repasémoslo en detalle uno por uno:
Parte 1: información básica del backtest
La primera parte del informe contiene la información básica del backtest, incluido el tiempo transcurrido, las fechas de inicio y finalización, el período total del backtest, etc. Esta información nos ayuda a comprender los conceptos básicos del backtest:
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 123.2 ms # 生成交易信号的时间
time consumption for operation back testing: 288.7 ms # 回测交易的时间
investment starts on 2011-01-04 15:00:00 # 回测开始日期
ends on 2020-12-30 15:00:00 # 回测结束日期
Total looped periods: 10.0 years. # 回测的总周期为十年
Parte 2: Estadísticas de operaciones comerciales
La segunda parte del informe backtest son las estadísticas de operaciones comerciales. En forma de lista, cuenta el número de compras y ventas de cada instrumento de inversión, así como la proporción de tiempo que se mantuvo:
Por ejemplo, podemos ver que 000300.SH (Índice CSI 300) se compró 75 veces y se vendió 81 veces en diez años, con un índice de tiempo de mantenimiento de la posición del 47,7% y un índice de tiempo de efectivo (fuera de mercado) del 52,3%; mientras que 399006.SZ (Índice ChiNext) se compró 105 veces y se vendió 85 veces en diez años, con un ratio de tiempo de mantenimiento de posición del 47,9% y un ratio de tiempo de efectivo (fuera de mercado) del 52,1%.
-------------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 101 97 198 50.4% -0.0% 49.6%
399006.SZ 102 101 203 50.2% -0.0% 49.8%
Parte 3: Estadísticas de resultados del backtest
La tercera parte del informe de backtest son las estadísticas de los resultados del backtest, que incluyen métricas importantes como el monto total invertido, los activos totales finales, el rendimiento total, el rendimiento anualizado, el rendimiento de referencia y más:
Total operation fee: ¥ 10,666.34 # 投资过程中的总交易费用
total investment amount: ¥ 100,000.00 # 投入的总金额
final value: ¥ 611,231.20 # 回测结束时的资产总额
Total return: 511.23% # 投资的总收益率
Avg Yearly return: 19.86% # 投资的年化收益率
Skewness: -0.40 # 投资回报率的偏度,偏度表明投资回报率分布的偏斜程度,负偏度表明投资回报率分布的左尾较长,意味着投资回报率有较大的负面极端值的可能性
Kurtosis: 2.79 # 投资回报率的峰度,峰度表明投资回报率分布的峰态程度,峰度越大,表明投资回报率分布的峰态越高,意味着投资回报率有较大的极端值的可能性
Benchmark return: 60.32% # 基准收益率,这里是指投资标的的基准指数(默认沪深300指数)的收益率,该指数在同一时段内收益率只有60%
Benchmark Yearly return: 4.84% # 基准年化收益率,这里是指投资标的的基准指数(默认沪深300指数)的年化收益率,该指数在同一时段内年化收益率只有4.84%
Parte 4: Métricas de desempeño de la estrategia
La cuarta parte del informe de backtest son las métricas de desempeño de la estrategia, incluidos indicadores importantes como Alpha, Beta, Sharpe Ratio, Information Ratio, volatilidad de 250 días, reducción máxima, etc.
------strategy loop_results indicators------
alpha: 0.219 # 投资策略的Alpha值,Alpha值表明投资策略相对于基准指数的超额收益率,Alpha值越大,表明投资策略相对于基准指数的表现越好
Beta: 0.686 # 投资策略的Beta值,Beta值表明投资策略相对于基准指数的系统风险,Beta值越大,表明投资策略相对于基准指数的系统风险越大
Sharp ratio: 0.880 # 投资策略的Sharp Ratio,Sharp Ratio表明投资策略的风险调整收益率,Sharp Ratio越大,表明投资策略的风险调整收益率越好
Info ratio: 0.062 # 投资策略的Info Ratio,Info Ratio表明投资策略相对于基准指数的风险调整超额收益率,Info Ratio越大,表明投资策略相对于基准指数的风险调整超额收益率越好
250 day volatility: 0.265 # 投资策略的250日波动率,250日波动率表明投资策略在250个交易日内的收益率波动程度,250日波动率越大,表明投资策略的收益率波动程度越大
Max drawdown: 48.25% # 最大回撤,最大回撤表明投资策略在回测期间内的最大资产回撤程度,最大回撤越大,表明投资策略的风险越大
peak / valley: 2015-06-03 / 2015-08-26 # 最大回撤从2015年6月3日的峰值开始,到2015年8月26日的2015年8月26日,投资收益达到回撤48.25%
recovered on: 2020-02-21 # 从2015年8月26日开始反弹,一直到2020年2月21日才完全恢复到2015年6月3日的峰值水平,也就是说,最大回撤持续了近五年时间
Explicación detallada del informe visual.
Siempre que establezca la variable de configuración de entorno qteasy visual=True, podrá ver un informe gráfico visual de los resultados al final del informe de prueba retrospectiva:

Los gráficos de visualización presentan toda la información del informe backtest de una forma más intuitiva mediante gráficos compuestos. Como puede ver, el cuerpo principal de este gráfico incluye seis gráficos de líneas históricas que comparten un eje de tiempo unificado y, a continuación, hay tres gráficos de barras uno al lado del otro que resumen los rendimientos anuales y mensuales.
En general, este cuadro se puede dividir en cuatro partes. Repasémoslos uno por uno:
Parte 1: Información básica y métricas de retorno de la inversión
En la parte superior del gráfico, se muestra la información básica del backtest y las métricas de retorno. Esta información es básicamente consistente con lo que figura en el informe de backtest, incluidas métricas de rendimiento importantes, como el rendimiento total de la inversión, el rendimiento anualizado y el rendimiento del índice de referencia, lo que ayuda a los usuarios a comprender rápidamente el rendimiento de la inversión.

Parte 2: Gráfico de curva de retorno
La sección de la curva de retorno histórica del backtest incluye tres gráficos. Todos muestran retornos históricos, pero cada uno tiene un enfoque diferente.

Los tres gráficos son:
Curva de retorno: este gráfico de curva utiliza porcentajes y registra las curvas de retorno históricas de los retornos de inversión y los retornos de referencia con dos líneas (de forma predeterminada, el punto de referencia es el índice CSI 300; puede establecer otros índices a través de la variable de configuración del entorno
reference_asset). La curva roja representa el rendimiento de la cartera, mientras que la curva azul representa el rendimiento del índice de referencia. Este cuadro incluye información adicional que se puede habilitar o deshabilitar mediante variables de entorno:Indicador de reducción: utiliza flechas negras para marcar el pico, el mínimo y la fecha de recuperación de la reducción más grande dentro del período de inversión, lo que facilita a los usuarios comprender la reducción máxima de la inversión.
Indicador de compra/venta (establecido
buy_sell_points=True): en la línea verde que representa la curva de rendimiento de referencia, cada compra y venta está marcada con una flecha roja/verde en el momento correspondiente. El rojo indicaIndicador de posición (establecido
show_positions=True): el fondo del gráfico utiliza franjas verticales claras para indicar la relación de posición para cada período. El verde representa una posición larga y el rojo representa una posición corta (la figura anterior solo tiene posiciones largas, no posiciones cortas). Cuanto más oscuro sea el color de la franja, mayor será la relación de posición; por el contrario, indica una relación de posición más baja.
Curva logarítmica de rendimiento: este gráfico de curvas utiliza los rendimientos logarítmicos como unidad y muestra las curvas históricas de rendimientos de inversión y rendimientos de referencia. La curva de rendimiento logarítmico puede mostrar mejor la tendencia de los cambios en los rendimientos de las inversiones, especialmente cuando los rendimientos son relativamente altos o bajos, lo que hace que los cambios en los rendimientos sean más claros.
Gráfico de barras de retorno: este gráfico utiliza barras para mostrar el monto diario de ganancias/pérdidas dentro del período histórico de backtest.
En el gráfico de la curva de rendimiento se puede ver que, aunque los rendimientos generales son bastante buenos, la caída es relativamente alta, con un máximo del 45%.
Puede imaginarse que si un inversor comenzara a invertir el 3 de junio de 2015, el resultado sería: una pérdida del 45,9% para el 3 de enero de 2019, ¡y no alcanzaría el punto de equilibrio hasta después de 2020!
Parte 3: Gráfico de curva de métricas de rendimiento
La tercera parte de los gráficos es la sección de métricas de desempeño de la estrategia, que se utiliza principalmente para evaluar la rentabilidad y la capacidad de control de riesgos de la estrategia. También incluye tres gráficos:

Métricas de rentabilidad: el primer gráfico muestra las métricas utilizadas para evaluar la rentabilidad de la estrategia, mostrando los valores móviles históricos de dos indicadores: el índice de Sharpe y el alfa. Ambos indicadores se utilizan ampliamente para evaluar la capacidad de una estrategia comercial para generar ganancias excedentes (es decir, por encima del punto de referencia). Cada punto de las dos líneas del gráfico es el índice de Sharpe y el alfa calculados durante los últimos 250 días de negociación que finalizaron ese día, por lo que puede ver cómo cambian estas dos líneas con el tiempo. Cuanto mayor sea el índice de Sharpe, mejor será el rendimiento ajustado al riesgo de la estrategia; cuanto mayor sea el alfa, mejor será el exceso de rentabilidad de la estrategia en relación con el índice de referencia.
Métricas de capacidad de control de riesgos: El segundo gráfico muestra las métricas utilizadas para evaluar la capacidad de control de riesgos de la estrategia, mostrando los valores móviles históricos de dos indicadores: beta y volatilidad. Ambos indicadores evalúan si la estrategia puede controlar el riesgo. Cuanto menor sea la beta, menor será el riesgo sistemático de la estrategia en relación con el índice de referencia; cuanto menor es la volatilidad, menor es la fluctuación en los rendimientos de la estrategia.
Métrica de capacidad de control de reducción: el tercer gráfico es el gráfico de reducción bajo el agua, que muestra la métrica de evaluación de la capacidad de control de reducción de la estrategia. Muestra la curva histórica de la tasa de retorno de la inversión y la curva histórica de reducción de la tasa de retorno de la inversión (es decir, la curva «submarina»). Cada caída en esta curva indica que la curva de rendimiento de la inversión se ha reducido en relación con un máximo anterior; cuanto más profunda sea la caída, más grave será la caída. Una inmersión completa y un ascenso a la superficie representan un ciclo completo de descenso. Al mismo tiempo, este gráfico utiliza barras grises para marcar los cinco períodos de caída más profundos de la historia; cuanto más ancha era la barra gris, más duraba la reducción.
En el gráfico de descenso submarino, se puede ver que durante todo el período de diez años, excepto durante uno o dos breves años, casi siempre estuvo en un estado atrapado bajo el agua, y la profundidad máxima bajo el agua alcanzó más del 45%. A lo largo del período de inversión de diez años, los activos totales siguieron experimentando reducciones; la reducción del 45% fue la más grande y profunda, pero antes también hubo múltiples reducciones, como del 26% y el 22%, y ninguna de ellas fue corta. Básicamente, toda la inversión estaba “quedada atrapada a largo plazo, con posibilidades ocasionales de recuperarse”. Creo que muy pocos inversores podrían soportar ese tipo de prueba, ¿verdad?
Parte 4: Cuadro de estadísticas de devoluciones
En la parte inferior hay tres gráficos uno al lado del otro, que resumen los rendimientos anuales o mensuales desde diferentes perspectivas:

Mapa de calor de rentabilidad mensual: muestra la rentabilidad de cada mes (eje x) a lo largo de los años (eje y) en bloques de colores. Cuanto más verde sea el color, mayor será el rendimiento; cuanto más rojo es el color, menor es el rendimiento o mayor es la pérdida.
Gráfico de barras de rentabilidad anual: Muestra intuitivamente la rentabilidad de cada año. Las barras verdes indican rendimientos positivos, las barras rojas indican pérdidas; cuanto más alta sea la barra, mayor será el valor absoluto de la ganancia/pérdida.
Histograma de rentabilidad mensual: cuenta las rentabilidades de todos los meses y traza su distribución de probabilidad. En general, este gráfico suele parecerse a una curva de campana similar a una distribución normal. Sin embargo, dependiendo del desempeño de la estrategia, la curva de campana puede desplazarse hacia la derecha en su conjunto, lo que indica una mayor probabilidad general de generar retornos positivos, o puede volverse sesgada, lo que ayuda a los usuarios a comprender estadísticamente la distribución de los retornos.
En los tres gráficos anteriores, se puede ver que durante toda la década hubo tres años (2011, 2016 y 2018) con rendimientos negativos, mientras que todos los demás años lograron rendimientos positivos. Sin embargo, los rendimientos fluctúan mucho: algunos años obtienen grandes ganancias, mientras que otros sufren grandes pérdidas. Las grandes fluctuaciones indican que la estrategia conlleva un alto riesgo y tiene un control de riesgo relativamente débil.
En este punto, al analizar los gráficos, ahora tenemos una comprensión muy intuitiva de los rendimientos generales de la estrategia comercial: el mayor problema con esta estrategia es que no controló bien las reducciones.
Por lo tanto, deberíamos encontrar formas de mejorar esta estrategia y ver cómo podemos reducir las reducciones y mejorar el rendimiento. Para hacerlo, debemos analizar cuidadosamente cada operación durante el proceso de prueba retrospectiva de operaciones simuladas para encontrar formas de reducir las reducciones. Para ver todos los detalles de las operaciones de prueba retrospectiva, debe consultar los archivos de registro de operaciones.
A continuación, continuaremos con una explicación detallada del archivo de registro de operaciones.
Explicación detallada del registro comercial/informe comercial
Siempre que configuremos la variable de entorno trade_log=True, el sistema generará múltiples archivos CSV después de cada prueba retrospectiva (al menos incluyendo el registro comercial y el informe de detalles comerciales; en la versión actual, cuando esta opción está habilitada, también escribirá la curva de valor neto value_curve_*, etc.; consulte lo que realmente se genera). La ruta para guardar estos archivos está controlada por el elemento de configuración trade_log_file_path, que por defecto es QT_ROOT_PATH/tradelog/. Esta ruta admite rutas relativas, rutas absolutas y rutas de directorio de inicio que comienzan con ~, y se puede modificar en tiempo de ejecución a través de qt.configure(trade_log_file_path='...') y entrar en vigor inmediatamente (actualización en caliente) sin volver a importar. Por ejemplo:
En Windows, especifique un directorio en otra unidad:
qt.configure(trade_log_file_path='C:\\qt_trade_logs\\')En macOS/Linux, especifique un directorio en su carpeta de inicio:
qt.configure(trade_log_file_path='~/qt_trade_logs/')
Política de retención de disco: el elemento de configuración trade_log_keep_days tiene como valor predeterminado 3, lo que significa que después de cada vez que un nuevo proceso importe qteasy, limpiará los archivos CSV de prueba retrospectiva vencidos en el directorio trade_log_file_path de acuerdo con esta cantidad de días, como trade_log_*, trade_summary_* y value_curve_*. (No se limpia automáticamente antes de escribir archivos para cada prueba retrospectiva). Para conservar todos los archivos históricos a largo plazo, establezca trade_log_keep_days en None o menor o igual a 0; También puedes llamar a qt.rotate_trade_logs(days=...) en cualquier momento para limpiar manualmente.
Si desea ver la ruta de guardado del archivo de registro actual, utilice:
import qteasy as qt print(qt.QT_TRADE_LOG_PATH)

Abra la carpeta en esa ruta y podrá ver los informes de cada prueba retrospectiva. Todos los informes se guardan como archivos CSV para abrirlos fácilmente en Excel. Los tipos comunes incluyen:
Registro comercial: Los archivos que comienzan con “trade_log” son archivos de registro comercial y enumeran información detallada para cada ejecución de estrategia.
Informe comercial: Los archivos que comienzan con “trade_summary” son informes comerciales y enumeran información para cada operación.
Curva de valor neto (si se genera): Los archivos que comienzan con “value_curve” registran la serie completa de valor neto, etc.
Todos los archivos anteriores terminan con la fecha/hora de la ejecución de la prueba retrospectiva para distinguir los archivos de registro generados en diferentes momentos. Te los explicamos por separado:
Interpretación de los registros comerciales
Abra el primer archivo con Excel para ver el registro comercial. El registro comercial registra, en una tabla, información como cambios en los fondos para cada ejecución de estrategia, cambios en las posiciones y detalles comerciales para cada acción. Independientemente de si hay operaciones o cambios de posición, hay un registro todos los días:
Todo el historial comercial está organizado por filas en la tabla, con cada ocho filas como un grupo. Cada grupo registra una operación y la información desde la primera hasta la última se registra en orden de arriba a abajo.
Las ocho líneas en cada grupo de registros capturan respectivamente lo siguiente:
0, señal comercial Señales comerciales: registra las señales comerciales generadas después de esta ejecución (las señales comerciales son un conjunto de números; después del análisis de señales se convierten en órdenes comerciales. Consulte Señales comerciales para obtener más detalles).
1, precio Precio de negociación: registra los precios de negociación de cada acción durante esta ejecución.
2, cantidades negociadas Cantidad negociada: Registra la cantidad negociada real para cada acción después de esta ejecución. Los números positivos indican la cantidad de compra, los números negativos indican la cantidad de venta y 0 significa que no hay transacciones.
3, cambio de efectivo Cambio de efectivo: Registra la cantidad de cambio de efectivo causado por las operaciones reales para cada acción después de esta ejecución. Los números positivos indican un aumento en efectivo, los números negativos indican una disminución en efectivo y 0 significa que no hay cambios.
4, costo comercial Costos de transacción: Registra los costos de transacción realmente incurridos para cada acción después de esta ejecución.
5, cantidades propias Tamaño de la posición: Registra la cantidad retenida para cada stock después de esta ejecución. Los números positivos indican el tamaño de la posición larga, los números negativos indican el tamaño de la posición corta y 0 significa que no hay posición.
6, cantidades disponibles Posiciones disponibles: Registra la cantidad disponible para cada stock después de esta ejecución. Los números positivos indican el tamaño de la posición larga disponible, los números negativos indican el tamaño de la posición corta disponible y 0 significa que no hay tenencias disponibles.
7, resumen Resumen: Registra el efectivo total retenido/disponible, el valor total de mercado de las tenencias y el valor total de la cartera después de esta ejecución.
Al examinar el registro comercial detenidamente, toda la tabla se puede dividir por columnas en tres o cuatro grupos, cada uno de los cuales proporciona información desde una perspectiva diferente:
Área de encabezado: la primera columna en el área de encabezado registra la fecha y hora de cada ejecución, la segunda columna registra el nombre del grupo de estrategias para cada ejecución (consulte Grupos de estrategias para obtener más detalles) y la tercera columna etiqueta el nombre de cada fila.
Registro de tenencias de efectivo: en la fila de resumen de esta área, registra el efectivo adicional invertido antes de cada ejecución, el efectivo total retenido al final del período/efectivo total disponible y el valor total de la cartera (incluido el efectivo total y el valor total del mercado de valores).
Seguimiento de variables en tiempo de ejecución de la estrategia: el seguimiento de variables en tiempo de ejecución de la estrategia es opcional. Permite a los usuarios insertar puntos de seguimiento en la estrategia para rastrear los valores de las variables durante la ejecución de la estrategia, lo cual es muy útil durante la depuración de la estrategia. Lo omitiremos por ahora; ver detalles en
Registros de tenencia: esta área muestra información como la cantidad de acciones poseídas, la cantidad de acciones negociadas y el precio de negociación de cada acción en el grupo de acciones de inversión. Cada columna muestra los datos de una acción y el número de columnas es igual a la cantidad de acciones en el grupo de acciones.
Con base en la comprensión anterior, podemos analizar el proceso de ejecución de la estrategia y ver cómo la estrategia selecciona y rota las acciones.

Como se muestra arriba, podemos utilizar los registros de ejecución de los primeros cuatro días para obtener una comprensión más profunda de cómo opera la estrategia:
Día 1: Se invirtió un capital inicial de 100.000 yuanes y se inició la inversión. Al mismo tiempo, podemos ver que las ganancias del CSI 300 y del índice ChiNext ese día fueron del 0,76% y el 1,83%, respectivamente. De acuerdo con las reglas de la estrategia, compramos 86,56 acciones del índice ChiNext al cierre, gastando 99.996,32 yuanes. Después de la operación, teníamos 86,56 acciones del índice ChiNext;
Día 2: Las ganancias del índice ChiNext y del índice CSI 300 fueron del -0,77% y -0,56%, respectivamente. Comparando los dos, el índice ChiNext aún salió adelante, por lo que la posición permanece sin cambios;
Día 3: La ganancia del índice CSI 300 superó la del índice ChiNext. En este punto, la señal comercial se revirtió, generando una señal de compra de CSI 300 y una señal de venta de ChiNext. Sin embargo, sólo se ejecutó la señal de venta de ChiNext: vendimos las 86,56 acciones. La señal de compra del CSI 300 no se pudo ejecutar porque el saldo de efectivo era insuficiente: sólo había 3,68 yuanes disponibles.
Día 4: Las señales comerciales continuaron invirtiéndose. En ese momento, la señal de compra del CSI 300 entró en vigor y compramos 31,01 acciones del índice CSI 300 con nuestra posición completa.
…
Utilizando el método mencionado anteriormente, el archivo de registro de operaciones registra completamente toda la información comercial durante un total de 2431 días de operaciones durante diez años, lo que nos permite analizar cuidadosamente las ganancias y pérdidas de cada operación.
Un análisis cuidadoso de la tabla anterior muestra que esta estrategia de inversión se invierte completamente, excepto cuando se cambia de acción, y esto también fue cierto durante la caída del mercado de valores a mediados de 2015. Si analizamos ese período, encontramos que a partir del 18 de junio de 2015, los rendimientos a 20 días tanto del índice CSI 300 como del índice ChiNext ya habían pasado de positivos a negativos, lo que indica que el mercado había comenzado a caer. Sin embargo, en ese momento la estrategia todavía mantenía firmemente el índice ChiNext, porque su caída fue menor que la del CSI 300; en otras palabras, su rendimiento fue mayor que el del CSI 300:

De hecho, en este momento nuestra estrategia todavía eligió el índice correcto. Es sólo que como ambos índices estaban cayendo, nuestra estrategia mantuvo el que cayó menos, reduciendo nuestras pérdidas.
Pero fueron precisamente nuestras operaciones durante este período las que provocaron la mayor caída en nuestra historia de diez años de inversión: desde junio de 2025 hasta 2020, ¡estuvimos profundamente atrapados durante cinco años!
Interpretación del informe comercial
Aunque el registro comercial contiene toda la información detalladamente, a veces no necesitamos mirar tantos datos. En ese caso, podemos utilizar el informe comercial.
El informe comercial es una versión compacta del archivo de registro comercial. Ignora todos los registros de ejecución de estrategias sin transacciones sustanciales y conserva solo todos los registros comerciales sustanciales, incluida la fecha de la negociación, la dirección de compra/venta, el número de acciones, el precio, el monto total, la tasa de tarifa de transacción, etc. Debido a que sólo registra las operaciones que realmente ocurrieron, la información es más compacta:

Como puede ver en la figura anterior, cada fila del informe comercial registra un registro comercial real. Si se producen varios registros comerciales el mismo día, se registrarán en filas diferentes.
Cada fila del informe comercial registra información como la señal comercial, el precio comercial, la cantidad comercial, el cambio de efectivo, la tasa de tarifa de transacción y el tamaño de la posición posterior a la negociación; los nombres de las columnas contienen exactamente la misma información que el registro comercial.
7.6. Ideas para mejorar la estrategia
Basándonos en el análisis anterior de la estrategia comercial, descubrimos que, aunque esta estrategia logró resultados de inversión relativamente buenos, tuvo un desempeño deficiente en el control de las caídas: debido a que no evitó el período de caída del mercado de valores, terminó profundamente atrapada.
Entonces, ¿podemos mejorar nuestra estrategia desde aquí? La idea es sencilla. Podemos agregar una regla:
Calcule el aumento de los dos índices en los últimos 20 días todos los días, es decir, el aumento del precio de hoy en relación con el precio de hace 20 días.
Si ambos índices son inferiores a 0 el día de la selección de acciones, al día siguiente estaremos vacíos y no mantendremos ningún índice.
De lo contrario, elija el índice con el aumento mayor, manténgalo al día siguiente y venda el índice con el aumento menor.
Necesitamos agregar una «condición de filtro» a la regla de selección de acciones simple original para excluir la situación en la que ambos índices son menores que 0. Entonces, ¿cómo ajustar en qteasy para reflejar esta nueva modificación?
Configuración de estrategia mejorada
La estrategia de selección de acciones incorporada de qteasy proporciona un atributo de condición de filtro condition. La condición predeterminada es condition='any', lo que significa que no hay ninguna condición de filtro. Ahora necesitamos filtrar la tasa de retorno inferior a 0, para que pueda configurar condition='greater' y configurar el rango de filtro ubound=0.
>>> op.set_parameter(0,
... condition='greater', # 新增过滤条件:20日涨幅大于等于
... ubound=0.0, # 过滤条件值:0
... )
Las configuraciones anteriores son básicamente las mismas que las de la sección anterior, con dos parámetros adicionales:
condition='greater': significa una condición de filtro. El aumento de días N debe ser mayor o igual a un valor determinado para participar en la selección de acciones. Este valor se establece en el parámetroubound. Es decir, excluir acciones que sean inferiores a este valor y hacer que no se puedan seleccionar.ubound=0:Establezca en 0, de modo que solo se puedan seleccionar índices con un aumento mayor o igual a 0. Por supuesto, también se puede configurar para otros números de punto flotante.
Resultados mejorados
Ejecute qt.run() directamente según la configuración anterior. Aquí están los resultados:
>>> res=qt.run(op, visual=True, trade_log=True)
El resultado es el siguiente:
====================================
| |
| BACKTEST REPORT |
| |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 146.7 ms
time consumption for operation back testing: 8.7 ms
investment starts on 2011-01-04 15:00:00
ends on 2020-12-30 15:00:00
Total looped periods: 10.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 113 99 212 26.7% -0.0% 73.3%
399006.SZ 97 103 200 42.2% -0.0% 57.8%
Total operation fee: ¥ 14,906.10
total investment amount: ¥ 100,000.00
final value: ¥ 906,783.37
Total return: 806.78%
Avg Yearly return: 24.68%
Skewness: -0.23
Kurtosis: 4.86
Benchmark return: 60.32%
Benchmark Yearly return: 4.84%
------strategy loop_results indicators------
alpha: 0.297
Beta: 0.619
Sharp ratio: 1.030
Info ratio: 0.054
250 day volatility: 0.213
Max drawdown: 28.88%
peak / valley: 2018-01-24 / 2019-01-23
recovered on: 2019-07-01
==================END OF REPORT===================
El cuadro de visualización es el siguiente: 
En el gráfico de rentabilidad de los activos se puede ver que lo que solía ser un bloque sólido de color verde (completamente invertido) se ha convertido en una alternancia de blanco y verde (los intervalos en blanco indican que se está fuera del mercado y se tiene efectivo). La reducción se ha optimizado enormemente: se ha reducido de la reducción original del 50% a alrededor del 20%. Y la rentabilidad total también ha aumentado significativamente:
Los activos totales aumentaron de poco más de 500.000 antes de la mejora a poco más de 900.000.
El rendimiento total aumentó del 300% al 806%.
El rendimiento anualizado aumentó del 17% al 24,68%.
La reducción máxima disminuyó del 50% al 28%.
Al comprobar los registros de transacciones, se demuestra que la estrategia mantuvo posiciones vacías durante el desastre bursátil de finales de junio de 2015, evitando la caída unidireccional del mercado.
7.7. Resumen
En este tutorial, nos familiarizamos con la estrategia comercial de qteasy mediante la creación, pruebas retrospectivas y modificación de una estrategia comercial de rotación de pequeña capitalización. Aprendimos cómo crear un objeto comercial de estrategia única haciendo referencia a la estrategia comercial incorporada y ejecutando la estrategia para obtener resultados de prueba retrospectiva. A partir del siguiente tutorial, analizaremos en detalle las estrategias comerciales integradas de qteasy e introduciremos la implementación de estrategias combinadas. Agregaremos más estrategias al objeto comercial y estableceremos el método de combinación para lograr efectos más complejos a través de la combinación de estrategias y comprenderemos más tipos y controles de estrategias.