8. Entwickeln Sie eine komplexere Strategie

qteasy ist ein vollständig lokalisiertes Paket für die Entwicklung und Ausführung von quantitativen Handelsstrategien. Es bietet folgende Funktionen:

  • Finanzdaten abrufen, bereinigen, speichern, verarbeiten, visualisieren und verwenden

  • Entwicklung von quantitativen Handelsstrategien und Bereitstellung einer Vielzahl von integrierten Basisstrategien

  • Backtesting von Hochgeschwindigkeitshandelsstrategien zur Quantifizierung und Bewertung der Handelsergebnisse

  • Optimierung und Bewertung der Parameter der Handelsstrategie

  • Einsatz von Handelsstrategien, Live-Läufe

Durch diese Reihe von Tutorials erhalten Sie ein umfassendes Verständnis der Hauptfunktionen von qteasy und wie man es durch eine Reihe von praktischen Beispielen benutzt.

8.1. Vorbereitung des Starts

Bevor Sie mit diesem Teil des Tutorials beginnen, sollten Sie sich vergewissern, dass Sie die folgenden Punkte beherrschen:

  • Installieren und konfigurieren Sie qteasy – siehe QTEASY Tutorial 1 für Details.

  • Eine lokale Datenquelle wurde eingerichtet und genügend historische Daten wurden lokal heruntergeladen (einschließlich des Handelskalenders, grundlegender Aktien-/Fonds-/Indexinformationen, Aktien-/Fonds-/Indexkursdaten und Finanzindikatoren oder anderer Finanzdaten - siehe [QTEASY Tutorial 2](2.0-get-data.md für weitere Details! )

  • Lernen Sie, Händlerobjekte zu erstellen, eine integrierte Handelsstrategie zu verwenden und ihre historische Performance zu testen, Backtest-Protokolle zu untersuchen, zu verstehen, wie man die Betriebsparameter der Strategie oder einstellbare Parameter anpasst, um die Performance der Strategie zu verbessern - QTEASY Tutorial 3

In der [QTEASY-Dokumentation] (https://qteasy.readthedocs.io/de/latest/) finden Sie außerdem weitere Informationen darüber, wie Sie Trader-Objekte erstellen, um Strategien auszuführen, Backtesting-Strategien mit historischen Daten durchzuführen, Backtesting-Handelsdatensätze zu überprüfen, Strategien zu ändern und vieles mehr. Für diejenigen unter Ihnen, die mit den Grundlagen der Verwendung von qteasy nicht vertraut sind, können Sie dort eine ausführlichere Anleitung finden.

8.2. Ziele dieses Abschnitts

Im vorherigen Tutorial-Abschnitt haben wir ein Operator-Händlerobjekt erstellt und es die erste Handelsstrategie zur Aktienauswahl ausführen lassen. Allerdings ist ein Händler in qteasy zu weit mehr in der Lage, als nur eine einzelne Handelsstrategie umzusetzen. Tatsächlich ist das Operator-Objekt wie ein echter Händler: Es kann eine beliebige Anzahl von Handelsstrategien gleichzeitig verwalten und ausführen. Diese Strategien können separat zu unterschiedlichen Zeiten und mit unterschiedlicher Häufigkeit ausgeführt werden, oder viele können zusammen in einem Stapel ausgeführt werden; Auch parallel laufende Strategien können beliebig in die gewünschte Form „überblendet“ werden.

Sie können sich einen Händler als einen Maler vorstellen, der eine Palette mit Farben verschiedener Farben in der Hand hält. Sie können verschiedene Farben verwenden, um lebendige Linien zu zeichnen, oder mehrere Farben mischen, um weiche Übergangstöne zu erzeugen. Selbst wenn der Maler nur eine Handvoll Farben hat, kann sein Pinsel auf diese Weise immer noch Millionen von Farben mischen, aus denen die weite Welt besteht.

Dies ist genau eines der zentralen Designkonzepte von „qteasy“: Mithilfe der folgenden beiden Tools kann das Operator-Händlerobjekt sehr einfache Handelsstrategien zu sehr komplexen Handelsstrategien kombinieren und konfigurieren und so komplexe Funktionalitäten ermöglichen. Zu diesen beiden Tools gehören:

  • Strategiegruppe: Traders können mehrere Strategien in Gruppen ausführen. Jede Gruppe von Handelsstrategien hat die gleiche Ausführungshäufigkeit (z. B. täglich, stündlich oder jede Minute) und den gleichen Ausführungszeitpunkt (z. B. am Tagesschluss oder jeden Tag um 10:30 Uhr), was eine flexible Kontrolle darüber ermöglicht, wann die Strategien ausgeführt werden.

  • Blender Strategy Mixer: Handelsstrategien, die innerhalb derselben Gruppe gleichzeitig ausgeführt werden, werden zwangsläufig auch zur gleichen Zeit ausgeführt. Jede Strategie generiert eine Reihe von Handelssignalen gemäß ihrer eigenen Logik, diese Reihe von Signalen muss jedoch auf irgendeine Weise zu einer einzigen Reihe „zusammengeführt“ werden. Diese Zusammenführung erfolgt durch den Mixer „Blender“, der speziell dafür verantwortlich ist, die von mehreren Strategien erzeugten Handelssignale zu einem Satz zusammenzufassen. Die Zusammenführungslogik wird vollständig durch die benutzerdefinierte Kompositionszeichenfolge „Blender-String“ bestimmt, sodass der Benutzer die volle Kontrolle hat.

In diesem Abschnitt erfahren Sie, wie Sie es Händlern ermöglichen, mehrere Handelsstrategien gleichzeitig auszuführen, wenn sie mehrere der in qteasy eingebauten Strategien verwenden, und wie Sie den Strategieblender blender verwenden, um verschiedene Kombinationen von Strategien mit Hilfe von Handelsstrategien zu erzeugen.

Derzeit unterstützt qteasy mehr als 70 integrierte Handelsstrategien, die alle sofort verfügbar sind. Eine vollständige Liste der integrierten Handelsstrategien finden Sie in der [Dokumentation] (… /references/4-build-in-strategy-blender.md):

Sie können die folgende API verwenden, um eine Liste aller integrierten Handelsstrategien zu erhalten, die in qteasy bereitgestellt werden:

import qteasy as qt
qt.built_ins()

Die obige API gibt alle integrierten Handelsstrategien in qteasy zurück:

{'crossline': qteasy.built_in.CROSSLINE,
 'macd': qteasy.built_in.MACD,
 'dma': qteasy.built_in.DMA,
 'trix': qteasy.built_in.TRIX,
 'cdl': qteasy.built_in.CDL,
 'bband': qteasy.built_in.BBand,
 's-bband': qteasy.built_in.SoftBBand,
 'sarext': qteasy.built_in.SAREXT,
 'ssma': qteasy.built_in.SCRSSMA,
 'sdema': qteasy.built_in.SCRSDEMA,
 'sema': qteasy.built_in.SCRSEMA,
 'sht': qteasy.built_in.SCRSHT,
 'skama': qteasy.built_in.SCRSKAMA,
 'smama': qteasy.built_in.SCRSMAMA,
 ...}

Im Folgenden finden Sie eine Liste einiger der in qteasy eingebauten, sofort einsatzbereiten Handelsstrategien. Eine vollständige Liste finden Sie unter [references] (… /references/4-build-in-strategy-blender.md)

ID

Strategiename

Anweisungen

Querverbindung

Zeitlicher Querstrich

Crossline-Timing-Strategieklasse, die den Schnittpunkt der langen und kurzen Durchschnitte zur Bestimmung des Long- und Short-Status verwendet
1, wenn die kurzen Durchschnitte über den langen Durchschnitten liegen und der Abstand größer als l*m% ist, setzen Sie das Positionsziel auf 1
2, wenn die kurzen Durchschnitte unter den langen Durchschnitten liegen und der Abstand größer als l*m% ist, setzen Sie das Positionsziel auf -1
3, wenn der Abstand zwischen den langen und kurzen Durchschnitten nicht größer als l*m% ist, setzen Sie das Positionsziel auf 0

macd

TimingMACD

MACD-Timing-Strategieklasse, die die MACD-Durchschnittsstrategie verwendet, erzeugt einen Zielpositionsprozentsatz:
1, wenn der MACD-Wert größer als 0 ist, wird das Positionsziel auf 1 gesetzt
2, wenn der MACD-Wert kleiner als 0 ist, wird das Positionsziel auf 0 gesetzt

`dma‘

TimingDMA

DMA-Timing-Strategie
1, DMA oberhalb AMA, langer Bereich, d.h. nachdem die DMA-Linie die AMA-Linie von unten nach oben kreuzt, ist der Ausgang 1
2, DMA unterhalb AMA, kurzer Bereich, d.h. nachdem die DMA-Linie die AMA-Linie von oben nach unten kreuzt, ist der Ausgang 0

trix

TimingTRIX‘

TRIX-Timing-Strategie, die den dreifach geglätteten exponentiellen gleitenden Durchschnitt der Aktienkurse verwendet, um Long/Short-Entscheidungen zu treffen:
Berechnen Sie den dreifach geglätteten exponentiellen gleitenden Durchschnitt der Kurse TRIX, und berechnen Sie dann einen gleitenden Durchschnitt des M-Tages TRIX:
1, Setzen Sie das Positionsziel auf 1, wenn TRIX über MATRIX liegt
2, Setzen Sie das Positionsziel auf -1, wenn TRIX unter MATRIX liegt

`cdl‘

`TimingCDL‘

CDL Timing-Strategie, um übereinstimmende cdldoji-Muster im K-Chart zu finden
Suchen Sie nach cdldoji-Mustern (zwischen 0 und 100 Übereinstimmungen), die im historischen Datenfenster erscheinen, addieren Sie sie / 100, berechnen Sie die Anzahl der äquivalenten cdldoji-Übereinstimmungen und verwenden Sie die Anzahl der Übereinstimmungen als Handelssignal.

`Band‘

`TimingBand‘

Bollinger Bands Linien-Handelsstrategie, die Long- und Short-Positionen auf der Grundlage des Verhältnisses zwischen dem Kurs einer Aktie und der oberen und unteren Bollinger Bands-Linie identifiziert und Handelssignale erzeugt, wenn der Kurs die obere und untere Bollinger Bands-Linie über- oder unterschreitet. Die Art des SMA für die Bollinger Bands-Linie ist nicht optional
1, wenn der Kurs durch die obere Schiene steigt, wird ein vollständiges Kaufsignal erzeugt
2, wenn der Kurs durch die untere Schiene fällt, wird ein vollständiges Verkaufssignal erzeugt

`s-bband‘

`SoftBBand‘

Bollinger Bands Line Progressive Trading Strategy, bestimmt Long und Short auf der Grundlage des Verhältnisses zwischen dem Aktienkurs und den oberen und unteren Bollinger Bands, Handelssignale werden nicht auf einmal generiert, sondern schrittweise und progressiv kaufen und verkaufen. Berechnen Sie das BBAND und prüfen Sie, ob der Kurs die obere oder untere Schiene des BBAND überschreitet:
1, wenn der Kurs über der oberen Schiene liegt, wird jeden Tag ein prozentuales Kaufsignal von 10% generiert
2, wenn der Kurs unter der unteren Schiene liegt, wird jeden Tag ein prozentuales Verkaufssignal von 33% generiert

`sarext‘

`TimingSAREXT‘

Erweiterte parabolische SAR-Strategie mit Kaufsignalen, wenn der Indikator größer als 0 ist, und Verkaufssignalen, wenn der Indikator kleiner als 0 ist

ssma

SCRSSMA

Single-SMA-Crossover-Strategie - SMA (Simple Moving Average): Festlegung eines Positionsverhältnisses auf der Grundlage der relativen Position des Aktienkurses zum SMA

`Dema‘

SCRSDEMA

Single SMA Crossover Strategy - DEMA SMA (Double Exponential Smoothing Moving Average): Die Positionen werden entsprechend der relativen Position des Aktienkurses zum DEMA SMA gesetzt

sema

SCRSEMA

Single SMA Crossover Strategy - EMA SMA (Exponential Smoothed Moving Average): Die Positionierung basiert auf der relativen Position des Aktienkurses zum EMA SMA.

Eine vollständige Liste der integrierten Strategien finden Sie in [references] (… /references/4-build-in-strategy-blender.md)

Jede integrierte Handelsstrategie hat ihre eigene ID (z. B. „crossline“, „macd“, „dma“ usw. in der Tabelle oben). Benutzer können diese ID verwenden, um eine Instanz einer integrierten Handelsstrategie abzurufen und sie zur Verwendung einem Händlerobjekt hinzuzufügen. Zum Beispiel:

stg = qt.get_built_in_strategy('dma')
stg.info()

Erhaltene Ausgabe:

================================ Strategy: DMA =================================
Strategy RULE-ITER(DMA)
Parameters: ['slow', 'long', 'diff'] = (12, 26, 9)                  
Date Types: close_ANY_d x 270                                       
----------------------------- Iteration Properties -----------------------------
Allow multi pars        True
Multi-parameter not set                      

Wenn Sie eine ausführliche Erläuterung zu jeder integrierten Handelsstrategie benötigen, z.B. die Bedeutung der Strategieparameter oder die Regeln für die Signalerzeugung, können Sie den doc-string für jede Handelsstrategie einsehen:

Beispiel:

qt.built_in_doc('Crossline', print_out=True)

kann gesehen werden

Init signature: qt.built_in.TimingCrossline(pars:tuple=(35, 120, 0.02))
Docstring:     
crossline择时策略类,利用长短均线的交叉确定多空状态

策略参数:
    s: int, 短均线计算日期;
    l: int, 长均线计算日期;
    m: float, 均线边界宽度(百分比);
信号类型:
    PT型:目标仓位百分比
信号规则:
    1,当短均线位于长均线上方,且距离大于l*m%时,设置仓位目标为1
    2,当短均线位于长均线下方,且距离大于l*mM时,设置仓位目标为-1
    3,当长短均线之间的距离不大于l*m%时,设置仓位目标为0

策略属性缺省值:
默认参数:(35, 120, 0.02)
数据类型:close 收盘价,单数据输入
采样频率:天
窗口长度:270
参数范围:[(10, 250), (10, 250), (0, 1)]
策略不支持参考数据,不支持交易数据
File:           ~/Library/CloudStorage/OneDrive-Personal/Projects/PycharmProjects/qteasy/qteasy/built_in.py
Type:           type
Subclasses:     

In interaktiven python-Umgebungen wie ipython können Sie auch ? verwenden, um z.B. Details zu integrierten Handelsstrategien anzuzeigen:

>>> qt.built_in.SelectingNDayRateChange?

Man kann es sehen:

Init signature: qt.built_in.SelectingNDayRateChange(pars=(14,))
Docstring:     
基础选股策略:根据股票以前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)]
策略不支持参考数据,不支持交易数据
File:           ~/Library/CloudStorage/OneDrive-Personal/Projects/PycharmProjects/qteasy/qteasy/built_in.py
Type:           type
Subclasses:    

8.3. Mehrere Strategien und Kombinationen von Strategien

In qteasy kann ein Trader-Objekt Operator mehrere Handelsstrategien gleichzeitig ausführen. Jede dieser Handelsstrategien, wenn sie ausgeführt wird, extrahiert die erforderlichen historischen Daten für jede von ihnen und erzeugt unabhängig voneinander verschiedene Handelssignale, die zu einer Reihe von Handelssignalen kombiniert werden, die gemeinsam ausgeführt werden.

Mit dieser Funktion kann der Benutzer mehrere Handelsstrategien mit unterschiedlichen Schwerpunkten gleichzeitig in einem Trader-Objekt ausführen. Eine Handelsstrategie überwacht beispielsweise den Aktienkurs einer einzelnen Aktie und erzeugt auf der Grundlage des Aktienkurses Auswahlsignale, während eine zweite Handelsstrategie der Überwachung des allgemeinen Markttrends gewidmet ist und die Gesamtposition durch den allgemeinen Markttrend bestimmt. Die dritte Handelsstrategie widmet sich dem Stop Loss und Take Profit, dem Stop Loss zu einem bestimmten Zeitpunkt. Die endgültigen Handelssignale werden von der ersten Handelsstrategie dominiert, aber von der zweiten Strategie abgemildert und, falls erforderlich, von der dritten Strategie vollständig kontrolliert.

Alternativ kann der Benutzer auch einfach eine „Komitee“-Strategie formulieren, bei der mehrere Strategien unabhängig voneinander Handelsentscheidungen in einer umfassenden Strategie treffen und über die endgültigen Handelssignale von einem „Komitee“ aller Teilstrategien abgestimmt wird. Über das endgültige Handelssignal wird von einem „Komitee“ aller Teilstrategien abgestimmt, mit einfacher Mehrheit, mit absoluter Mehrheit, mit gewichteten Abstimmungsergebnissen, usw.

Jede einzelne Handelsstrategie im obigen Portfolio von Handelsstrategien ist einfach und leicht zu definieren, während ihre Kombination sie noch effektiver macht. Gleichzeitig ist jede Teilstrategie unabhängig und kann frei kombiniert werden, um komplexe und umfassende Handelsstrategien zu erstellen. Dadurch wird vermieden, dass Strategien immer wieder neu entwickelt werden müssen. Indem Sie die Teilstrategien neu anordnen und neu definieren, wie sie kombiniert werden, ist es möglich, schnell eine Reihe komplexer und umfassender Handelsstrategien zu erstellen. Man geht davon aus, dass dies die Effizienz der Konstruktion von Handelsstrategien erheblich verbessern und den Zyklus verkürzen kann. Zeit ist Geld.

Das Mischen von Handelssignalen, d.h. die verschiedenen Operationen oder Funktionen von Handelssignalen, die von einfachen logischen Operationen, Additions- und Subtraktionsoperationen bis hin zu komplexen benutzerdefinierten Funktionen reichen, können theoretisch zum Mischen von Handelssignalen verwendet werden, solange sie auf ein ndarray angewendet werden können und die endgültige Ausgabe der Handelssignale sinnvoll ist.

Definieren Sie die Strategie-Kombinationsmethode blender.

Kombinationsstrategien in qteasy werden durch blender implementiert. In einem Operator muss ein blender definiert werden, wenn die Anzahl der Strategien mehr als 1 beträgt. Wenn kein blender explizit definiert ist und die Anzahl der Strategien mehr als 1 beträgt, erzeugt qteasy beim Ausführen von Operator einen Standard blender. Damit die mehreren Strategien jedoch korrekt funktionieren, muss der Benutzer den blender selbst definieren.

Ein „Blender-Ausdruck“ ist ein benutzerdefinierter Kombinationsausdruck, der bestimmt, wie verschiedene Handelsstrategien kombiniert werden. Der Blender-Ausdruck gibt an, wie die Strategiesignale unter Verwendung von Symbolen wie quadratischen Operatoren, logischen Operatoren, Funktionen usw. kombiniert werden. Der „Blender“-Ausdruck kann die folgenden Elemente enthalten:

Die Funktionen, die im Ausdruck blender unterstützt werden, sind folgende:

Element

typisches Beispiel

Anweisungen

Strategie Nummer

s0, s1 ...

Zeichenkette, die mit s beginnt und mit einer Zahl endet. Die Zahl ist die Seriennummer der Strategie in Operator und steht für die von dieser Strategie erzeugten Handelssignale.

Numerisch

-1.35

Jede gesetzliche Zahl, die an der Operation des Ausdrucks beteiligt ist

Operator (Rechnen)

+

Enthält mathematische Operatoren wie z.B. + - * / ^.

logischer Operator

und

Unterstützung für die logischen Operatoren &/~ und und/or/not

Verwenden Sie die Funktion qt.built_ins(), um eine detaillierte Beschreibung der eingebauten Richtlinien zu erhalten:

Summe()

Ausdrücke unterstützen eine Vielzahl von Funktionen. In der folgenden Tabelle finden Sie die unterstützten Funktionen.

Klammern

()

kombinatorische Operation

Beispiel für blender

Wenn in einem Operator-Objekt drei Handelsstrategien vorhanden sind (deren Seriennummern s0/s1/s2 sind), sind die auf folgende Weise definierten Blender alle legal verfügbar, während Sie Operator.set_blender() verwenden, um den Blender zu setzen:

Definieren eines Blender-Ausdrucks mit dem regulären Operator

's0 + s1 + s2'

An diesem Punkt werden die von den drei Handelsstrategien generierten Handelssignale addiert, um das endgültige Handelssignal zu erhalten. Wenn Strategie 0 zu einem Kauf von 10 % führt, Strategie 1 zu einem Kauf von 10 % und Strategie 2 zu einem Kauf von 30 %, dann ist das Endergebnis ein Kauf von 50 %.

Verwenden Sie logische Operatoren, um Blender-Ausdrücke zu definieren:

's0 und s1 und s2'

Zeigt an, dass ein Handelssignal nur dann abgeschlossen wird, wenn für die Handelsstrategien 1, 2 und 3 Handelssignale vorhanden sind. Wenn Strategie 1 zu einem Kauf führt, Strategie 2 zu einem Kauf und Strategie 3 keine Handelssignale aufweist, wird das Endergebnis keine Handelssignale sein.

Blender-Ausdrücke können auch Klammern und einige Funktionen enthalten:

maximal(s0, s1) + s2‘‘

Gibt an, dass das Maximum der Ergebnisse von Strategie 1 und 2 zum Ergebnis von Strategie 3 addiert wird, um das endgültige Handelssignal zu erhalten. Wenn das Ergebnis von Strategie 1 10 % kaufen, das Ergebnis von Strategie 2 20 % kaufen und das Ergebnis von Strategie 3 30 % kaufen ist, lautet das Endergebnis 50 % kaufen.

Jede Strategie in einem Mixer-Ausdruck kann mehr als einmal vorkommen und kann auch als reine Zahl erscheinen:

'(0,5 * s0 + 1,0 * s1 + 1,5 * s2) / 3 * min(s0, s1, s2)'

Der obige „Blender“-Ausdruck bedeutet, dass zunächst der gewichtete Durchschnitt der drei Strategiesignale berechnet wird (mit einer Gewichtung von 0,5, 1,0 bzw. 1,5) und dann mit dem Mindestwert der drei Signale multipliziert wird

Die Betriebsparameter einer Funktion in einem Blender-Ausdruck sind im Funktionsnamen definiert:

‚clip_-0.5_0.5(s0 + s1 + s2) + pos_2_0.2(s0, s1, s2)‘‘

Der obige Ausdruck blender definiert zwei verschiedene Funktionsoperationen, um die Ergebnisse zu erhalten und sie zu addieren, um das Endergebnis zu erhalten. Die erste Funktion ist ein Bereichsschnitt, der die Signale der drei Strategien aufsummiert, die Signalwerte unter -0,5 und über 0,5 herausschneidet, um das Ergebnis zu erhalten. Die zweite Funktion ist eine Positionsbeurteilungsfunktion, die die Anzahl der Zeiträume zählt, in denen die drei Signale eine Position über 0,2 haben, und diese als „lang“ definiert, dann die Anzahl der langen Empfehlungen in den drei Strategien in jedem Zeitraum zählt und, wenn mehr als zwei Strategien lange Empfehlungen haben, das Endergebnis ausgibt. Zeitperiode in den drei Strategien die Anzahl der Long-Empfehlungen zu halten, wenn mehr als zwei Strategien die Long-Empfehlungen halten, dann die Ausgabe der vollen Position Long, ansonsten die Ausgabe der Short-Position.

Die Funktionen, die im Ausdruck blender unterstützt werden, sind folgende:

Verwenden Sie die Funktion qt.built_ins(), um eine detaillierte Beschreibung der eingebauten Richtlinien zu erhalten:

Beispiel für einen Ausdruck

Anweisungen

`abs‘

sqrt(s0)

Absolutwertfunktion
Berechnet den absoluten Wert aller Handelssignale
Unbegrenzte Anzahl von Eingangssignalen

avg‘

avg(s0, s1, s2)

Durchschnittsfunktion
Berechnet den Durchschnitt aller Handelssignale
Unbegrenzte Anzahl von Eingangssignalen

avgpos

avgpos_N_T(s0, s1, s2)

Durchschnittliche Akkumulationsfunktion
Wenn das Handelssignal ein Positionszielsignal ist, zählen Sie die Anzahl der gleichzeitig erzeugten nicht kurzen Signale (absoluter Wert des Ausgangssignals > T), wenn die Anzahl der kurzen/langen Signale größer als N ist, ist die Ausgabe des Durchschnitts aller kurzen/langen Signale, andernfalls ist die Ausgabe 0.
Unbegrenzte Anzahl von Eingangssignalen

Decke‘

Schwelle(s0)

Aufrundungsfunktion
Handelssignale werden aufgerundet
Es kann nur ein Handelssignal eingegeben werden

`Clip‘

Clip_U_L(s0)

Die Funktion Range Clipping
clippt den Signalwert, der den Bereich überschreitet. Der obere und untere Clipping-Bereich ist im Funktionsnamen
definiert. Es kann nur ein Handelssignal eingegeben werden.

`combo‘

Kombo(s0, s1, s2)

Kombinierte Wertfunktion
Gibt den Wert der Summe aller Handelssignale aus
Unbegrenzte Anzahl von Eingangssignalen

`Ausschuss‘

cmt_N_T(s0, s1, s2)

Ausschussfunktion (entspricht der kumulativen Positionsfunktion))
Wenn das Handelssignal ein Positionszielsignal ist, zählen Sie die Anzahl der gleichzeitig erzeugten Nicht-Kurzschluss-Signale (der absolute Wert des Ausgangssignals > T), wenn die Anzahl der Lang-/Kurzschluss-Signale größer als N ist, ist der Ausgang -1/1, andernfalls ist der Ausgang 0.
Unbegrenzte Anzahl von Eingangssignalen

exp

exp(s0)

exp Funktion
Berechnet die Potenz des Signals von e
Es kann nur ein Handelssignal eingegeben werden

Boden‘

Boden(s0)

Downward Rounding Funktion
Handelssignale Downward Rounding
Es kann nur ein Handelssignal eingegeben werden.

log‘

log(s0)

Logarithmische Funktion
Berechnet einen logarithmischen Wert mit e als Basis
Es kann nur ein Handelssignal eingegeben werden

`log10‘

log10(s0)

Logarithmische Funktion zur Basis 10
Berechnet einen logarithmischen Wert zur Basis 10
Es kann nur ein Handelssignal eingegeben werden

`max‘

max(s0, s1, s2)

Maximum-Funktion
Berechnet den maximalen Wert aller Handelssignale
Unbegrenzte Anzahl von Eingangssignalen

`min‘

min(s0, s1, s2)

Minimum-Funktion
Berechnet den Mindestwert aller Handelssignale
Unbegrenzte Anzahl von Eingangssignalen

Pos‘

pos_N_T(s0, s1, s2)

Kumulative Positionsfunktion
Wenn das Handelssignal ein Positionszielsignal ist, generiert die Statistik gleichzeitig die Anzahl der Nicht-Kurzschluss-Signale (absoluter Wert des Ausgangssignals > T), wenn die Anzahl der Lang-/Kurzschluss-Signale größer als N ist, die Ausgabe -1/1, andernfalls ist die Ausgabe 0.
Unbegrenzte Anzahl von Eingangssignalen

Position‘

Position_N_T(s0, s1, s2)

Kumulative Positionsfunktion
Wenn das Handelssignal ein Positionszielsignal ist, generiert die Statistik gleichzeitig die Anzahl der Nicht-Kurzschluss-Signale (absoluter Wert des Ausgangssignals > T), wenn die Anzahl der Lang-/Kurzschluss-Signale größer als N ist, die Ausgabe -1/1, andernfalls ist die Ausgabe 0.
Unbegrenzte Anzahl von Eingangssignalen

Peng

Pow(s0, s1, s2)

Power-Funktion
Berechnet die zweite Signalleistung des ersten gehandelten Signals, d.h. sig0^sig1
Die Anzahl der Eingangssignale kann nur zwei betragen

‚Macht‘

Macht(s0, s1, s2)

Power-Funktion
Berechnet die zweite Signalleistung des ersten gehandelten Signals, d.h. sig0^sig1
Die Anzahl der Eingangssignale kann nur zwei betragen

sqrt

sqrt(s0)

Quadratwurzelfunktion
Quadratwurzel eines Handelssignals
Es kann nur ein Handelssignal eingegeben werden

str

str_T(s0, s1, s2)

Stärkeakkumulationsfunktion
summiert alle Handelssignale und gibt 1 aus, wenn die Signalstärke T überschreitet, andernfalls gibt sie 0 aus
Unbegrenzte Anzahl von Eingangssignalen

‚Stärke‘

Stärke_T(s0, s1, s2)

Stärkeakkumulationsfunktion
summiert alle Handelssignale und gibt 1 aus, wenn die Signalstärke T überschreitet, andernfalls gibt sie 0 aus
Unbegrenzte Anzahl von Eingangssignalen

`sum‘

Summe(s0, s1, s2)

Kombinierte Wertfunktion
Gibt den Wert der Summe aller Handelssignale aus
Unbegrenzte Anzahl von Eingangssignalen

Vereinigen‘

unify(s0)

Uniformitätsfunktion
Uniformiert die Handelssignale, skaliert die Handelssignale der gleichen Zeile gleich, so dass die Summe jeder Zeile 1 ist
Es kann nur ein Handelssignal eingegeben werden

Abstimmen

Abstimmung_N_T(s0, s1, s2)

Ausschuss-Abstimmungsfunktion (entspricht der kumulativen Positionsfunktion)
Wenn das Handelssignal ein Positionszielsignal ist, zählen Sie die Anzahl der gleichzeitig erzeugten Nicht-Short-Signale (der absolute Wert des Ausgangssignals > T), wenn die Anzahl der Long/Short-Signale größer als N ist, ist der Ausgang -1/1, andernfalls ist der Ausgang 0.
Unbegrenzte Anzahl von Eingangssignalen

Die folgenden Methoden können verwendet werden, um den „Blender“ einer Richtlinie zu setzen oder zu erhalten

operator.set_blender(blender=None, price_type=None)

Um den „Blender“ festzulegen, übergeben Sie direkt einen Ausdruck „blender_str“. Dieser Ausdruck wird automatisch analysiert und zum Kombinieren von Handelsstrategien verwendet. Wenn Sie „set_blender()“ verwenden, können Sie den Parameter „group_id“ verwenden, um anzugeben, für welche Strategiegruppe dieser „Blender“ gedacht ist. Wenn „group_id“ nicht angegeben ist, wird dieser „Blender“ standardmäßig für alle Strategiegruppen verwendet.

operator.view_blender()

Schauen Sie sich blender an und beachten Sie, dass an dieser Stelle die Richtliniencodes s0,s1,s2 im blender-Ausdruck automatisch durch die spezifischen Richtlinien-IDs ersetzt werden, damit sie von Menschen erkannt werden können, wie im Beispiel unten gezeigt:

>>> op = qt.Operator('dma, macd, trix')
>>> op.set_blender('(0.5 * s0 + 1.0 * s1 + 1.5 * s2) / 3 * min(s0, s1, s2)', group_id='Group_1')
>>> op.view_blender()

„operator.view_blender()“ gibt ein Wörterbuch aus, in dem die Schlüssel Strategiegruppen-IDs und die Werte Blender-Ausdrücke sind. Im Blender-Ausdruck wurden „s0“, „s1“ und „s2“ bereits durch die spezifischen Strategie-IDs ersetzt:

Die Ausgabe ist wie folgt:

{'Group_1': '(0.5 * dma + 1.0 * macd + 1.5 * trix) / 3 * min(dma, macd, trix)'}

Wenn Sie beim Aufruf von „view_blender()“ den Parameter „group_id“ angeben, wird nur der Blender-Ausdruck für diese Strategiegruppe ausgegeben:

>>> op.view_blender(group_id='Group_1')

Die Ausgabe ist wie folgt:

'(0.5 * dma + 1.0 * macd+ 1.5 * trix) / 3 * min(dma, macd, trix)'

Die Werte s0, s1 und s2 im obigen Beispiel werden durch dma, macd bzw. trix ersetzt. Wenn der Operator jedoch mehr als eine Richtlinie enthält, werden ihnen automatisch unterschiedliche Richtlinien-IDs zugewiesen, um sie zu unterscheiden:

>>> op = qt.Operator('dma, dma, dma')
>>> op.set_blender('(0.5 * s0 + 1.0 * s1 + 1.5 * s2) / 3 * min(s0, s1, s2)')
>>> op.view_blender('Group_1')

Die Ausgabe ist wie folgt:

'(0.5 * dma_0 + 1.0 * dma_1 + 1.5 * dma_2) / 3 * min(dma_0, dma_1, dma_2)'

Beispiel für die Verwendung von blender

Im Folgenden wird anhand eines Beispiels gezeigt, wie blender funktioniert:

Wir erzeugen ein Trader-Objekt, das fünf „DMA“-Handelsstrategien gleichzeitig ausführt, aber jede der fünf Handelsstrategien hat unterschiedliche einstellbare Parameter. An dieser Stelle können wir verstehen, dass dieser Trader fünf der gleichen Handelslogiken gleichzeitig ausführt, aber diese fünf Handelslogiken sind mit unterschiedlichen Parametern konfiguriert und erzeugen daher unter den gleichen Eingabebedingungen unterschiedliche Handelssignale, was bedeutet, dass jede der fünf Handelsstrategien ihren eigenen Schwerpunkt hat, wobei einige Einige sind gut bei der Erfassung langfristiger Variablen und andere sind gut bei der Verfolgung kurzfristiger Trends.

Im Folgenden werden dieselben fünf Handelsstrategien gezeigt, aber wir werden drei verschiedene Beispiele für drei verschiedene Mischungen verwenden, um Ihnen zu zeigen, dass selbst bei exakt denselben Handelsstrategien und Handelsparametern unterschiedliche Mischungen die endgültigen Handelsergebnisse im selben historischen Intervall beeinflussen können.

Erste Mischung: gewichtete Durchschnittsmischung

Der erste Blend bildet den gewichteten Durchschnitt der Ergebnisse der fünf Handelsstrategien mit dem folgenden Blend-Ausdruck, wobei die Gewichte nach Ihrem Ermessen angepasst werden können:

  • s0: Gewicht 0,8

  • s1: Gewicht 1,2

  • s2: Gewicht 2,0

  • s3: Gewicht 0,5

  • s4: Gewicht 1,5

Um die obige gewichtete durchschnittliche Mischung zu erreichen, können wir den folgenden „Blender“-Ausdruck definieren. Das bedeutet: Zuerst die Ergebnisse der fünf Handelsstrategien mit ihren jeweiligen Gewichtungen multiplizieren und dann durch die Summe der Gewichte (d. h. 5) dividieren, um das gewichtete Durchschnittsergebnis zu erhalten:

(0.8*s0+1.2*s1+2*s2+0.5*s3+1.5*s4)/5

Als nächstes setzen wir diesen „Blender“-Ausdruck auf das Händlerobjekt, führen die Strategien aus und erhalten die Backtest-Ergebnisse:

# 创建一个交易员对象,同时运行五个相同的dma交易策略,这些交易策略运行方式相同,但是设置不同的参数后,会产生不同的交易信号。我们通过不同的策略组合方式,得到不同的回测结果
op = qt.Operator('dma, dma, dma, dma, dma')
# 分别给五个不同的交易策略设置不同的策略参数,使他们产生不同的交易信号
op.set_parameter(stg_id=0, par_values=(132, 200, 24))
op.set_parameter(stg_id=1, par_values=(124, 187, 51))
op.set_parameter(stg_id=2, par_values=(103, 81, 16))
op.set_parameter(stg_id=3, par_values=(48, 111, 148))
op.set_parameter(stg_id=4, par_values=(104, 127, 58))

op.set_blender('(0.8*s0+1.2*s1+2*s2+0.5*s3+1.5*s4)/5')

# 运行策略
res = qt.run(op, mode=1, invest_start='20160405', invest_end='20210201')

Der resultierende Backtest-Bericht lautet wie folgt: annualisierte Rendite 5,51 %, Sharpe Ratio 0,44. Informationen zur Interpretation des Backtest-Berichts finden Sie im entsprechenden Inhalt in Tutorial Abschnitt 3.

Hier konzentrieren wir uns nicht darauf, wie die Leistung der Handelsstrategien verbessert werden kann. Stattdessen konzentrieren wir uns darauf, wie dieselben Handelsstrategien bei unterschiedlichen Mischmethoden zu unterschiedlichen Backtest-Ergebnissen führen, und diese Unterschiede in den Backtest-Ergebnissen sind vollständig auf die unterschiedlichen Mischmethoden zurückzuführen.

====================================
|                                  |
|         BACKTEST REPORT          |
|                                  |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 171.1 ms
time consumption for operation back testing:  3.2 ms
investment starts on      2016-04-05 15:00:00
ends on                   2021-01-29 15:00:00
Total looped periods:     4.8 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   370      354    724   88.1%     -0.0%     11.9%  

Total operation fee:     ¥    3,847.81
total investment amount: ¥  100,000.00
final value:              ¥  129,535.45
Total return:                    29.54% 
Avg Yearly return:                5.51%
Skewness:                         -0.90
Kurtosis:                         12.22
Benchmark return:                63.94% 
Benchmark Yearly return:         10.80%

------strategy loop_results indicators------ 
alpha:                           -0.060
Beta:                             1.311
Sharp ratio:                      0.440
Info ratio:                      -0.041
250 day volatility:               0.125
Max drawdown:                    18.49% 
    peak / valley:        2018-01-26 / 2019-01-03
    recovered on:         2019-03-05


==================END OF REPORT===================

! [png](… /references/img/output_11_1.png)

Wenn Sie sich das oben erstellte Renditediagramm genau ansehen, werden Sie feststellen, dass auf dem Hintergrund des Diagramms verschiedene Grüntöne eingezeichnet sind. Diese Streifen stehen für den prozentualen Anteil der Position in diesem Zeitraum, wobei das Weiß für eine Short-Position steht, d.h. für eine Position, die überhaupt nicht gehalten wird, und das dunkelste Grün für eine Position, die zu 100 % gehalten wird, und das Grün in der Mitte für den prozentualen Anteil der Position zwischen 0 und 100 %, wobei die Streifen umso dunkler sind, je höher der prozentuale Anteil der Position ist Je höher der Prozentsatz der gehaltenen Aktien, desto dunkler ist die Farbe der Streifen.

Da die Ergebnisse der fünf Handelsstrategien als gewichteter Durchschnitt kombiniert werden, führt jede Änderung des Ergebnisses einer Strategie zu einer Änderung des endgültigen Handelssignals. Dadurch ist auch die Anzahl der Trades über den gesamten Backtestzeitraum sehr häufig (insgesamt 370 Verkaufs- und 354 Kaufoperationen) und auch die Positionsquote schwankt häufig zwischen 0 % und 100 %.

Wie Sie aus dem Diagramm ersehen können, gibt es im gesamten Handelsverlauf verschiedene Grüntöne, und wenn Sie jedes der Halteintervalle sehr genau untersuchen, werden Sie feststellen, dass der Prozentsatz der in diesen Intervallen gehaltenen Aktien dem Mix der fünf Handelsstrategien zu diesem Zeitpunkt entspricht: Wenn alle Handelsstrategien „einstimmig“ beschlossen haben, alle Aktien zu kaufen, wäre der gewichtete Durchschnitt ihrer Ergebnisse ein 100%iger Kauf, aber solange eine oder mehrere der Strategien beschlossen haben, eine Wenn eine oder mehrere Strategien beschließen, eine Short-Position zu halten, besteht das gewichtete durchschnittliche Endergebnis darin, einen bestimmten Prozentsatz der Aktie zu halten, der dem gewichteten Durchschnitt der Signale der fünf Strategien entspricht. Das Endergebnis ist eine Position, die zwischen 0% und 100% schwankt, wobei weder eine komplett leere noch eine komplett volle Position für sehr lange Zeit gehalten wird.

Das bedeutet auch, dass wir einen einseitigen Abwärtstrend nicht vollständig vermeiden können, indem wir eine Short-Position eingehen, aber eine Position zu jeder Zeit zu halten, ist ein besserer Weg, den Aufwärtstrend zu erfassen.

Sie sollten auch feststellen können, dass die Positionen (die Palette der Grüntöne) bei einem einseitigen Abwärtsmarkt deutlich niedriger und bei einem Aufwärtsmarkt höher sind, was genau das ist, was wir erwarten würden.

Lassen Sie uns als nächstes eine ganz andere Mischung betrachten:

Zweiter Hybrid: Abstimmung im Ausschuss

Bei diesem Ansatz können dieselben fünf Handelsstrategien ein „Komitee“ bilden, das mit gleicher Stimmenzahl über die Positionen entscheidet, wobei die Positionen eines von zwei „schwarzen oder weißen“ Ergebnissen sein müssen: entweder voll oder leer. Der Ausdruck lautet wie folgt:

An dieser Stelle müssen wir die von blender_str unterstützte Sonderfunktion verwenden, die „Komiteefunktion“, „cmt_N_T(s0, s1, …)“. Diese Funktion bedeutet: Wenn die Anzahl der Strategien, die gleichzeitig ein nicht flaches Signal (mit absolutem Signalwert > T) erzeugen, größer als N ist, wird ein vollständig investierter Long-Wert (1) oder ein vollständig investierter Short-Wert (-1) ausgegeben. andernfalls wird flach (0) ausgegeben. Wenn N=3 und T=0, lautet der Ausdruck daher wie folgt:

Pos_3_0(s0, s1, s2, s3, s4)

Dies entspricht der Bildung eines Komitees bestehend aus fünf Handelsstrategien: Nur wenn mindestens drei Strategien gleichzeitig eine vollständig investierte Long-Position empfehlen, gibt das Komitee eine vollständig investierte Long-Empfehlung ab; andernfalls wird eine flache Empfehlung (keine Position) ausgegeben.

Das Endergebnis ist also, dass das Positionsverhältnis entweder 100 % (wenn drei oder mehr Strategien eine vollständig investierte Empfehlung ausgeben) oder 0 % (wenn weniger als drei Strategien eine vollständig investierte Empfehlung ausgeben) beträgt. In einem Einweg-Abwärtsmarkt beträgt das Positionsverhältnis entweder 100 % oder 0 %, ohne Zwischenzustand. Der Händler Operator führt im Wesentlichen eine Handelsstrategie aus, die die Position auf der Grundlage der Abstimmung eines fünfköpfigen Anlageausschusses bestimmt. Jedes Ausschussmitglied hat seine eigene Meinung (weil seine Parameter unterschiedlich sind), aber die endgültige Entscheidung wird von der Mehrheit getroffen.

op.set_blender('cmt_3_0(s0, s1, s2, s3, s4)')  # 将委员会混合函数设置为blender表达式
# 运行策略
res = qt.run(op, mode=1)

Die Ergebnisse lauten wie folgt: annualisierte Rendite 6,43, Sharpe Ratio 0,487

====================================
|                                  |
|         BACKTEST REPORT          |
|                                  |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 179.3 ms
time consumption for operation back testing:  3.2 ms
investment starts on      2016-04-05 15:00:00
ends on                   2021-01-29 15:00:00
Total looped periods:     4.8 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    10       9      19   57.2%     -0.0%     42.8%  

Total operation fee:     ¥      452.82
total investment amount: ¥  100,000.00
final value:              ¥  135,022.14
Total return:                    35.02% 
Avg Yearly return:                6.43%
Skewness:                         -0.74
Kurtosis:                         11.60
Benchmark return:                63.94% 
Benchmark Yearly return:         10.80%

------strategy loop_results indicators------ 
alpha:                           -0.034
Beta:                             1.001
Sharp ratio:                      0.487
Info ratio:                      -0.026
250 day volatility:               0.138
Max drawdown:                    22.60% 
    peak / valley:        2019-04-19 / 2020-07-24
    recovered on:         Not recovered!


==================END OF REPORT===================

! [png](… /references/img/output_11_1.png)

Sie haben sicher bemerkt, dass sich diese Ausgabe von der vorherigen unterscheidet: Während der letzte Backtest eine allmähliche Veränderung der Positionen aufwies, ist diese entweder schwarz oder weiß, entweder voll oder rein leer, und wenn Sie die Handelsprotokolle genau analysieren, werden Sie feststellen, dass eine Position nur dann voll ist, wenn die drei Handelsstrategien ihre Hand dafür gehoben haben, dass sie voll ist, und den Rest der Zeit ist sie leer. Daher ist die Ertragskurve in einem einseitig fallenden Markt eine gerade Linie. Es gibt jedoch keine Möglichkeit, Verluste zu minimieren, indem Sie die Position entsprechend reduzieren, wenn die Aktie fällt, wenn sie voll ist.

Als nächstes verwenden wir immer noch diesen Ausschuss, aber wenn es nur zwei Stimmen für eine volle Position gibt, ist er am Ende voll besetzt:

Dritter Hybrid: Abstimmung im Ausschuss

Die dritte Portfoliokonstruktionsmethode: immer noch eine Ausschussstrategie, aber die Abstimmungsschwelle für die Ausgabe einer vollständig investierten Long-Position wurde auf 2 Stimmen geändert, d. h. solange zwei Strategien denken, dass sie eine Long-Position ausgeben sollten, wird sie dies tun.

op.set_blender('pos_2_0(s0, s1, s2, s3, s4)')
# 运行策略
res = qt.run(op, mode=1)

Die Ergebnisse lauten wie folgt: annualisierte Rendite 8,46 %, Sharpe Ratio 0,612

====================================
|                                  |
|         BACKTEST REPORT          |
|                                  |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 180.0 ms
time consumption for operation back testing:  3.5 ms
investment starts on      2016-04-05 15:00:00
ends on                   2021-01-29 15:00:00
Total looped periods:     4.8 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    12       10     22   71.5%     -0.0%     28.5%  

Total operation fee:     ¥      548.27
total investment amount: ¥  100,000.00
final value:              ¥  147,914.95
Total return:                    47.91% 
Avg Yearly return:                8.46%
Skewness:                         -0.64
Kurtosis:                          8.61
Benchmark return:                63.94% 
Benchmark Yearly return:         10.80%

------strategy loop_results indicators------ 
alpha:                           -0.018
Beta:                             1.001
Sharp ratio:                      0.612
Info ratio:                      -0.018
250 day volatility:               0.154
Max drawdown:                    22.34% 
    peak / valley:        2019-04-19 / 2020-07-24
    recovered on:         Not recovered!


==================END OF REPORT===================

! [png](… /references/img/output_11_1.png)

Wenn Sie das zweite und das dritte Diagramm vergleichen, können Sie sehen, dass das Intervall für eine volle Position deutlich länger geworden ist. Das liegt daran, dass eine Strategie, die ursprünglich drei Stimmen für eine volle Position erforderte, jetzt nur noch zwei Stimmen erfordert und daher mit größerer Wahrscheinlichkeit zu einer vollen Position führt

8.4. Diese Bewertung

Nun, ich denke, dass Sie an dieser Stelle ein grundlegendes Verständnis für den Mix von Handelsstrategien haben sollten. Obwohl der Kernel von qteasy als vektorisierter Strategie-Kernel konzipiert ist, der ein schnelles Backtesting und eine schnelle Ausführung ermöglicht, gibt es dennoch genügend Flexibilität, um theoretisch jede Art von Handelsstrategie zu implementieren, die Sie sich vorstellen können.

Gleichzeitig wurde das Backtesting-Framework qteasy auf eine ganz besondere Art und Weise entwickelt, um zu verhindern, dass Sie versehentlich Future-Funktionen in Ihre Handelsstrategie importieren, um sicherzustellen, dass Ihre Handelsstrategie ausschließlich auf der Grundlage von Daten aus der Vergangenheit backgetestet wird, und um eine Vielzahl von Vorverarbeitungstechniken und JIT-Techniken zur Kompilierung der Schlüsselfunktionen des Kernels zu verwenden, um die Geschwindigkeit der Sprache C zu erreichen.

Um jedoch eine theoretisch unendliche Anzahl von Handelsstrategien zu erreichen, reicht es nicht immer aus, nur die eingebauten Handelsstrategien zu verwenden und Strategien zu mischen. Einige spezifische Handelsstrategien oder besonders komplexe Handelsstrategien können nicht durch das Mischen der eingebauten Strategien erstellt werden, so dass wir die von qteasy bereitgestellte Basisklasse Strategy verwenden müssen, um eine benutzerdefinierte Handelsstrategie auf der Grundlage bestimmter Regeln zu erstellen. Strategie auf der Grundlage bestimmter Regeln.

Im nächsten Abschnitt des qteasy-Tutorials zeigen wir Ihnen anhand eines Beispiels, wie Sie eine benutzerdefinierte Handelsstrategie erstellen, wie Sie die grundlegenden Parameter der Strategie definieren, wie Sie die von der Strategie benötigten Datentypen festlegen und wie Sie die Logik für die Erzeugung von Handelssignalen einrichten.