Erweiterte Plattformforschung
FMZ verfügt über ein integriertes jupyter-Notebook, das Benutzern hilft, sich mit der Plattform-API vertraut zu machen und Strategieforschung durchzuführen, und unterstützt die Lernumgebungen von Python3 C++11/17 und Javascript. Notebook+Python ist ein sehr leistungsstarkes Tool, das für Datenanalyse und Strategieforschung fast unverzichtbar ist. Obwohl der Backtest, der mit der FMZ-Plattform geliefert wird, sehr nützlich ist, ist er nicht für Strategien mit komplexen und großen Datenmengen geeignet. Dieser Artikel wird einige fortgeschrittene Fähigkeiten mit jupyter-Notebook vorstellen und Backtests von zufälligen Paare und Multi-Paar-Handelsstrategien realisieren.
Die Forschungsumgebung innerhalb des FMZ kann genutzt werden, aber die Vernetzung ist unbequem. Es wird empfohlen, die Anaconda3 mit Notebook und häufig verwendeten verwandten Bibliotheken für mathematische Berechnungen auf Ihrem eigenen Gerät zu installieren; sie kann die lokale Netzwerkumgebung teilen und eine bessere Leistung haben. Es wird auch empfohlen, Google Collab zu verwenden. Obwohl es einige Speicherbeschränkungen gibt, ist sie kostenlos und leistungsstark, geeignet für die Forschung im Zusammenhang mit dem Roboterstudium.
Es gibt viele Online-Tutorials für spezifische Benutzerfähigkeiten von Notebook und Python. Sie können viele Informationen durch Suche nach Schlüsselwörtern wie Python Quantification und jupyter Notebook Tutorial finden. Sie müssen eine Reihe von Grundlagen wie Crawler, Datenverarbeitung, Backtest, Strategieentwicklung und Plotting lernen und beherrschen.
Plattformen bieten in der Regel APIs, um K-Linien mit Historiedaten zu erhalten, und einige liefern auch Daten der Ausführung von Handel nach Handel. Wir müssen den Crawler verwenden, um die Daten zu erhalten und zu speichern.
Als nächstes werden wir zeigen, wie man die K-Line-Daten von Perpetual Contracts auf Binance erhält und speichert.
Zuerst finden Sie die Dokumentation für den Binance Perpetual Swap:https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. Sie können die erforderlichen Parameter und die zurückgegebenen Datenformate anzeigen. Normalerweise ist die Anzahl der von der API erworbenen K-Linien begrenzt, Binance hat maximal 1000, daher muss sie durch Schleifeniteration erworben werden. Die Situation auf anderen Plattformen ist ähnlich wie bei Binance. Beachten Sie, dass das Netzwerk mit dem ausländischen Netzwerk (im Vergleich zum inländischen Netzwerk in China) verbunden sein muss, um die K-Linien zu durchsuchen.
Die Perioden, die Binance unterstützt: 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.
In [24]:
Importanfragen #Netzwerkanfragen für die gemeinsame Bibliothek
ab Datum/Zeit Datum der Einfuhr,Datum/Zeit
Einfuhrzeit
Import von Pandas als PD
In [160]:
def GetKlines ((Symbol=
Die Datenspeicherung und das Lesen können die Funktionen innerhalb der Panda-Bibliothek verwenden.
Neben dem höchsten Preis, dem niedrigsten Preis, dem offenen Preis, dem Schlusskurs und dem ausgeführten Volumen umfassen die von Binance zurückgegebenen K-Liniendaten auch den gesamten Handelsbetrag, den Kaufbetrag der Initiative, den Ausführungsbetrag usw. Dies sind wertvolle Informationen, die zur Konstruktion von Strategien verwendet werden können.
In [86]:
Der Präsident. - Nach der Tagesordnung folgt die Aussprache über:
df = pd.read_csv ((
- Ich weiß.
In [88]:
df.index = pd.to_datetime ((df.time,unit=
Der vorherige Artikel gab auch die Python-Backtest-Engine, aber hier ist eine optimierte Version. USDT-margined (oder andere Quote-Währung-margined) Perpetual Contracts sind sehr ähnlich wie Spot-Kontrakte. Der Unterschied besteht darin, dass perpetual Contracts Hebelwirkung haben und einen negativen Betrag halten können (entsprechend dem Short machen) und eine Backtest-Engine teilen können. Krypto-margined Lieferverträge sind speziell, da sie in Währung abgewickelt werden und einen spezifischen Backtest erfordern.
Hier wird ein einfaches Beispiel gegeben, das Multi-Symbol Spot oder Multi-Symbol Perpetual Backtesting implementieren kann. Viele Details werden ignoriert: wie Hebelwirkung von Futures, Margin-Besetzung, Finanzierungsrate, Liquidationsmechanismus, Market Making und Order Taker-Transaktionen sowie Orderpflege, aber es beeinflusst normalerweise nicht die normalen Backtest-Ergebnisse. Und der Preis und die Menge des Matchings und die Kontoaktualisierung müssen alle extern importiert werden. Leser können es auf dieser Grundlage verbessern.
Einführung in die Austauschklasse:
Konto:USDT gibt die Basiswährung an, die nicht erforderlich ist; realisierter_Gewinn: bereits realisierter Gewinn und Verlust; nicht realisierter_Gewinn: noch nicht realisierter Gewinn und Verlust; Gesamtbetrag: Gesamtkapital; Gebühr: Handlinggebühr. Bei anderen Handelsparen Betrag (bei Shorting eine negative Zahl); Hold_price: Haltpreis; Wert: Haltwert; Preis: aktueller Preis.
trade_symbols: Array von Handelspaaren; Sie können auch in einem Handelspaar passieren; die Standardquote-Währung ist USDT, aber Sie können auch andere Quote-Währungssymbole zum Backtest verwenden.
Gebühr: die Gebühr für die Übergabe; um es einfach zu sagen, unterscheiden Sie nicht zwischen Hersteller und Empfänger.
initial_balance: die anfänglichen Vermögenswerte; der anfängliche Betrag der Standardhandelspaare beträgt 0.
Kauffunktion: Kaufen, was dem Long- und Short-Schließen von Dauerverträgen entspricht, ohne einen Matching-Mechanismus.
Verkaufsfunktion: zu verkaufen.
Aktualisierungsfunktion: Aktualisierung der Kontoinformationen, die in das Preiswörterbuch aller Handelspare eingegeben werden müssen. In [98]: Klasse Austausch:
def Initialisierung(selbst, trade_symbols, Gebühr=0.0004, initial_balance=10000):
Selbst.anfängliches_Guthaben = anfängliches_Guthaben #anfängliches Guthaben
Selbstgebühr = Gebühr
Selbst.trade_symbols = trade_symbols
Selbstkonto = {
def Handel ((selbst, Symbol, Richtung, Preis, Betrag):
cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
open_amount = amount - cover_amount
self.account['USDT']['realised_profit'] -= price*amount*self.fee #take out the fee
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #close first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #profit
self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
self.account[symbol]['amount'] -= -direction*cover_amount
self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
if open_amount > 0:
total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
total_amount = direction*self.account[symbol]['amount']+open_amount
self.account[symbol]['hold_price'] = total_cost/total_amount
self.account[symbol]['amount'] += direction*open_amount
def Kaufen (selbst, Symbol, Preis, Betrag):self.Trade(Symbol 1, Preis, Betrag)
def Verkaufen (selbst, Symbol, Preis, Betrag):self.Trade(Symbol -1, Preis, Betrag)
def Update ((self, close_price): #Aktualisieren der Vermögenswerte
Selbstkonto[
Erstens, lassen Sie uns eine klassische Perpetual Grid-Strategie backtest. Diese Strategie ist in letzter Zeit sehr beliebt auf unserer Plattform. Im Vergleich zum Spot-Grid muss sie keine Währung halten und kann Hebelwirkung hinzufügen, was viel bequemer ist als das Spot-Grid. Da sie jedoch nicht direkt backtested werden kann, ist es nicht förderlich, Währungssymbole auszuwählen. Hier verwenden wir die Backtest-Engine gerade jetzt, um sie zu testen.
An der Spitze von
Je kürzer die K-Linie-Periode, desto genauer sind die entsprechenden Backtest-Ergebnisse und desto größer ist die erforderliche Datenmenge.
In [241]:
Symbol =
e = Wechselkurs (([Symbol], Gebühr=0.0002, initial_balance=10000)
Initial_price = df.loc[0,
if kline.low < buy_price: #the lowest price of K-line is less than the current maker price; the buy order is executed
e.Buy(symbol,buy_price,value/buy_price)
if kline.high > sell_price:
e.Sell(symbol,sell_price,value/sell_price)
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance])
res = pd.DataFrame ((data=res_list, Spalten=[
Diese Art von Strategie ist auch relativ beliebt, aber die FMZ-Plattform ist nicht sehr gut im Backtesting von Multi-Symbol-Strategien, verwenden Sie einfach diese Backtest-Engine, um es auszuprobieren.
Zuerst erhalten Sie die Schlusskosten der vier Symbole im vergangenen Jahr. Es kann gesehen werden, dass ETH den größten Anstieg hat, und die anderen drei ähnliche Anstiege haben. Wenn Sie diese vier Symbole im Durchschnitt halten, beträgt der endgültige Nettowert 4,5. Nach dem Backtest hat die Gleichgewichtsstrategie einen endgültigen Nettowert von 5,3, der leicht erhöht wird.
In [290]:
Symbole = [
Die Schildkrötenstrategie ist eine klassische Trendstrategie, die eine vollständige Stop-Loss-Logik für das Hinzufügen von Positionen enthält.https://zhuanlan.zhihu.com/p/27987938Wir werden hier eine einfache Version für den Backtest implementieren.
Die Schildkrötenstrategieperiode hat einen großen Einfluss auf die Strategie, und es ist nicht ratsam, eine Periode zu kurz zu wählen. Hier wählen wir 6h. Die Donchian-Kanalperiode wird als 5 ausgewählt, und das Positionsverhältnis wird gemäß dem Backtest als 0.003 ausgewählt. Wenn der Preis durch das UpBand des Kanals bricht, um 1 Einheit einer Long-Position zu öffnen, und der Preis nach der Eröffnung der Positionen weiterhin um 0,3 Volatilität steigt, fügen Sie weiterhin 1 Einheit hinzu, und der Preis fällt unter 2,5 Volatilität des letzten offenen Preises, um den Verlust zu stoppen. Das Prinzip der Short-Order ist das gleiche. Aufgrund des großen Bullenmarktes von ETH hat die Schildkrötenstrategie den Haupttrend erfasst und schließlich 27 Mal Gewinne erzielt, mit einer maximalen Hebelwirkung von 4 Mal während des Zeitraums.
Die Parameter der Schildkrötenstrategie hängen eng mit der Periode zusammen und müssen durch Backtest ausgewählt werden.
Aus dem endgültigen Nettowertdiagramm lässt sich erkennen, dass die Schildkrötenstrategie eine langfristige Strategie ist, bei der es für 3 bis 4 Monate keinen Gewinn geben kann und wiederholte Stop-Losses, aber sobald es eine große Marktquote auf der einen Seite gibt, kann die Schildkrötenstrategie den Trend nutzen, um eine große Position zu akkumulieren, bis zum Ende des Trends zu halten, viel Gewinn zu erzielen. Am Ende des Anstiegs wird die Strategie viele Positionen akkumulieren. Zu diesem Zeitpunkt wird die Volatilität relativ groß sein, und oft werden große Gewinne zurückgezogen. Die Verwendung der Schildkrötenstrategie erfordert, dass Sie ihre Mängel und Ihre Geduld akzeptieren.
In [424]:
Symbol =
if kline.high > kline.up and e.account[symbol]['amount'] == 0: #first time to open long position
e.Buy(symbol,kline.up,unit) #notice the trading price here
last_price = kline.up
if e.account[symbol]['amount'] > 0 and kline.high > last_price + open_times*kline.N: #long position, buy in
e.Buy(symbol,last_price + open_times*kline.N,unit)
last_price = last_price + open_times*kline.N
if e.account[symbol]['amount'] > 0 and kline.low < last_price - stop_times*kline.N: #long position, stop loss
e.Sell(symbol,last_price - stop_times*kline.N,e.account[symbol]['amount'])
if kline.low < kline.down and e.account[symbol]['amount'] == 0: #open short
e.Sell(symbol,kline.down,unit)
last_price = kline.down
if e.account[symbol]['amount'] < 0 and kline.low < last_price - open_times*kline.N: #short position, buy in
e.Sell(symbol,last_price - open_times*kline.N,unit)
last_price = last_price - open_times*kline.N
if e.account[symbol]['amount'] < 0 and kline.high > last_price + stop_times*kline.N: #short position, stop loss
e.Buy(symbol,last_price + stop_times*kline.N,-e.account[symbol]['amount'])
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount']*kline.close, e.account['USDT']['total']])
res = pd.DataFrame ((data=res_list, Spalten=[
Wenn Sie in der Verwendung der jupyter Notebook Research Plattform versiert sind, können Sie leicht Operationen wie Datenerfassung, Datenanalyse, Strategie-Backtest, Chart-Anzeige usw. ausführen, was der unvermeidliche Weg zum quantitativen Handel ist. Wenn Sie im Moment keine Ahnung über das Schreiben von Strategien haben, können Sie die Daten auch zuerst analysieren. Für Anfänger empfehlen wir Ressourcen:
Verwenden Sie Python, um Daten zu analysieren:https://wizardforcel.gitbooks.io/pyda-2e/content/
Quantitativer Python-Tutorial:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
In [ ]: