7. Backtesten Sie Ihre erste Handelsstrategie
qteasy ist ein vollständig lokalisiertes Paket für die quantitative Handelsanalyse, das folgende Funktionen bietet:
Abrufen, Bereinigen, Speichern, Verarbeiten, Visualisieren und Verwenden von Finanzdaten
Erstellung von quantitativen Handelsstrategien und Bereitstellung einer Vielzahl von integrierten Basisstrategien
Vektorisierte Hochgeschwindigkeits-Backtests von Handelsstrategien und Bewertung der Handelsergebnisse
Optimierung und Bewertung von Handelsstrategieparametern
Bereitstellung und Echtzeitbetrieb von Handelsstrategien
Durch diese Tutorials werden Sie anhand einer Reihe praktischer Beispiele die Hauptfunktionen und Verwendungsmöglichkeiten von qteasy vollständig verstehen.
7.1. Vorbereitungen vor dem Start
Stellen Sie vor dem Start dieses Tutorials sicher, dass Sie Folgendes beherrschen:
Installieren Sie
qteasyund aktualisieren Sie es auf die neueste Version, und konfigurieren Sieqteasyinitial.Konfigurieren Sie die lokale Datenquelle, beherrschen Sie die Methoden zum
7.2. Ziele dieses Abschnitts
In diesem Abschnitt werden wir ein Größenrotationstrading-Strategiemodul in qteasy erstellen,
Die Größenrotation ist eine sehr grundlegende und gängige Handelsstrategie, die die Eigenschaft nutzt, dass große und kleine Aktien oft nicht synchron steigen und fallen, und zwischen großen und kleinen Aktien wechselt, um eine höhere Rendite zu erzielen.
Hier müssen wir eine der einfachsten Rotationsstrategien erstellen: zwischen den beiden zuvor erwähnten Indizes zu rotieren und jeden Tag den Index mit der voraussichtlich höheren zukünftigen Rendite auszuwählen.
Berechnen Sie die Rendite der beiden Indizes in den letzten 20 Tagen, d.h. die Rendite des heutigen Preises im Vergleich zum Preis vor 20 Tagen
Wählen Sie den Index mit der höheren Rendite, halten Sie ihn am nächsten Tag und verkaufen Sie gleichzeitig den Index mit der niedrigeren Rendite
7.3. Umsetzung der Strategie
Basierend auf der obigen Strategie-Idee ist es sehr einfach, eine solche Rotations-Strategie in qteasy zu implementieren, da qteasy bereits über fast 70 eingebaute Handelsstrategien verfügt, die alle eindeutige Namen haben und durch direkte Bezugnahme auf die Namen verwendet werden können. Alle Handelsstrategien in qteasy müssen in einem Objekt namens Operator enthalten sein, das eigentlich ein Container für die Strategien ist und so interpretiert werden kann, dass ein einzelner Trader mehrere Strategien gleichzeitig verwalten und gleichzeitig ausführen kann, um Handelssignale zu erzeugen.
Trader-Objekte können direkt über qt.Operator() erstellt werden, wobei der Parameter strategies übergeben wird, um gleichzeitig eine Handelsstrategie zu erstellen:
>>> import qteasy as qt
>>> op = qt.Operator(
... strategies = 'ndayrate', # 创建交易员对象时,同时创建一个交易策略“ndayrate”
... run_freq='d', # 交易策略的运行频率为每天运行一次
... run_timing='close', # 交易策略的运行时机为每天股票收盘时运行
... )
Mit dem obigen Code haben wir eine Stock-Picking-Strategie (ndayrate) in qteasy erstellt, die eine eingebaute Stock-Picking-Strategie ist, die Aktien auf der Grundlage des „N-Tages-Kursanstiegs“ auswählt, und deren Stock-Picking-Logik darin besteht, den N-Tages-Kursanstieg aller Aktien im Pool zu bestimmen, und auf der Grundlage des Kursanstiegs wird sie dann Die Logik der Aktienauswahl besteht darin, den N-Tages-Kursanstieg aller Aktien im Aktienpool zu ermitteln und auf der Grundlage des Kursanstiegs Aktien oder Vermögenswerte auszuwählen (natürlich wird die Auswahlmethode durch Parameter konfiguriert, die im folgenden Abschnitt erläutert werden).
Verwenden Sie die Funktion qt.built_ins(), um eine detaillierte Beschreibung der eingebauten Richtlinien zu erhalten:
>>> qt.built_in_doc('ndayrate', print_out=True)
Die Ausgabe ist wie folgt:
以股票过去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)]
策略不支持参考数据,不支持交易数据
Zu diesem Zeitpunkt sind ein „Operator“-Objekt und eine Handelsstrategie erstellt worden.
Wir können „Operator.info()“ verwenden, um die Details des Trader-Objekts und der Handelsstrategien einzusehen, während auf alle Handelsstrategien über die Eigenschaft „Operator.strategies“ zugegriffen werden kann, und detailliertere Strategieparameter und Informationen können auch über die Methode „info()“ eingesehen werden
>>> op.info()
>>> stg = op.strategies[0] # 获取op的第一个策略,下面的几种方法是等效的
>>> # stg = op[0]
>>> # stg = op['ndayrate']
>>> # stg = op.get_strategy_by_id('ndayrate')
Die Ausgabe ist wie folgt:
==============================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,)
================================================================================
Sie können detailliertere Strategieparameter und Informationen auch über die Methode „info()“ der Handelsstrategie anzeigen:
>>> stg.info()
Ausgabe wie folgt
============================= 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
Wie Sie aus den obigen Informationen ersehen können, verfügt die Strategie ndayrate über eine Reihe von konfigurierbaren Parametern, und durch die Veränderung dieser Parameter können wir die Aktienauswahl der Strategie und damit die Leistung der Handelsstrategie anpassen.
Als Nächstes müssen wir einige minimale Einstellungen vornehmen, um sicherzustellen, dass diese Stock-Picking-Strategie Aktien so auswählt, wie wir es wollen. Alle Parameter im Objekt „Operator“ sind über die Methode „op.set_parameter()“ verfügbar.
>>> 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天
)],
... )
Im obigen Codeschnipsel legen wir das grundlegende Verhalten der Stock-Picking-Strategie mit ein paar einfachen Parametern fest:
sort_ascending=False: diese Strategie arbeitet, indem sie alle N-Tagesgewinne sortiert und dann die obersten nimmt, denn Sie müssen den maximalen Gewinn nehmen, also müssen Sie sie in absteigender Reihenfolge sortieren, und wenn Sie den minimalen Gewinn nehmen wollen, müssen Siesort_ascending=Truesetzen.proportion_or_quantity=1“: die Anzahl der auszuwählenden Bestände; da die Auswahl zwischen zwei Indizes festgelegt ist, wird dieser Parameter auf 1 gesetzt.
par_values=(20, )`: Strategieparameter N, auf 20 gesetzt, bedeutet, dass Aktien auf der Grundlage von 20 Tagen Gewinn ausgewählt werden.
data_types=[qt.StgData(...)]: Datentypen: Bestimmt, welche Daten die Strategie zur Berechnung des Auswahlfaktors verwendet. Hierbei wird ein StgData-Objekt verwendet, das folgende Parameter enthält:freq='d': Hier verwenden wir den Schlusskurs, um die Kursrenditen zu berechnen, und legen die Fensterlänge auf 25 fest, sodass bei jeder Ausführung der Strategie auch der aktuelle Tag angezeigt wirdasset_type='ANY': Asset-Typ: Diese Strategie gilt für jede Art von Asset. Natürlich kann es auch auf eine bestimmte Anlageart eingestellt werden, etwa Aktien, Indizes, Fonds etc.„use_latest_data_cycle=True“: Datenzyklus: Dieser Parameter steuert den Datenzyklus, der bei jeder Ausführung der Strategie verwendet wird. Wenn Sie es auf „True“ setzen, wird der neueste Datenzyklus verwendet – d. h. jede Aktienauswahl enthält den Schlusskurs des Tages. Wenn die Einstellung auf „Falsch“ gesetzt ist, enthalten die bei jedem Strategielauf angezeigten Daten nicht den Schlusskurs dieses Tages. Im realen Betrieb ist es tatsächlich unmöglich, mit dem genauen Schlusskurs des Tages zu handeln, da nach Marktschluss nicht mehr gehandelt werden kann. Wir können jedoch eine Minute vor Handelsschluss mit dem Echtzeitpreis handeln; Dieser Preis liegt normalerweise sehr nahe am Schlusskurs. Hier ist die Verwendung des Tagesschlusskurses ein vereinfachter Backtesting-Ansatz.
„window_length=25“: Länge des Datenfensters. qteasy stellt sicher, dass bei jeder Ausführung der Strategie nur Daten aus einem Zeitraum im Rückblick auf die aktuelle Laufzeit angezeigt werden, wodurch ein Look-Ahead-Bias vermieden wird. Wenn Sie den Wert auf 25 setzen, werden Ihnen bei jeder Aktienauswahl nur die 25 Preise von vor 25 Tagen bis zum aktuellen Tag angezeigt. So stellen Sie sicher, dass bei der Berechnung der 20-Tage-Rendite genügend Daten vorhanden sind.
Aufbereitung von Backtest-Daten
Nach der Konfiguration der Aktienauswahl-Strategie, müssen Sie die Leistung der Strategie durch Backtesting zu überprüfen, das heißt, den Aufruf der tatsächlichen historischen Daten des CSI 300 und GEM-Indizes, und die Durchführung von simulierten Trades, um zu sehen, ob die simulierten Ergebnisse können den breiten Markt übertreffen. In der Praxis verkaufen verkaufen den breiten Markt-Index ist nicht sehr einfach, aber in der Regel leicht zu finden Tracking-Breitmarkt-Index-ETF-Fonds, um den breiten Markt zu ersetzen, hier der Einfachheit halber, wir hier direkt in der 1. Januar 2011 investiert wurde, um den 31. Dezember 2020 zwischen CSI 300 und GEM-Index, vorausgesetzt, dass die Transaktionsrate von einem Zehntausendstel eines Cent, Zwei-Wege-Gebühr, schauen Sie sich die Ergebnisse der Investitionen! Wie.
Wir haben bereits gelernt, wie man historische Daten herunterlädt. Hier benötigen wir alle Daten für die Indizes CSI 300 und GEM zwischen 2013 und Ende 2022.
Hinweis Beim Herunterladen historischer Daten für das Backtesting müssen die heruntergeladenen Daten etwas länger sein als der Startpunkt des Backtesting-Datums, z. B. beginnt das Backtesting am 1. Januar 2013, wofür tatsächlich etwas mehr Daten benötigt werden, so dass der Startpunkt der heruntergeladenen Daten ab September 2012 liegen sollte. Eine detaillierte Analyse hierzu finden Sie in [Referenzdokument] (http://qteasy.readthedocs.io)
Verwenden Sie den unten stehenden Code, um die entsprechenden historischen Daten herunterzuladen:
>>> qt.refill_data_source(tables='index_daily', symbols='399006, 000300', start_date='20100901', end_date='20201231')
Bestätigen Sie, dass die Daten erfolgreich heruntergeladen wurden:
>>> qt.candle('000300.SH', start='20110101', end='20201231', asset_type='IDX', mav=[])
>>> qt.candle('399001.SZ', start='20110101', end='20201231', asset_type='IDX', mav=[])
Backtesting-Parameter konfigurieren
Sobald die Daten fertig sind, können Sie die Backtesting-Parameter konfigurieren und mit dem Backtesting beginnen. Das Backtesting der qteasy-Strategie ist vollständig parametrisiert. Vor dem Backtesting müssen wir dem System alle relevanten Informationen mitteilen, wie z.B. die Art des Produkts, in das investiert werden soll, den zu investierenden Geldbetrag, das Start- und Enddatum des Backtestings, die Methode zur Berechnung der Transaktionsgebühren für den Backtesting-Prozess, die Größe des Handelsloses usw. Wir können die grundlegende Konfiguration der Backtesting-Parameter mit qt.configure() vornehmen:
>>> 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, # 卖出资产时最小交易批量
... )
Die Bedeutung der obigen Konfiguration ist wie folgt
asset_pool=['000300.SH', '399006.SZ']: der Zielindex wird in Listenform angegeben, wenn Sie in andere Indizes oder ETF-Fonds investieren wollen, geben Sie einfach den Wertpapiercode direkt ein, wenn Sie Aktien aus drei oder mehr Wertpapieren auswählen wollen, fügen Sie diese einfach direkt der Liste hinzuinvest_amounts=100000: der Investitionsbetrag beträgt 100.000 Yuan, wenn Sie eine Reihe von Eingabestapeln simulieren müssen, können Sie auch eine Liste übergeben, aber Sie müssen das spezifische Datum jeder Eingabe separat angebenasset_type='IDX': Art der zugrunde liegenden Anlage:'E'für Aktien,'IDX'für Indizes,'FD'für Fonds,'FT'für Futures,'OPT'für Optionen.cost_rate_buy=0.0001: setzt das Verhältnis von Kauf- und Verkaufstransaktionsgebühren,qteasyunterstützt auch das Setzen der Mindestgebühr, Festgebühr und so weiter, hier kann einfach der Gebührensatz gesetzt werdencost_rate_sell=0.0001:invest_start='20110101': simulierter Handelsstarttermininvest_end='20201231': simuliertes Enddatum des HandelsTrade_batch_size=0“: die minimale Handelsgröße beim Kauf eines Vermögenswerts, „0“ bedeutet, dass Sie jede Aktie handeln können, „1“ bedeutet, dass Sie nur eine ganze Anzahl von Aktien handeln können, Sie können hier eine beliebige Zahl größer als „0“ eingeben.
sell_batch_size=0“: Mindestlosgröße von „0“ beim Verkauf einer Anlage
qteasy还有其他的配置参数,参见QTEASY文档。
7.4. Backtest-Ergebnisse der Strategie
Das Backtesting der qteasy-Strategie ist sehr einfach. Nachdem Sie alle Konfigurationen eingerichtet haben, können Sie mit dem Backtesting beginnen. Wir können qt.run() aufrufen, um das Backtesting zu starten:
>>> res = qt.run(op, mode=1, visual=True, trade_log=True) # 调用qteasy的run方法,启动回测交易
Nachdem Sie einige Augenblicke gewartet haben, ist der Backtest abgeschlossen und qteasy druckt automatisch den Backtestbericht wie folgt aus:
Die Ausgabe ist wie folgt:
Im Bericht sehen Sie direkt einen Vergleich zwischen unserer Gesamtinvestitionsrendite und der Rendite des CSI 300 Index im gleichen Zeitraum:
====================================
| |
| 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===================
Aus den Ergebnissen der Backtesting kann leicht gesehen werden, ist diese Strategie, um den CSI 300 breiten Markt-Index zu schlagen, in diesem Zehn-Jahres-Zeitraum des CSI 300 annualisierte Rendite von nur etwa 5%, sogar schlechter als einige der höheren Rendite befristete Produkte, während unsere Investitionen in diese Strategie erreicht eine annualisierte Rendite von 17,8% in zehn Jahren, das Gesamtvermögen von 100.000 Yuan aus dem $ 50 Millionen, mehr als fünf Mal!
7.5. Weitere Verbesserungen der Strategie
Wir haben mit der Strategie erste Erfolge erzielt, aber die Betrachtung der Gesamtrendite allein sagt noch nicht alles aus: Wie hat sich die Strategie im Laufe des Jahrzehnts entwickelt? Dies erfordert eine weitere Analyse, um festzustellen, ob die Strategie weiter verbessert werden kann. An diesem Punkt müssen wir uns die Ergebnisse des Backtestings genauer ansehen, insbesondere die Visualisierungsergebnisse und die Handelsdetailaufzeichnungen, und diese Aufzeichnungen und Berichte nutzen, um die Schwächen der Strategie und Verbesserungsmöglichkeiten zu finden.
Um uns weiter zu verbessern, müssen wir die Leistung der Strategie eingehender analysieren, ihre Mängel identifizieren und Verbesserungsmöglichkeiten finden. Zu diesem Zweck stellt qteasy die folgenden Tools zur Verfügung, die Benutzern bei der Analyse von Backtest-Ergebnissen helfen:
Backtest-Bericht: Sie müssen „report=True“ setzen. Der Backtest-Bericht fasst die Backtest-Ergebnisse in Textform zusammen und erleichtert so ein schnelles Erfassen der Anlagerendite und wichtiger Bewertungskennzahlen.
Visueller Bericht: Setzen Sie „visual=True“. Ein visuelles zusammengesetztes Diagramm stellt den Inhalt des Backtest-Berichts in grafischer Form dar und liefert detailliertere Informationen, sodass Benutzer die Backtest-Ergebnisse intuitiver verstehen können.
Handelsprotokolldatei: Erfordert die Einstellung: „trade_log=True“. Die Handelsprotokolldatei zeichnet jeden Strategiedurchlauf während des Backtests in Form einer CSV-Datei auf, einschließlich der Schlüsselvariablen des Strategiedurchlaufs und der jeweiligen Ergebnisse der Aktienauswahl. Dies macht es für Benutzer einfacher, den Ablauf der Strategie zu analysieren, ihre Mängel zu identifizieren und Verbesserungsmöglichkeiten zu finden.
Handelsdetailbericht: setze „trade_log=True“. Der Handelsdetailbericht zeichnet detaillierte Informationen zu jedem Handel in einer CSV-Datei auf, sodass Benutzer die Details jedes Handels einfacher analysieren, die Mängel der Strategie identifizieren und Verbesserungsmöglichkeiten finden können.
Als Nächstes werfen wir einen detaillierten Blick auf den Inhalt und die Verwendung jedes Tools, um die Backtest-Ergebnisse zu analysieren, die Mängel der Strategie zu identifizieren und Verbesserungsmöglichkeiten zu finden.
Ausführliche Erläuterung des Backtest-Berichts:
Der Backtest-Bericht von „qteasy“ enthält eine große Menge statistischer Informationen über Backtest-Ergebnisse. Gehen wir es der Reihe nach im Detail durch:
Teil 1: Grundlegende Backtest-Informationen
Der erste Teil des Berichts enthält die grundlegenden Informationen des Backtests, einschließlich der benötigten Zeit, des Start- und Enddatums, des gesamten Backtest-Zeitraums usw. Diese Informationen helfen uns, die Grundlagen des Backtests zu verstehen:
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. # 回测的总周期为十年
Teil 2: Statistiken zu Handelsaktivitäten
Der zweite Teil des Backtest-Berichts ist die Statistik der Handelsoperationen. In Listenform zählt es die Anzahl der Käufe und Verkäufe für jedes Anlageinstrument sowie den Anteil der gehaltenen Zeit:
Wir können beispielsweise sehen, dass 000300.SH (CSI 300 Index) über einen Zeitraum von zehn Jahren 75 Mal gekauft und 81 Mal verkauft wurde, mit einer Positionshaltezeitquote von 47,7 % und einer Cash-Zeitquote (außerhalb des Marktes) von 52,3 %; wohingegen 399006.SZ (ChiNext Index) über einen Zeitraum von zehn Jahren 105 Mal gekauft und 85 Mal verkauft wurde, mit einer Positionshaltezeitquote von 47,9 % und einer Cash-Zeitquote (außerhalb des Marktes) von 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%
Teil 3: Statistik der Backtest-Ergebnisse
Der dritte Teil des Backtest-Berichts enthält Statistiken zu den Backtest-Ergebnissen, einschließlich wichtiger Kennzahlen wie der Gesamtinvestitionsbetrag, das endgültige Gesamtvermögen, die Gesamtrendite, die jährliche Rendite, die Benchmark-Rendite und mehr:
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%
Teil 4: Kennzahlen zur Strategieleistung
Der vierte Teil des Backtest-Berichts umfasst Kennzahlen zur Strategieleistung, darunter wichtige Indikatoren wie Alpha, Beta, Sharpe Ratio, Information Ratio, 250-Tage-Volatilität, maximaler Drawdown usw.
------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日的峰值水平,也就是说,最大回撤持续了近五年时间
Verwendung von Visualisierungsberichten
Solange Sie die Umgebungskonfigurationsvariable „qteasy“ auf „visual=True“ setzen, können Sie am Ende des Backtest-Berichts einen visuellen Diagrammbericht der Ergebnisse sehen:
! Bildbeschreibung hier einfügen
Die Visualisierungsdiagramme stellen alle Informationen im Backtest-Bericht mithilfe zusammengesetzter Diagramme intuitiver dar. Wie Sie sehen können, enthält der Hauptteil dieses Diagramms sechs historische Liniendiagramme mit einer einheitlichen Zeitachse. Unten sind drei nebeneinander liegende Balkendiagramme zu sehen, die die jährlichen und monatlichen Renditen zusammenfassen.
Insgesamt lässt sich dieses Diagramm in vier Teile unterteilen. Gehen wir sie einzeln durch:
Teil 1: Grundlegende Informationen und Kennzahlen zur Kapitalrendite
Ganz oben im Diagramm werden die grundlegenden Backtest-Informationen und Renditekennzahlen angezeigt. Diese Informationen stimmen im Wesentlichen mit den Angaben im Backtest-Bericht überein, einschließlich wichtiger Renditekennzahlen wie der Gesamtrendite der Anlage, der jährlichen Rendite und der Rendite des Referenzindex, und helfen Benutzern, die Performance der Anlage schnell zu verstehen.

Teil 2: Renditekurvendiagramm
Der Abschnitt zur historischen Renditekurve des Backtests enthält drei Diagramme. Sie alle weisen historische Renditen auf, haben jedoch jeweils einen anderen Schwerpunkt.

Die drei Diagramme sind:
Renditekurve: Dieses Kurvendiagramm verwendet Prozentsätze und zeichnet die historischen Renditekurven der Anlagerenditen und Benchmark-Renditen mit zwei Linien auf (standardmäßig ist der Benchmark der CSI 300 Index; Sie können andere Indizes über die Umgebungskonfigurationsvariable „reference_asset“ festlegen). Die rote Kurve stellt die Portfoliorendite dar, während die blaue Kurve die Referenzindexrendite darstellt. Dieses Diagramm enthält einige zusätzliche Informationen, die über Umgebungsvariablen aktiviert oder deaktiviert werden können:
Drawdown-Indikator: Verwendet schwarze Pfeile, um den Höchst-, Tiefst- und Wiederherstellungszeitpunkt des größten Einzelrückgangs innerhalb des Investitionszeitraums zu markieren, sodass Benutzer den maximalen Rückfluss der Investition leichter verstehen können.
Kauf-/Verkaufsindikator (setzen Sie „buy_sell_points=True“): Auf der grünen Linie, die die Benchmark-Renditekurve darstellt, ist jeder Kauf und Verkauf zum entsprechenden Zeitpunkt mit einem rot/grünen Pfeil markiert. Rot zeigt an
Positionsindikator (setzen Sie „show_positions=True“): Der Diagrammhintergrund verwendet helle vertikale Streifen, um das Positionsverhältnis für jeden Zeitraum anzuzeigen. Grün steht für eine Long-Position und Rot für eine Short-Position (die obige Abbildung zeigt nur Long-Positionen, keine Short-Positionen). Je dunkler die Streifenfarbe, desto höher das Positionsverhältnis; umgekehrt weist es auf ein geringeres Positionsverhältnis hin.
Logarithmische Renditekurve: Dieses Kurvendiagramm verwendet logarithmische Renditen als Einheit und zeigt die historischen Kurven von Anlagerenditen und Benchmark-Renditen. Die logarithmische Renditekurve kann den Trend der Änderungen der Anlagerenditen besser darstellen, insbesondere wenn die Renditen relativ hoch oder niedrig sind, wodurch Änderungen der Renditen deutlicher werden.
Rendite-Balkendiagramm: Dieses Diagramm verwendet Balken, um den täglichen Gewinn-/Verlustbetrag innerhalb des Backtest-Verlaufszeitraums anzuzeigen.
Aus dem Diagramm der Renditekurve können Sie ersehen, dass die Gesamtrendite zwar recht gut ist, der Drawdown jedoch relativ hoch ist und maximal 45 % beträgt.
Sie können sich vorstellen, dass, wenn ein Anleger am 3. Juni 2015 mit der Investition beginnen würde, das Ergebnis wäre: ein Verlust von 45,9 % bis zum 3. Januar 2019, und er würde erst nach 2020 die Gewinnschwelle erreichen!
Teil 3: Diagramm der Leistungsmetrikkurve
Der dritte Teil der Diagramme ist der Abschnitt mit Kennzahlen zur Strategieleistung, der hauptsächlich zur Bewertung der Rentabilität und Risikokontrollfähigkeit der Strategie verwendet wird. Es enthält außerdem drei Diagramme:

Profitabilitätskennzahlen: Das erste Diagramm zeigt die Kennzahlen, die zur Bewertung der Rentabilität der Strategie verwendet werden, und zeigt die historischen Rollwerte von zwei Indikatoren an: Sharpe Ratio und Alpha. Beide Indikatoren werden häufig verwendet, um die Fähigkeit einer Handelsstrategie zu bewerten, Übergewinne (d. h. über der Benchmark) zu erzielen. Jeder Punkt auf den beiden Linien im Diagramm stellt die rollierende Sharpe-Ratio und das Alpha dar, die über die letzten 250 Handelstage bis zu diesem Tag berechnet wurden. Sie können also sehen, wie sich diese beiden Linien im Laufe der Zeit verändern. Je höher die Sharpe Ratio, desto besser ist die risikoadjustierte Rendite der Strategie; Je höher das Alpha, desto besser ist die Überrendite der Strategie im Vergleich zum Referenzindex.
Metriken zur Risikokontrollfähigkeit: Das zweite Diagramm zeigt die Metriken, die zur Bewertung der Risikokontrollfähigkeit der Strategie verwendet werden, und zeigt die historischen rollierenden Werte von zwei Indikatoren an: Beta und Volatilität. Beide Indikatoren bewerten, ob die Strategie das Risiko kontrollieren kann. Je niedriger das Beta, desto geringer ist das systematische Risiko der Strategie im Vergleich zum Referenzindex. Je geringer die Volatilität, desto geringer die Schwankung der Rendite der Strategie.
Metrik der Drawdown-Kontrollfähigkeit: Das dritte Diagramm ist das Drawdown-Unterwasserdiagramm und zeigt die Bewertungsmetrik der Drawdown-Kontrollfähigkeit der Strategie. Es zeigt die historische Kurve der Anlagerendite und die historische Abwärtskurve der Anlagerendite (d. h. die „Unterwasser“-Kurve). Jeder Rückgang in dieser Kurve zeigt an, dass die Anlagerenditekurve im Vergleich zu einem vorherigen Höchststand gesunken ist; Je tiefer der Rückgang ist, desto stärker ist der Rückgang. Ein vollständiger Tauchgang und das erneute Auftauchen entspricht einem vollständigen Absinkzyklus. Gleichzeitig markiert dieses Diagramm mit grauen Balken die fünf tiefsten Drawdown-Perioden in der Geschichte; Je breiter der graue Balken, desto länger dauerte der Drawdown.
Aus der Tiefseekarte können Sie ersehen, dass es sich während des gesamten Zehnjahreszeitraums, mit Ausnahme von ein oder zwei kurzen Jahren, fast immer in einem unter Wasser befindlichen, gefangenen Zustand befand und die maximale Unterwassertiefe mehr als 45 % erreichte. Während des zehnjährigen Anlagezeitraums verzeichnete das Gesamtvermögen immer wieder Rückgänge; Der Drawdown von 45 % war der größte und tiefste, aber früher gab es auch mehrere Drawdowns wie 26 % und 22 %, und keiner davon war Short. Die gesamte Investition sei im Grunde „auf lange Sicht gefangen gewesen, mit gelegentlichen Chancen auf eine Erholung“. Ich glaube, nur sehr wenige Anleger könnten eine solche Tortur ertragen, oder?
Teil 4: Retourenstatistikdiagramm
Ganz unten finden Sie drei Diagramme nebeneinander, die die Jahres- bzw. Monatsrenditen aus unterschiedlichen Perspektiven zusammenfassen:

Monatliche Rendite-Heatmap: Zeigt die Renditen für jeden Monat (X-Achse) über Jahre hinweg (Y-Achse) in farbigen Blöcken an. Je grüner die Farbe, desto höher die Rendite; Je rötlicher die Farbe, desto geringer die Rendite bzw. desto größer der Verlust.
Balkendiagramm zur jährlichen Rendite: Zeigt intuitiv die Rendite für jedes Jahr an. Grüne Balken zeigen positive Renditen an, rote Balken zeigen Verluste an; Je höher der Balken, desto größer ist der absolute Wert des Gewinns/Verlusts.
Monatliches Rendite-Histogramm: Es zählt die Renditen für alle Monate und stellt deren Wahrscheinlichkeitsverteilung dar. Insgesamt ähnelt dieses Diagramm normalerweise einer Glockenkurve ähnlich einer Normalverteilung. Abhängig von der Leistung der Strategie kann sich die Glockenkurve jedoch insgesamt nach rechts verschieben, was auf eine höhere Gesamtwahrscheinlichkeit für die Erzielung positiver Renditen hinweist, oder sie kann schief werden, was den Benutzern hilft, die Verteilung der Renditen statistisch zu verstehen.
Unten sind außerdem drei Diagramme nebeneinander zu sehen, die jeweils die historischen Renditen für das Kalenderjahr oder den Monat auflisten. Daraus ist ersichtlich, dass drei Jahre des gesamten Jahrzehnts (2011, 2016 und 2018) negative Renditen aufwiesen, während die übrigen Jahre positive Renditen erzielten.
An diesem Punkt haben wir durch die Analyse der Diagramme nun ein sehr intuitives Verständnis der Gesamtrenditen der Handelsstrategie: Das größte Problem bei dieser Strategie besteht darin, dass sie Drawdowns nicht gut kontrollieren konnte.
Daher können wir Wege finden, die Strategie zu verbessern und herauszufinden, wie wir die Retracements reduzieren und die Leistung der Strategie verbessern können. Dazu müssen wir jeden Handel während des Backtesting-Prozesses für den simulierten Handel sorgfältig analysieren und nach Möglichkeiten zur Verringerung der Retracements suchen. Um alle Details der im Backtesting getesteten Trades zu sehen, müssen wir uns den Trade Detail Report ansehen.
Als nächstes fahren wir mit einer detaillierten Erläuterung der Handelsprotokolldatei fort.
Detaillierte Erläuterung des Handelsprotokolls / Handelsberichts
Solange wir die Umgebungsvariable „trade_log=True“ setzen, generiert das System nach jedem Backtest mehrere CSV-Dateien (zumindest einschließlich des Handelsprotokolls und des Handelsdetailberichts; in der aktuellen Version wird bei aktivierter Option auch die Nettowertkurve „value_curve_*“ usw. geschrieben; siehe, was tatsächlich generiert wird). Der Speicherpfad dieser Dateien wird durch das Konfigurationselement „trade_log_file_path“ gesteuert, das standardmäßig „QT_ROOT_PATH/tradelog/“ lautet. Dieser Pfad unterstützt relative Pfade, absolute Pfade und Home-Verzeichnispfade, die mit „~“ beginnen, und kann zur Laufzeit über „qt.configure(trade_log_file_path=‘…‘)“ geändert werden und sofort wirksam werden (Hot-Update), ohne dass ein erneuter Import erforderlich ist. Zum Beispiel:
Geben Sie unter Windows ein Verzeichnis auf einem anderen Laufwerk an: „qt.configure(trade_log_file_path=‘C:\qt_trade_logs')“.
Geben Sie unter macOS/Linux ein Verzeichnis in Ihrem Home-Ordner an: „qt.configure(trade_log_file_path=‘~/qt_trade_logs/‘)“.
Festplattenaufbewahrungsrichtlinie: Das Konfigurationselement trade_log_keep_days ist standardmäßig auf 3 eingestellt, was bedeutet, dass nach jedem neuen Prozess, der „qteasy“ importiert, abgelaufene Backtest-CSV-Dateien im Verzeichnis „trade_log_file_path“ entsprechend dieser Anzahl von Tagen bereinigt werden, z. B. „trade_log_“, „trade_summary_“ usw value_curve_* (es wird nicht automatisch bereinigt, bevor Dateien für jeden Backtest geschrieben werden). Um alle historischen Dateien langfristig aufzubewahren, setzen Sie trade_log_keep_days auf None oder kleiner oder gleich 0; Sie können auch jederzeit qt.rotate_trade_logs(days=...) aufrufen, um manuell zu bereinigen.
Wenn Sie den aktuellen Speicherpfad der Protokolldatei anzeigen möchten, verwenden Sie bitte:
import qteasy as qt print(qt.QT_TRADE_LOG_PATH)

Öffnen Sie den Ordner unter diesem Pfad und Sie können Berichte von jedem Backtest sehen. Alle Berichte werden zum einfachen Öffnen in Excel als CSV-Dateien gespeichert. Zu den gängigen Typen gehören:
Handelsprotokoll: Dateien, die mit „trade_log“ beginnen, sind Handelsprotokolldateien, die detaillierte Informationen für jede Strategieausführung auflisten.
Handelsbericht: Dateien, die mit „trade_summary“ beginnen, sind Handelsberichte, in denen Informationen zu jedem Handel aufgeführt sind.
Nettowertkurve (falls generiert): Dateien, die mit „value_curve“ beginnen, zeichnen die vollständige Nettowertreihe usw. auf.
Alle oben genannten Dateien enden mit dem Datum/der Uhrzeit des Backtest-Laufs, um Protokolldateien zu unterscheiden, die zu unterschiedlichen Zeiten erstellt wurden. Wir erklären sie separat:
Interpretation der Handelsprotokolle
Öffnen Sie die erste Datei mit Excel, um das Handelsprotokoll anzuzeigen. Das Handelsprotokoll zeichnet in einer Tabelle Informationen wie Änderungen der Mittel für jede Strategieausführung, Änderungen der Positionen und Handelsdetails für jede Aktie auf. Unabhängig davon, ob es sich um Trades oder Positionsänderungen handelt, gibt es jeden Tag eine Aufzeichnung:
Der gesamte Handelsverlauf ist in der Tabelle nach Zeilen geordnet, wobei alle acht Zeilen eine Gruppe bilden. Jede Gruppe zeichnet einen Trade auf, und die Informationen vom ersten bis zum letzten Trade werden in der Reihenfolge von oben nach unten aufgezeichnet.
Die acht Zeilen in jeder Datensatzgruppe erfassen jeweils Folgendes:
0, Handelssignal Handelssignale: Zeichnet die nach diesem Lauf generierten Handelssignale auf (Handelssignale sind eine Reihe von Zahlen; nach der Signalanalyse werden sie zu Handelsaufträgen. Weitere Informationen finden Sie unter Handelssignale.
1, Preis Handelspreis: Zeichnet die Handelspreise jeder Aktie während dieses Laufs auf.
2, gehandelte Beträge. Gehandelte Menge: Zeichnet die tatsächlich gehandelte Menge für jede Aktie nach diesem Lauf auf. Positive Zahlen geben die Kaufmenge an, negative Zahlen die Verkaufsmenge und 0 bedeutet kein Handel.
3, Bargeldwechsel Bargeldwechsel: Zeichnet den Betrag des Bargeldwechsels auf, der durch tatsächliche Geschäfte für jede Aktie nach diesem Lauf verursacht wurde. Positive Zahlen bedeuten einen Anstieg des Bargeldbestands, negative Zahlen bedeuten einen Rückgang des Bargeldbestands und 0 bedeutet keine Veränderung.
4, Handelskosten Transaktionskosten: Erfasst die tatsächlich angefallenen Transaktionskosten für jede Aktie nach diesem Lauf.
5, eigene Beträge Positionsgröße: Zeichnet die für jeden Bestand nach diesem Lauf gehaltene Menge auf. Positive Zahlen geben die Größe einer Long-Position an, negative Zahlen geben die Größe einer Short-Position an und 0 bedeutet keine Position.
6, verfügbare Mengen Verfügbare Positionen: Erfasst die verfügbare Menge für jeden Bestand nach diesem Lauf. Positive Zahlen geben die Größe der verfügbaren Long-Position an, negative Zahlen geben die Größe der verfügbaren Short-Position an und 0 bedeutet, dass keine Bestände verfügbar sind.
7, Zusammenfassung Zusammenfassung: Zeichnet die gesamten gehaltenen/verfügbaren Barmittel, den gesamten Marktwert der Bestände und den gesamten Portfoliowert nach diesem Lauf auf.
Durch genaue Betrachtung des Handelsprotokolls kann die gesamte Tabelle durch Spalten in drei oder vier Gruppen unterteilt werden, die jeweils Informationen aus einer anderen Perspektive liefern:
Kopfzeilenbereich: Die erste Spalte im Kopfzeilenbereich zeichnet das Datum und die Uhrzeit jedes Laufs auf, die zweite Spalte zeichnet den Namen der Strategiegruppe für jeden Lauf auf (Einzelheiten finden Sie unter Strategiegruppen) und die dritte Spalte beschriftet den Namen jeder Zeile.
Aufzeichnung der Bargeldbestände: In der Zusammenfassungszeile dieses Bereichs werden die vor jedem Lauf zusätzlich investierten Barmittel, die gesamten am Ende des Zeitraums gehaltenen Barmittel/die gesamten verfügbaren Barmittel und der Gesamtwert des Portfolios (einschließlich der gesamten Barmittel und des gesamten Börsenwerts) erfasst.
Strategy Runtime-Variablenverfolgung: Die Verfolgung von Strategie-Laufzeitvariablen ist optional. Es ermöglicht Benutzern, Tracking-Punkte in die Strategie einzufügen, um die Werte von Variablen während der Strategieausführung zu verfolgen, was beim Strategie-Debugging sehr nützlich ist. Wir werden es vorerst überspringen; Einzelheiten finden Sie in
Bestandsaufzeichnungen: In diesem Bereich werden Informationen wie die Anzahl der gehaltenen Aktien, die Anzahl der gehandelten Aktien und der Handelspreis für jede Aktie im Investmentaktienpool angezeigt. Jede Spalte zeigt die Daten für eine Aktie und die Anzahl der Spalten entspricht der Anzahl der Aktien im Aktienpool.
Basierend auf dem obigen Verständnis können wir den Umsetzungsprozess der Strategie analysieren und sehen, wie die Strategie Aktien auswählt und rotiert.
! Bildbeschreibung hier einfügen
Wie oben gezeigt, können wir die Laufaufzeichnungen der ersten vier Tage nutzen, um ein tieferes Verständnis für die Funktionsweise der Strategie zu gewinnen:
Tag 1: Ein Anfangskapital von 100.000 Yuan wurde investiert und die Investition begann. Gleichzeitig können wir sehen, dass die Gewinne des CSI 300 und des ChiNext Index an diesem Tag 0,76 % bzw. 1,83 % betrugen. Gemäß den Strategieregeln kauften wir zum Handelsschluss 86,56 Aktien des ChiNext-Index und gaben dafür 99.996,32 Yuan aus. Nach dem Handel hielten wir 86,56 Aktien des ChiNext-Index;
Tag 2: Die Gewinne des ChiNext Index und des CSI 300 Index betrugen -0,77 % bzw. -0,56 %. Beim Vergleich der beiden lag der ChiNext-Index immer noch vorne, so dass die Position unverändert bleibt;
Tag 3: Der Anstieg des CSI 300 Index übertraf den des ChiNext Index. Zu diesem Zeitpunkt kehrte sich das Handelssignal um und erzeugte sowohl ein CSI 300-Kaufsignal als auch ein ChiNext-Verkaufssignal. Allerdings wurde nur das ChiNext-Verkaufssignal ausgeführt: Wir haben alle 86,56 Aktien verkauft. Das CSI 300-Kaufsignal konnte nicht ausgeführt werden, da der Barbestand nicht ausreichte – es standen nur 3,68 Yuan zur Verfügung.
Tag 4: Die Handelssignale kehrten sich weiter um. Zu diesem Zeitpunkt trat das CSI 300-Kaufsignal in Kraft und wir kauften 31,01 Aktien des CSI 300 Index mit unserer vollen Position.
…
Mit der oben genannten Methode zeichnet die Handelsprotokolldatei alle Handelsinformationen über insgesamt 2.431 Handelstage über einen Zeitraum von zehn Jahren vollständig auf, sodass wir die Gewinne und Verluste jedes Handels sorgfältig analysieren können.
Eine sorgfältige Analyse der obigen Tabelle zeigt, dass diese Anlagestrategie bis auf einen Aktienwechsel vollständig investiert ist, und dies galt auch während des Börsencrashs Mitte 2015. Wenn wir uns diesen Zeitraum ansehen, stellen wir fest, dass die 20-Tage-Renditen sowohl des CSI 300 Index als auch des ChiNext Index ab dem 18. Juni 2015 bereits von positiv in negativ umgeschlagen waren, was darauf hindeutet, dass der Markt begonnen hat zu sinken. Zu diesem Zeitpunkt hielt die Strategie den ChiNext-Index jedoch immer noch fest, da sein Rückgang geringer war als der des CSI 300 – mit anderen Worten, seine Rendite war höher als die des CSI 300:
! Bildbeschreibung hier einfügen
Tatsächlich wählte unsere Strategie zu diesem Zeitpunkt immer noch den richtigen Index. Da beide Indizes fielen, hielten wir nur an demjenigen fest, der weniger fiel, und reduzierten so unsere Verluste.
Aber genau unsere Geschäftstätigkeit in diesem Zeitraum verursachte den größten Rückgang in unserer zehnjährigen Investitionsgeschichte: Von Juni 2025 bis 2020 saßen wir ganze fünf Jahre lang tief in der Falle!!
Transaktionsdetailbericht
Obwohl das Handelsprotokoll alle Informationen ausführlich enthält, müssen wir uns manchmal nicht so viele Daten ansehen. In diesem Fall können wir den Handelsbericht verwenden.
Der Handelsbericht ist eine kompakte Version der Handelsprotokolldatei. Es ignoriert alle Strategielaufdatensätze ohne wesentliche Geschäfte und behält nur alle wesentlichen Handelsdatensätze bei, einschließlich Handelsdatum, Kauf-/Verkaufsrichtung, Anzahl der Aktien, Preis, Gesamtbetrag, Transaktionsgebührensatz usw. Da nur tatsächlich getätigte Geschäfte erfasst werden, sind die Informationen kompakter:
! Bildbeschreibung hier einfügen
Wie Sie der obigen Abbildung entnehmen können, wird in jeder Zeile des Handelsberichts ein tatsächlicher Handelsdatensatz erfasst. Wenn am selben Tag mehrere Handelsdatensätze vorliegen, werden diese in unterschiedlichen Zeilen erfasst.
In jeder Zeile des Handelsberichts werden Informationen wie Handelssignal, Handelspreis, Handelsmenge, Bargeldwechsel, Transaktionsgebührensatz und Positionsgröße nach dem Handel aufgezeichnet. Die Spaltennamen enthalten genau die gleichen Informationen wie das Handelsprotokoll.
7.6. Weitere Verbesserungen der Strategie
Basierend auf der obigen Analyse der Handelsstrategie stellten wir fest, dass diese Strategie zwar relativ gute Anlageergebnisse erzielte, bei der Kontrolle von Drawdowns jedoch schlecht abschnitt: Da sie die Phase des Börsencrashs nicht vermeiden konnte, landete sie tief in der Falle.
Können wir also unsere Strategie von hier aus verbessern? Die Idee ist einfach: Wir können eine Regel hinzufügen:
Berechnen Sie täglich den Anstieg der beiden Indizes in den letzten 20 Tagen, d.h. den Anstieg des heutigen Kurses gegenüber dem Kurs vor 20 Tagen.
Wenn beide Indizes am Tag der Aktienauswahl kleiner als 0 sind, gehen wir am nächsten Tag eine Short-Position ein und halten keinen der Indizes
Andernfalls wählen Sie diejenige mit dem größeren Gewinn und halten sie am nächsten Tag, während Sie diejenige mit dem kleineren Gewinn verkaufen.
Wir haben der ursprünglichen einfachen Aktienauswahlregel einen „Filter“ hinzugefügt, um Fälle auszuschließen, in denen beide Indizes kleiner als 0 sind. OK, und wie passen wir sie in qteasy an, um diese neue Änderung zu berücksichtigen?
Verbesserte Richtlinieneinstellungen
Die in qteasy eingebaute Stockpicking-Strategie bietet eine Filterbedingung condition Attribut, standardmäßig condition='any', was bedeutet, dass es keine Filterbedingung gibt, jetzt müssen wir die Erträge herausfiltern, die kleiner als 0 sind, also können wir condition='greater' setzen und auch den Filterbereich ubound =0:
>>> op.set_parameter(0,
... condition='greater', # 新增过滤条件:20日涨幅大于等于
... ubound=0.0, # 过滤条件值:0
... )
Der obige Aufbau ist im Wesentlichen derselbe wie im vorangegangenen Abschnitt, wobei zwei Parameter hinzugefügt wurden:
condition='greater': Dies bedeutet, dass ein Filter hinzugefügt wird, der besagt, dass der N-Tages-Gewinn größer oder gleich einem bestimmten Wert sein muss, um an der Aktienauswahl teilzunehmen, der im Parameteruboundfestgelegt wird. Dieser Wert wird im Parameteruboundfestgelegt. Das bedeutet, dass Aktien, die kleiner als dieser Wert sind, von der Auswahl ausgeschlossen werden.ubound=0: auf 0 gesetzt, so dass nur Indizes mit einem Anstieg größer oder gleich 0 ausgewählt werden können, aber natürlich kann er auch auf jede andere Fließkommazahl gesetzt werden
Verbesserte Ergebnisse
Folgen Sie wieder der vorherigen Konfiguration und führen Sie qt.run() direkt aus. Hier stellen wir das Ergebnis direkt ein:
>>> res=qt.run(op, visual=True, trade_log=True)
Die Ausgabe ist wie folgt:
====================================
| |
| 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===================
Das Visualisierungsdiagramm sieht wie folgt aus: 
Das Diagramm zur Visualisierung sieht wie folgt aus: ! Hier Bildbeschreibung einfügen Wie Sie aus dem Vermögensrendite-Diagramm ersehen können, hat sich das ursprüngliche Grün (durchgehend gehaltene Positionen) in Weiß und Grün verwandelt (weißer Bereich mit Short-Positionen in Münzen), und das Retracement des Vermögens wurde drastisch optimiert: von dem ursprünglichen 50%-Retracement auf etwa 20%. Und auch die Gesamtrendite hat sich deutlich verbessert:
Das Gesamtvermögen stieg von über einer halben Million vor den Verbesserungen auf eine Million
Der Gesamtertrag stieg von 400 Prozent auf 900 Prozent
Die annualisierte Rendite stieg von 17 Prozent auf 26 Prozent
Maximales Retracement von 50 Prozent auf 20 Prozent reduziert
Ein Blick auf die Handelshistorie zeigt, dass die Strategie in der Tat während des Crashs Ende Juni 2015 short blieb und dem einseitigen Rückgang auswich.
7.7. Diese Bewertung
In diesem Tutorial haben wir uns mit der Handelsstrategie von „qteasy“ durch die Erstellung, das Backtesting und die Änderung einer Small-Cap-Rotationshandelsstrategie vertraut gemacht. Wir haben gelernt, wie man ein einzelnes Strategie-Händlerobjekt erstellt, indem man auf die integrierte Handelsstrategie verweist und die Strategie ausführt, um Backtest-Ergebnisse zu erhalten. Ab dem nächsten Tutorial werden wir die integrierten Handelsstrategien von „qteasy“ ausführlicher besprechen und die Implementierung von Kombinationsstrategien vorstellen. Wir werden dem Händlerobjekt weitere Strategien hinzufügen und die Kombinationsmethode festlegen, um durch Strategiekombination komplexere Effekte zu erzielen und mehr Strategiekontrolle und -typen zu verstehen.