FAQ
Cómo configurar entornos de instalación para diferentes versiones de Python
En el tutorial qteasy, presentamos cómo instalar qteasy usando un entorno virtual creado con venv. Sin embargo, a veces los usuarios pueden necesitar instalar qteasy en diferentes versiones de Python, como Python 3.9, Python 3.10, Python 3.11, Python 3.12, etc. Aquí, presentamos un método para instalar qteasy en diferentes versiones de Python.
Creando entornos con diferentes versiones de Python usando Anaconda:
Anaconda es una distribución de Python para informática científica que incluye conda, Python y más de 180 paquetes científicos y sus dependencias. Por lo tanto, podemos usar Anaconda para crear entornos con diferentes versiones de Python y luego instalar qteasy dentro de esos entornos.
Anaconda se puede descargar desde su sitio web oficial: Anaconda. Descarga la versión correspondiente a tu sistema operativo y luego instálala.
Después de instalar Anaconda, podemos usar el comando conda para crear entornos con diferentes versiones de Python e instalar paquetes de Python dentro de ellos. Por ejemplo:
$ conda create -n py39 python=3.9 # 创建python3.9环境
$ conda activate py39 # 激活python3.9环境
$ pip install qteasy # 在python3.9环境下安装qteasy
En un entorno conda, los paquetes instalados usando pip también se pueden identificar y administrar correctamente.
A continuación se muestran algunos comandos conda de uso común:
$ conda env list # 查看所有的环境
$ conda activate py39 # 激活python3.9环境
$ conda deactivate # 退出当前环境
$ conda remove -n py39 --all # 删除python3.9环境
$ conda list # 查看当前环境下安装的包
$ conda list -n py39 # 查看python3.9环境下安装的包
Utilice una fuente de espejo de pip doméstica
En China, debido a las condiciones de la red, la instalación de paquetes de Python usando pip a veces puede ser lenta o incluso fallar. En tales casos, podemos utilizar fuentes de espejo de pip domésticas, como la fuente de espejo de pip de la Universidad de Tsinghua.
Al instalar paquetes de Python usando pip, puede usar el parámetro -i para especificar la fuente del espejo de pip, por ejemplo:
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple qteasy
¿Cómo actualizar QtEasy a la última versión?
Cuando utilice Qteasy, es posible que necesite actualizar a la última versión. Antes de actualizar, se recomienda consultar el [Historial de versiones] (RELEASE_HISTORY.md) para comprender los cambios visibles para el usuario en cada versión. El método para actualizar Qteasy a la última versión es el siguiente:
$ pip install qteasy --upgrade
Alternativamente, use el siguiente comando:
$ pip isntall qteasy -U
Para utilizar la fuente espejo de la Universidad de Tsinghua en China, puede utilizar el siguiente comando:
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple qteasy --upgrade
Cómo instalar TA-Lib
El paquete TA-Lib completo no se puede instalar mediante pip porque pip install ta-lib solo instala un contenedor de Python para el paquete TA-Lib. Los usuarios primero deben instalar la versión en lenguaje C de TA-Lib antes de poder usarla en Python.
Algunos usuarios pueden instalar el paquete TA-Lib en lenguaje C utilizando el siguiente método:
conda install -c conda-forge libta-lib
Métodos para instalar el paquete TA-Lib en lenguaje C en diferentes sistemas operativos:
Windows
Descargue ta-lib-0.4.0-msvc.zip y extráigalo a
C:\ta-lib.Descargue e instale
Visual Studio Community(2015 o posterior) y seleccione la función[Visual C++].Abra el menú Inicio de Windows y ejecute
[VS2015 x64 Native Tools Command Prompt]Mover a
C:\ta-lib\c\make\cdr\win32\msvcnmake
Mac OS
Primero, instale Homebrew y luego instale el paquete TA-LIB en lenguaje C a través de Homebrew:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ brew install ta-lib
Si utiliza chips Apple Silicon, puede:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ arch -arm64 brew install ta-lib
Linux
Descargue ta-lib-0.4.0-src.tar.gz, luego:
$ tar -xzf ta-lib-0.4.0-src.tar.gz
$ cd ta-lib/
$ ./configure --prefix=/usr
$ make
$ sudo make install
Una vez instalado el paquete TA-LIB en lenguaje C, el paquete Python TA-Lib se puede instalar mediante pip:
$ pip install ta-lib
Para instalar TA-Lib en una Mac basada en arm64, puede usar el siguiente comando:
$ arch -arm64 python -m pip install --no-cache-dir ta-lib
Si está utilizando una computadora con arquitectura Arm64 pero encuentra un error de importación ImportError: después de instalar ta-lib, puede deberse a un problema ambiental. Consulte este artículo (https://blog.csdn.net/Shepherdppz/article/details/138253619) para resolver su problema.
Instale Qteasy en una versión superior del entorno Python
La solución es actualizar a la última versión de qteasy. Las versiones más recientes de qteasy se han probado en entornos Python 3.7 a 3.12 y funcionan correctamente en estos entornos.
$ pip install qteasy --upgrade
Las versiones anteriores de qteasy no se probaron adecuadamente en las versiones más nuevas de python, lo que generó algunos problemas de compatibilidad. Estos problemas existen principalmente en las distribuciones de qteasy de la versión 1.1.4 y anteriores.
Mientras tanto, las versiones anteriores de qteasy usaban algunas API que están a punto de quedar obsoletas en versiones superiores de pandas y numpy, lo que puede haber causado problemas de compatibilidad con versiones superiores de pandas y numpy. Estos problemas se han solucionado en las versiones de qteasy desde la v1.1.7 en adelante.
Después de agregar información de configuración a qteasy.cfg, aparece un mensaje de error de conexión a la base de datos.
Algunos usuarios han informado que incluso después de configurar la información de conexión de la base de datos en el archivo qteasy.cfg, todavía encuentran un mensaje de error de conexión de la base de datos y reciben un error similar al siguiente:
C:\Users\yuewe\Documents\GitHub\qteasy-1.0.26\qteasy\database.py:2504: RuntimeWarning: (1045, "Access denied for user 'yuewe'@'localhost' (using password: NO)"), Can not set data source type to "db", will fall back to default type
warnings.warn(f'{str(e)}, Can not set data source type to "db",'
Si es la primera vez que encuentra este problema, probablemente debería verificar primero su archivo qteasy.cfg. Verifique principalmente los siguientes dos aspectos:
¿La clave configurada es incorrecta? La versión estable de
qteasyutiliza claves de configuración de información de conexión de base de datos comolocal_db_host/local_db_port, etc., en lugar dedatabase_host. Hubo algunos errores en la documentación oficial anteriormente, pero estos errores se corrigieron en la documentación más reciente.Al proporcionar información de configuración en el archivo, no agregue otros caracteres como
",<y>, etc. De lo contrario, estos caracteres se interpretarán como parte deltokeno del nombre de la base de datos, lo que provocará que falle la conexión de la base de datos.
Al analizar archivos de configuración, qteasy los convierte automáticamente al formato correcto según el tipo de configuración. Por ejemplo, el puerto de la base de datos 3306 debe ser una variable int, que se puede utilizar directamente.
local_db_port = 3306
Eso es todo. qteasy convertirá la cadena 3306 a un int tipo 3306.
El siguiente ejemplo de archivo de configuración es correcto:
tushare_token = 2dff3f034aa966479c81e4b4b0736fb081b740abb2xxxxxxxxxxxxxxxxxxxxx
local_data_source = database
local_db_host = localhost
local_db_port = 3306
local_db_user = user_name
local_db_password = pass_word
local_db_name = ts_db
Al leer datos de la base de datos, un mensaje sugiere instalar sqlalchemy.
A veces, al utilizar una base de datos como fuente de datos y leer datos de la base de datos, es posible que vea el siguiente mensaje:
UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
El mensaje anterior sugiere que los usuarios utilicen sqlalchemy.
En resumen, esta es una advertencia para el usuario. En realidad no se produjo ningún error; la lectura de datos fue exitosa. El motivo de este mensaje de advertencia está relacionado con la versión de pandas que ha instalado. No es necesario instalar sqlalchemy; qteasy ha eliminado la dependencia de sqlalchemy. Para confirmar por qué aparece esta advertencia, verifique su versión de pandas.
import pandas as pd
pd.__version__
Si está utilizando la versión 1.1 o superior de Pandas, puede encontrar esta advertencia de usuario, pero generalmente no debería afectar el uso. Esto se debe a que qteasy usa pymysql como API de conexión de base de datos, pero pandas ha eliminado gradualmente el soporte para pymysql desde la versión 1.1. Aunque las pruebas muestran que qteasy aún puede leer datos correctamente en la versión 1.5 de pandas, recibirás un mensaje de advertencia.
Los problemas anteriores están en mi lista de modificaciones. En la próxima actualización menor, se eliminará la dependencia de la API SQL pandas y se utilizará pymysql directamente para leer la base de datos. Esto evitará que aparezca este mensaje de advertencia. Si no desea ver este mensaje de advertencia, también puede degradar la versión pandas a 1.1.0. qteasy ha utilizado constantemente una versión inferior de pandas durante su desarrollo inicial, y la mayoría de las pruebas de estabilidad se basan en pandas versión 1.1. Si utiliza pandas versión 1.1, este mensaje de advertencia no aparecerá y todas las demás funciones funcionarán normalmente.
Descargar datos en lotes desde tushare
A veces necesitamos descargar datos en lotes, haciendo una pausa durante un período determinado entre cada lote. Por ejemplo, algunas tablas de datos en tushare tienen un límite de frecuencia, lo que limita el número máximo de descargas por minuto; exceder este límite provocará fallas en la descarga. En este caso, podemos lograr dichas descargas y pausas por lotes utilizando los dos parámetros de configuración siguientes:
QT_CONFIG.hist_dnld_delay: El valor predeterminado es 0. Si se establece en un número entero positivo, representa el número de descargas en cada lote cuando se descarga en lotes.QT_CONFIG.hist_dnld_delay_evy: El valor predeterminado es 0. Si se establece en un número entero positivo, representa la cantidad de segundos que se deben esperar entre dos lotes de descarga. La siguiente configuración hará que espere un minuto después de descargar 600 conjuntos de datos:
>>> qt.configure(hist_dnld_delay=60, hist_dnld_delay_evy=600)
>>> qt.configure(hist_dnld_retry_cnt=3) # 同时减少重试的次数以缩短报错前等待的时间,这个配置并不是必要的
Después de configurarlo como se describe anteriormente, incluso cuando se utiliza la descarga paralela, qteasy no enviará todas las tareas al grupo de procesos al mismo tiempo. En cambio, los enviará en lotes y esperará un período de tiempo antes de enviar el siguiente lote.
Las funciones anteriores se agregaron en la versión v1.1.11 de qteasy. Si su versión de qteasy es anterior, actualice a la última versión.
¿Cómo lograr que funcione el flujo de trabajo mínimo desde los datos hasta el backtesting/optimización?
Se recomienda completar el proceso en un minuto como se describe en la «Guía de inicio rápido»: Configurar el token tushare → Descargar datos → Realizar una prueba retrospectiva utilizando la estrategia integrada. Para ver el flujo de trabajo completo (Configurar fuente de datos → Descargar datos → Definir estrategia y prueba retrospectiva → Optimización de parámetros → Ejecución simulada/en vivo) y los tutoriales correspondientes, consulte la [Guía de inicio rápido - Hoja de ruta/tutorial de un extremo a otro] (getting_started.md#Hoja de ruta de un extremo a otro - Tutorial). Seguir el orden de los tutoriales de esta hoja de ruta le permitirá completar todo el proceso desde cero.
¿Por qué el backtesting/optimización es lento?
Las posibles razones incluyen:
Volumen de datos y duración de la ventana: Cuanto más largo sea el intervalo de backtesting, mayor será el conjunto de activos y mayor el
window_lengthde la estrategia, más datos deberán prepararse y calcularse para un solo backtest.Número de grupos de parámetros: en el modo de optimización (modo=2), cuantas más combinaciones de parámetros haya, más veces será necesario realizar un solo backtest; Esto se ha mitigado mediante el paralelismo de múltiples procesos, pero todavía está relacionado con la cantidad de núcleos de la máquina y la escala de la tarea.
Compilación inicial de Numba: las funciones principales de backtesting (como
backtest_stepybacktest_batch_steps) utilizan Numba JIT. La compilación se activa en la primera ejecución o cuando cambia el tipo de parámetro, lo que genera un retraso único. Las pruebas posteriores del mismo tipo reutilizarán el caché, lo que mejorará significativamente la velocidad.Preparación de datos: si los datos en DataSource no se preparan con anticipación, se activará la recuperación de datos y el ensamblaje de la ventana antes de la prueba retrospectiva, lo que también aumentará el tiempo de la primera ejecución.
Para obtener más información sobre backtesting de motores y diseño de rendimiento, consulte Backtesting Engines and Performance y Backtesting Engines and Performance (Design Perspective) en «Arquitectura y diseño».
¿Cómo entender las «funciones preparadas para el futuro»?
Qteasy evita que la estrategia «vea» datos futuros durante el backtesting mediante su mecanismo: en cada paso de tiempo, el motor solo inyecta una ventana de datos históricos que son visibles en ese paso de tiempo en la estrategia. La estrategia recupera solo los datos dentro de esa ventana usando get_data(dtype_id) en realize(). Las métricas calculadas en esta ventana (como la EMA) son consistentes con los datos históricos que «solo son visibles en ese momento» en el comercio real, evitando así el uso involuntario de datos futuros. Para conocer los fundamentos detallados del diseño (por qué no realizar una cuantificación axial a tiempo completo, cómo se inyectan las ventanas de datos paso a paso, etc.), consulte [Intención del diseño y ventajas únicas] (design/08-design-rationale-and-advantages.md) en «Arquitectura y diseño».
¿Qué es use_latest_data_cycle y cómo se configura?
use_latest_data_cycle (a menudo abreviado como ulc) controla si la ventana de datos utilizada por la estrategia incluye la vela raíz actual (los datos más recientes en el momento actual): cuando se establece en True, la ventana puede incluir la barra actual (como el precio de cierre), correspondiente a «si el último precio en ese momento está permitido durante la negociación»; cuando se establece en False, la ventana contiene estrictamente datos de «precios de cierre anteriores». Esta elección tendrá un impacto significativo en los retornos en las pruebas retrospectivas a largo plazo y qteasy lo expone como un elemento configurable en la declaración de estrategia y la configuración del tiempo de ejecución. Para conocer su significado e impacto, consulte Intención de diseño y ventajas únicas - use_latest_data_cycle; para configuraciones específicas, consulte las declaraciones data_types / window_length en la clase de estrategia y [Cómo la estrategia declara y utiliza datos] (design/03-data-in-strategies.md), así como las instrucciones de configuración en la documentación y API de la versión actual.