Häufig gestellte Fragen

Wie man Installationsumgebungen für verschiedene Python-Versionen einrichtet

Im Tutorial zu qteasy haben wir die Installation von qteasy mithilfe einer virtuellen Umgebung (erstellt mit venv) beschrieben. Manchmal ist es jedoch erforderlich, qteasy auf verschiedenen Python-Versionen zu installieren, beispielsweise auf Python 3.9, Python 3.10, Python 3.11, Python 3.12 usw. Hier stellen wir eine Methode zur Installation von qteasy auf verschiedenen Python-Versionen vor.

Erstellen von Umgebungen mit unterschiedlichen Python-Versionen mithilfe von Anaconda:

Anaconda ist eine Python-Distribution für wissenschaftliches Rechnen, die conda, Python und über 180 wissenschaftliche Pakete sowie deren Abhängigkeiten umfasst. Daher können wir Anaconda verwenden, um Umgebungen mit verschiedenen Python-Versionen zu erstellen und anschließend qteasy in diesen Umgebungen zu installieren.

Anaconda kann von der offiziellen Website heruntergeladen werden: Anaconda. Laden Sie die Version herunter, die zu Ihrem Betriebssystem passt, und installieren Sie sie anschließend.

Nach der Installation von Anaconda können wir mit dem Befehl conda Umgebungen mit verschiedenen Python-Versionen erstellen und darin Python-Pakete installieren. Zum Beispiel:

$ conda create -n py39 python=3.9  # 创建python3.9环境
$ conda activate py39  # 激活python3.9环境
$ pip install qteasy  # 在python3.9环境下安装qteasy

In einer Conda-Umgebung können auch mit pip installierte Pakete korrekt identifiziert und verwaltet werden.

Hier sind einige häufig verwendete conda-Befehle:

$ 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环境下安装的包

Verwenden Sie eine inländische Pip-Spiegelquelle

In China kann die Installation von Python-Paketen mit pip aufgrund der Netzwerkbedingungen mitunter langsam sein oder sogar fehlschlagen. In solchen Fällen können wir auf lokale pip-Mirror-Quellen zurückgreifen, beispielsweise auf die pip-Mirror-Quelle der Tsinghua-Universität.

Bei der Installation von Python-Paketen mit pip können Sie den Parameter -i verwenden, um die pip-Mirror-Quelle anzugeben, zum Beispiel:

$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple qteasy

Wie kann ich QtEasy auf die neueste Version aktualisieren?

Bei der Verwendung von Qteasy kann ein Upgrade auf die neueste Version erforderlich sein. Vor dem Upgrade empfiehlt es sich, die Versionshistorie zu prüfen, um die für den Benutzer sichtbaren Änderungen in den einzelnen Versionen zu verstehen. Die Vorgehensweise zum Aktualisieren von Qteasy auf die neueste Version ist wie folgt:

$ pip install qteasy --upgrade

Alternativ können Sie folgenden Befehl verwenden:

$ pip isntall qteasy -U

Um den Spiegelserver der Tsinghua-Universität innerhalb Chinas zu nutzen, können Sie folgenden Befehl verwenden:

$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple qteasy --upgrade

Wie installiert man TA-Lib?

Das komplette TA-Lib-Paket kann nicht über pip installiert werden, weil pip install ta-lib nur einen python wrapper für das TA-Lib-Paket installiert, und der Benutzer muss zuerst TA-Lib für C installieren, bevor er es in Python benutzen kann.

Einige Benutzer können das TA-Lib-Paket für C mit der folgenden Methode installieren: conda install -c conda-forge libta-lib

Die Methode zur Installation von TA-Lib-Paketen für C auf verschiedenen Systemen:

Windows (Computer)

  • Laden Sie [ta-lib-0.4.0-msvc.zip] (http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-msvc.zip) herunter und entpacken Sie es nach C:\ta-lib.

  • Laden Sie Visual Studio Community (2015 oder höher) herunter und installieren Sie es, wählen Sie die Funktion [Visual C++].

  • Windows-Startmenü, starten Sie [VS2015 x64 Native Tools Eingabeaufforderung]

  • Nach „C:\ta-lib\c\make\cdr\win32\msvc“ verschieben.

  • `nmake‘

Mac OS

Installieren Sie zuerst Homebrew und anschließend das C-Sprachpaket TA-LIB über Homebrew:

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ brew install ta-lib

Apple Silicon Chips können verwendet werden, wenn sie verwendet werden:

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ arch -arm64 brew install ta-lib

Linux

Laden Sie ta-lib-0.4.0-src.tar.gz herunter und.

$ tar -xzf ta-lib-0.4.0-src.tar.gz
$ cd ta-lib/
$ ./configure --prefix=/usr
$ make
$ sudo make install

Nach der Installation des C-Sprachpakets TA-Lib kann das Python-Paket TA-Lib über pip installiert werden:

$ pip install ta-lib

Um TA-Lib auf einem arm64-basierten Mac zu installieren, können Sie folgenden Befehl verwenden:

$ arch -arm64 python -m pip install --no-cache-dir ta-lib

Wenn Sie einen Computer mit Arm64-Architektur verwenden und nach der Installation von ta-lib der Importfehler ImportError: auftritt, liegt dies möglicherweise an einem Umgebungsproblem. Zur Behebung des Problems lesen Sie bitte diesen Artikel (https://blog.csdn.net/Shepherdppz/article/details/138253619).


Installieren Sie Qteasy in einer höheren Python-Version.

Die Lösung besteht darin, auf die neueste Version von qteasy zu aktualisieren. Neuere Versionen von qteasy wurden in Python-Umgebungen von 3.7 bis 3.12 getestet und funktionieren in diesen Umgebungen einwandfrei.

$ pip install qteasy --upgrade

Frühere Versionen von qteasy wurden in neueren Versionen von python nicht ausreichend getestet, was zu Kompatibilitätsproblemen führte. Diese Probleme treten hauptsächlich in qteasy-Distributionen der Version 1.1.4 und älter auf.

Frühere Versionen von qteasy verwendeten APIs, die in neueren Versionen von pandas und numpy als veraltet markiert werden. Dies konnte zu Kompatibilitätsproblemen mit diesen neueren Versionen führen. Diese Probleme wurden in qteasy ab Version 1.1.7 behoben.


Nach dem Hinzufügen von Konfigurationsinformationen zu qteasy.cfg erscheint eine Fehlermeldung bezüglich eines Datenbankverbindungsfehlers.

Einige Benutzer haben berichtet, dass sie selbst nach der Konfiguration der Datenbankverbindungsinformationen in der Datei qteasy.cfg immer noch eine Fehlermeldung bezüglich der Datenbankverbindung erhalten, die in etwa wie folgt lautet:

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",'

Sollten Sie dieses Problem zum ersten Mal haben, überprüfen Sie am besten zuerst Ihre qteasy.cfg-Datei. Achten Sie dabei insbesondere auf die folgenden beiden Aspekte:

  • Ist der konfigurierte Schlüssel falsch? Die stabile Version von qteasy verwendet Datenbankverbindungsinformationen über Schlüssel wie local_db_host / local_db_port usw. anstelle von database_host. Früher gab es einige Fehler in der offiziellen Dokumentation, diese wurden jedoch in der neuesten Version korrigiert.

  • Bitte fügen Sie beim Angeben von Konfigurationsinformationen in der Datei keine anderen Zeichen wie ", < und > usw. hinzu. Andernfalls werden diese Zeichen als Teil des Tokens oder des Datenbanknamens interpretiert, was zu einem Fehlschlagen der Datenbankverbindung führt.

Wenn qteasy die Konfigurationsdatei parst, konvertiert es sie automatisch in das richtige Format, je nach Art der Konfiguration, z.B. sollte der Datenbankport 3306 eine int-Variable sein und direkt verwendet werden:

local_db_port = 3306

Kann gemacht werden. qteasy konvertiert den String 3306 in den int Typ 3306. -

Das folgende Beispiel für eine Konfigurationsdatei ist korrekt:

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

Beim Lesen von Daten aus der Datenbank wird eine Aufforderung zur Installation von sqlalchemy angezeigt.

Manchmal, wenn Sie eine Datenbank als Datenquelle verwenden und Daten aus der Datenbank lesen, kann die folgende Meldung angezeigt werden:

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.

Die obige Meldung legt nahe, dass Benutzer sqlalchemy verwenden.

Zusammenfassend handelt es sich um eine Benutzerwarnung. Es ist kein Fehler aufgetreten; die Daten wurden erfolgreich gelesen. Der Grund für diese Warnmeldung hängt mit der installierten Version von pandas zusammen. Sie müssen sqlalchemy nicht installieren; qteasy benötigt diese Abhängigkeit nicht mehr. Um die Ursache dieser Warnung zu ermitteln, überprüfen Sie bitte Ihre pandas-Version.

import pandas as pd
pd.__version__

Bei Verwendung von Pandas Version 1.1 oder höher kann diese Warnung auftreten, die die Nutzung jedoch in der Regel nicht beeinträchtigt. Der Grund dafür ist, dass Qteasy pymysql als Datenbankverbindungs-API nutzt, Pandas die Unterstützung für pymysql aber seit Version 1.1 schrittweise entfernt hat. Obwohl Tests zeigen, dass Qteasy auch in Pandas Version 1.5 noch Daten korrekt lesen kann, wird eine Warnmeldung angezeigt.

Die oben genannten Probleme stehen auf meiner Änderungsliste. Im kommenden kleineren Upgrade wird die Abhängigkeit von der pandas SQL-API entfernt und pymysql direkt zum Lesen der Datenbank verwendet. Dadurch wird diese Warnmeldung nicht mehr angezeigt. Falls Sie diese Warnmeldung nicht sehen möchten, können Sie die pandas-Version auch auf 1.1.0 herabstufen. qteasy hat während der frühen Entwicklungsphase durchgehend eine niedrigere Version von pandas verwendet, und die meisten Stabilitätstests basieren auf pandas Version 1.1. Wenn Sie pandas Version 1.1 verwenden, wird diese Warnmeldung nicht angezeigt, und alle anderen Funktionen funktionieren einwandfrei.


Der Download von Daten von tushare schlug fehl, da eine Fehlermeldung anzeigte, dass die Downloadfrequenz zu hoch war.

Einige Tushare-Daten haben eine begrenzte Lesefrequenz pro Minute. Wenn Sie nicht genügend Punkte haben, wird die Downloadfrequenz eingeschränkt, was zu unvollständigen Downloads einiger Daten führen kann, wie zum Beispiel der folgenden:

Führe das Skript aus:

>>> qt.refill_data_source(tables='events', start_date='20230101', end_date='20240403',reversed_par_seq=True)

Folgende Fehlermeldung erschien:

[##############--------------------------]6000/16923-35.5% <fund_share:016407.OF>37107wrtn/about 19 minleftC:\ProgramData\anaconda3\envs\qteasy-env-p311\Lib\site-packages\qteasy*database.py:5134*: UserWarning:
抱歉,您每分钟最多访问该接口600次,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108。:
download process interrupted at [fund_share]:<F180003.OF>-<016408.OF>
37107 rows downloaded, will proceed with next table!
warnings.warn(msg)
[#######################-----------------]10000/16923-59.1% <fund_manager:012277.OF>1264483wrtn/about 15 minleftC:\ProgramData\anaconda3\envs\qteasy-env-p311\Lib\site-packages\qteasy\database.py:5134: UserWarning:
抱歉,您每分钟最多访问该接口500次,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108。:
download process interrupted at [fund_manager]:<F180003.OF>-<012278.OF>
1264483 rows downloaded, will proceed with next table!
warnings.warn(msg)

Um dieses Problem zu beheben, hat qteasy einen speziellen Wiederholungsmechanismus entwickelt, der es umgehen oder abmildern soll.

Sie können versuchen, die folgenden Einstellungen in qteasy anzupassen, um die Anzahl der Wiederholungsversuche und die Latenzeinstellungen beim Herunterladen von Daten zu ändern. Diese Konfigurationsparameter sind speziell darauf ausgelegt, die Lesefrequenzbegrenzung von tushare zu berücksichtigen:

QT_CONFIG.hist_dnld_retry_cnt – Anzahl der Wiederholungsversuche beim Herunterladen von Daten (Standardwert: 7). QT_CONFIG.hist_dnld_retry_wait – Wartezeit in Sekunden nach dem ersten Downloadfehler (Standardwert: 1 Sekunde). QT_CONFIG.hist_dnld_backoff – Multiplikator für die Wartezeit bei einem erneuten Downloadfehler (Standardwert: 2).

Wenn qteasy eine tushare-Funktion aufruft, werden automatisch Wiederholungsversuche unternommen, wobei das Intervall zwischen den Versuchen schrittweise erhöht wird. Schlägt beispielsweise der erste Download fehl, pausiert das Programm eine Sekunde und versucht es erneut. Schlägt auch dieser Versuch fehl, wartet es zwei Sekunden, dann vier Sekunden, dann acht Sekunden usw., bis alle Wiederholungsversuche aufgebraucht sind. Dann wird eine Ausnahme ausgelöst.

Normalerweise verdoppelt sich die Verzögerung nach 7 Wiederholungsversuchen auf 32 Sekunden. Zusammen mit der vorherigen Verzögerung beträgt sie mehr als eine Minute. Normalerweise führt dies nicht zu einem Frequenzfehler. Bei zu hoher Netzwerkgeschwindigkeit oder zu vielen gleichzeitig laufenden Prozessen kann das oben genannte Problem jedoch auftreten.

An dieser Stelle können Sie versuchen, die Anzahl der Wiederholungsversuche auf 10 oder mehr zu erhöhen (dadurch verlängert sich die Downloadzeit erheblich) oder die anfängliche Wartezeit zu erhöhen.

>>> qt.configure(hist_dnld_retry_cnt=10, hist_dnld_retry_wait=2.)
>>> qt.refill_data_source(tables='events', start_date='20230101', end_date='20240403',reversed_par_seq=True)

Daten in Batches von tushare herunterladen

Manchmal müssen Daten in Batches heruntergeladen werden, wobei zwischen den einzelnen Batches eine bestimmte Pause eingelegt wird. Beispielsweise ist bei einigen Datentabellen auf tushare die Downloadfrequenz begrenzt, sodass die maximale Anzahl an Downloads pro Minute nicht überschritten wird. In diesem Fall lassen sich solche Batch-Downloads und Pausen mithilfe der folgenden beiden Konfigurationsparameter realisieren:

  • QT_CONFIG.hist_dnld_delay: Der Standardwert ist 0. Bei Angabe einer positiven ganzen Zahl gibt er die Anzahl der Downloads in jedem Batch beim Herunterladen in Batches an.

  • QT_CONFIG.hist_dnld_delay_evy: Der Standardwert ist 0. Bei Angabe einer positiven Ganzzahl wird die Wartezeit in Sekunden zwischen zwei Download-Batches festgelegt. Die folgende Konfiguration bewirkt, dass nach dem Herunterladen von 600 Datensätzen eine Minute gewartet wird:

>>> qt.configure(hist_dnld_delay=60, hist_dnld_delay_evy=600)
>>> qt.configure(hist_dnld_retry_cnt=3)  # 同时减少重试的次数以缩短报错前等待的时间,这个配置并不是必要的

Nach der oben beschriebenen Einrichtung übermittelt qteasy auch bei parallelem Download nicht alle Aufgaben gleichzeitig an den Prozesspool. Stattdessen werden sie in Batches übermittelt, und es wird eine gewisse Zeit gewartet, bevor der nächste Batch übermittelt wird.

Die oben genannten Funktionen wurden in Version v1.1.11 von qteasy hinzugefügt. Falls Sie eine ältere Version von qteasy verwenden, aktualisieren Sie bitte auf die neueste Version.


Wie lässt sich der minimale Workflow von der Datenerfassung bis zum Backtesting/zur Optimierung realisieren?

Es wird empfohlen, den Vorgang wie in der „Schnellstartanleitung“ beschrieben in einer Minute abzuschließen: tushare-Token konfigurieren → Daten herunterladen → Backtest mit der integrierten Strategie durchführen. Den vollständigen Workflow (Datenquelle konfigurieren → Daten herunterladen → Strategie und Backtest definieren → Parameteroptimierung → Simulation/Live-Lauf) sowie die zugehörigen Tutorials finden Sie in der [Schnellstartanleitung – Komplettübersicht/Tutorial](getting_started.md#End-to-End Roadmap–Tutorial). Wenn Sie die Tutorials in dieser Übersicht in der richtigen Reihenfolge befolgen, können Sie den gesamten Prozess von Grund auf durchführen.


Warum ist Backtesting/Optimierung langsam?

Mögliche Gründe sind:

  • Datenvolumen und Fensterlänge: Je länger das Backtesting-Intervall, je größer der Asset-Pool und je größer die window_length der Strategie, desto mehr Daten müssen für einen einzelnen Backtest aufbereitet und berechnet werden.

  • Anzahl der Parametergruppen: Im Optimierungsmodus (Modus=2) gilt: Je mehr Parameterkombinationen es gibt, desto häufiger muss ein einzelner Backtest durchgeführt werden. Dies wurde zwar durch die Parallelverarbeitung mehrerer Prozesse abgemildert, hängt aber immer noch von der Anzahl der Maschinenkerne und dem Umfang der Aufgabe ab.

  • Erste Numba-Kompilierung: Die Kernfunktionen für Backtesting (wie backtest_step und backtest_batch_steps) verwenden Numba JIT. Die Kompilierung wird beim ersten Durchlauf oder bei einer Änderung des Parametertyps ausgelöst, was zu einer einmaligen Verzögerung führt. Nachfolgende Backtests desselben Typs nutzen den Cache wieder, wodurch die Geschwindigkeit deutlich verbessert wird.

  • Datenvorbereitung: Wenn die Daten in der DataSource nicht im Voraus vorbereitet werden, werden Datenabruf und Fensterzusammenstellung vor dem Backtesting ausgelöst, was die erste Laufzeit ebenfalls verlängert.

Weitere Informationen zum Backtesting von Engines und zum Performance-Design finden Sie in den Abschnitten Backtesting Engines and Performance und Backtesting Engines and Performance (Design Perspective) im Abschnitt „Architecture and Design“.


Wie lassen sich „zukunftssichere Funktionen“ verstehen?

Qteasy verhindert durch seinen Mechanismus, dass die Strategie während des Backtests zukünftige Daten „sieht“: In jedem Zeitschritt wird der Strategie nur ein Fenster historischer Daten zugeführt, das zu diesem Zeitpunkt sichtbar ist. Die Strategie ruft die Daten innerhalb dieses Fensters mit get_data(dtype_id) in realize() ab. Metriken, die auf diesem Fenster berechnet werden (z. B. EMA), sind im Live-Handel konsistent mit den historischen Daten, die „nur zu diesem Zeitpunkt sichtbar“ sind. Dadurch wird die unbeabsichtigte Verwendung zukünftiger Daten vermieden. Die detaillierte Designbegründung (warum keine durchgehende axiale Quantisierung durchgeführt wird, wie Datenfenster schrittweise zugeführt werden usw.) finden Sie unter Design Intent and Unique Advantages in „Architecture and Design“.


Was ist use_latest_data_cycle und wie wird es festgelegt?

use_latest_data_cycle (oft abgekürzt als ulc) steuert, ob das von der Strategie verwendete Datenfenster den aktuellen Root-Candlestick (die aktuellsten Daten zum aktuellen Zeitpunkt) enthält: Bei True kann das Fenster den aktuellen Balken (z. B. den Schlusskurs) enthalten, was der Frage entspricht, ob der aktuellste Kurs während des Handels zulässig ist. Bei False enthält das Fenster ausschließlich Daten von vergangenen Schlusskursen. Diese Wahl hat einen erheblichen Einfluss auf die Rendite bei langfristigen Backtests. qteasy stellt sie als konfigurierbare Option in der Strategiedeklaration und der Laufzeitkonfiguration bereit. Weitere Informationen zu Bedeutung und Auswirkungen finden Sie unter Design Intent and Unique Advantages - use_latest_data_cycle. Spezifische Einstellungen finden Sie in den Deklarationen data_types / window_length in der Strategieklasse und in How the Strategy Declares and Uses Data sowie in den Konfigurationsanweisungen in der Dokumentation und API der aktuellen Version.