Recherche avancée sur les plateformes
FMZ dispose d'un bloc-notes jupyter intégré pour aider les utilisateurs à se familiariser avec l'API de la plate-forme et à mener des recherches stratégiques, et prend en charge les environnements d'apprentissage de Python3 C++11/17 et Javascript. Notebook+Python est un outil très puissant, qui est presque indispensable pour l'analyse des données et la recherche de stratégies. Bien que le backtest fourni avec la plate-forme FMZ soit très utile, il n'est pas adapté aux stratégies avec des volumes de données complexes et volumineux. Cet article présentera quelques compétences avancées en utilisant le bloc-notes jupyter et réalisera des backtests de stratégies de trading randomisées et de multi-trading.
L'environnement de recherche à l'intérieur de FMZ peut être utilisé, mais la mise en réseau est gênante. Il est recommandé d'installer sur votre propre appareil l'anaconda3, avec un ordinateur portable et des bibliothèques connexes couramment utilisées pour les calculs mathématiques; il peut partager l'environnement du réseau local et avoir de meilleures performances. Il est également recommandé d'utiliser Google colab. Bien qu'il existe certaines limitations de stockage, il est gratuit et puissant, adapté à la recherche liée à l'étude des robots.
Il existe de nombreux tutoriels en ligne pour les compétences spécifiques en utilisant notebook et Python. Vous pouvez trouver beaucoup d'informations en recherchant des mots clés, comme la quantification Python et le tutoriel de notebook jupyter. Vous devez apprendre et maîtriser une série de bases telles que le robot d'exploration, le traitement des données, le backtest, la conception de stratégie et le plotting.
Les plateformes fournissent généralement des API pour obtenir des K-lines avec des données d'historique, et certaines fournissent également des données d'exécution de transaction par transaction.
Ensuite, nous allons démontrer comment obtenir et stocker les données de la ligne K des contrats perpétuels sur Binance.
Tout d'abord, trouvez la documentation du Binance Perpetual Swap:https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. Vous pouvez voir les paramètres requis et les formats de données retournés. Habituellement, le nombre de lignes K acquises par l'API est limité, et Binance a un maximum de 1000, il doit donc être acquis par itération de boucle. La situation sur d'autres plateformes est similaire à Binance. Notez que le réseau doit être connecté au réseau étranger (par rapport au réseau national en Chine) pour explorer les lignes K.
Les périodes prises en charge par Binance: 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.
Dans [24]:
les demandes d'importation #demandes de réseau pour la bibliothèque commune
à partir de la date-heure date d'importation, date-heure
Temps d'importation
Importation de pandas comme pd
Dans [160]:
def GetKlines ((symbole=
Le stockage et la lecture des données peuvent utiliser les fonctions de la bibliothèque Panda.
En plus du prix le plus élevé, du prix le plus bas, du prix d'ouverture, du prix de clôture et du volume exécuté, les données de ligne K renvoyées par Binance comprennent également le montant total des transactions, le montant des achats d'initiatives, le montant des exécutions, etc. Ce sont des informations précieuses qui peuvent être utilisées pour construire des stratégies.
Dans [86]: Je suis désolée. Le nombre d'heures de travail est calculé en fonction de la fréquence de travail. Dans [87]: df Extrait[87]: Je ne peux pas vous dire ce que j' ai fait. Je ne peux pas vous dire ce que j' ai fait. Je ne peux pas vous dire ce que j' ai fait. Temps d'ouverture haut bas montant de clôture fin_temps nombre de volumes acheter_montant acheter_volume nul 0 1596988800000 11575.08 11642.00 11566.07 11591.37 6541.466 1596992399999 7.592336e+07 25724 3127.898 3.630633e+07 0 1 1596992400000 11591.39 11610.23 11526.90 11534.39 6969.252 1596995999999 8.057780e+07 27403 3390.424 3.920162e+07 0 2 1596996000000 11534.39 11656.69 11527.93 11641.07 6439.365 1596999599999 7.469135e+07 25403 3446.186 3.997906e+07 0 3 1596999600000 11641.06 11665.90 11624.20 11635.30 3911.582 1597003199999 4.555459e+07 17820 1842.413 2.145768e+07 0 4 1597003200000 11635.29 11684.00 11635.29 11673.81 3461.004 1597006799999 4.036804e+07 15513 1660.575 1.936981e+07 0 ............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... Le montant de l'aide est calculé en fonction de la situation actuelle de l'entreprise. Le montant de la taxe de séjour est fixé à la valeur de la taxe de séjour, à la valeur de la taxe de séjour et à la valeur de la taxe de séjour. Les États membres peuvent prévoir des mesures d'accompagnement et de soutien en ce qui concerne la mise en œuvre de mesures d'accompagnement et de soutien. Les États membres peuvent prévoir des mesures d'accompagnement en ce qui concerne la mise en œuvre des mesures de prévention et de lutte contre la pauvreté. Le montant de la taxe de séjour est fixé à la valeur de la taxe de séjour, à l'exclusion de la taxe de séjour. - Je ne sais pas. 8810 lignes × 12 colonnes
- Je ne sais pas.
Dans [88]:
df.index = pd.to_datetime ((df.time,unit=
L'article précédent a également donné le moteur de backtest Python, mais voici une version optimisée. Les contrats perpétuels à marge USDT (ou autres contrats à marge de devises de devises) sont très similaires aux contrats au comptant. La différence est que les contrats perpétuels peuvent être tirés par un effet de levier et détenir un montant négatif (équivalent à faire du short), et peuvent partager un moteur de backtest. Les contrats de livraison à crypto-marge sont spéciaux, car ils sont réglés en monnaie et nécessitent un backtest spécifique.
Un exemple simple est donné ici, qui peut implémenter le backtesting perpétuel multi-symbole ou multi-symbole. De nombreux détails sont ignorés: comme le levier des contrats à terme, l'occupation de la marge, le taux de financement, le mécanisme de liquidation, la création de marché et les transactions des preneurs d'ordres ainsi que la maintenance des ordres, mais cela n'affecte généralement pas les résultats normaux du backtest. Et le prix et la quantité de l'appariement et la mise à jour du compte doivent tous être importés de l'extérieur. Les lecteurs peuvent l'améliorer sur cette base.
Introduction à la classe d'échange
compte:USDT indique la devise de base, qui n'est pas nécessaire; réalisé_profit: les bénéfices et pertes déjà réalisés; non réalisé_profit: les bénéfices et pertes non encore réalisés; total: le capital total; frais: les frais de traitement. Pour les autres paires de négociation, montant (qui est un nombre négatif lors de la réalisation de courts); hold_price: le prix de détention; valeur: la valeur de détention; prix: le prix actuel.
trade_symbols: gamme de paires de négociation; vous pouvez également passer dans une paire de négociation; la devise de cotation par défaut est USDT, mais vous pouvez également utiliser d'autres symboles de devises de cotation pour backtest.
Taxe: la taxe de remise; pour être simple, ne faites pas de distinction entre le fabricant et le preneur.
initial_balance: les actifs initiaux; le montant initial des paires de négociation par défaut est égal à 0.
Fonction d'achat: acheter, ce qui correspond à faire long et à fermer court des contrats perpétuels, sans mécanisme de correspondance.
La fonction de vente est de vendre.
Fonction de mise à jour: pour mettre à jour les informations du compte, qui doivent être transmises dans le dictionnaire des prix de toutes les paires de négociation. Dans [98]: classe échange:
def init(selon, symbole de transaction, frais = 0,0004, solde initial = 10000): le solde initial est le solde de l'entreprise. Autonome = frais Les données relatives à l'échange de titres et de titres sont fournies par les autorités compétentes de l'Union européenne. Le solde de l'établissement de crédit est le montant total de l'établissement de crédit dont le solde de l'établissement de crédit est le solde de l'établissement. pour le symbole dans trade_symbols: Le montant de l'impôt sur les sociétés est calculé à partir du montant de l'impôt sur les sociétés, qui correspond au montant de l'impôt sur les sociétés.
défini Commerce ((même, symbole, direction, prix, montant):
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
Définition acheter (même, symbole, prix, montant):self.Trade(symbole 1, prix, montant)
défin Vendre ((même, symbole, prix, montant):self.Trade(symbole -1, prix, montant)
défi Mise à jour ((self, close_price): #mise à jour des actifs
compte personnel[
Tout d'abord, nous allons backtest une stratégie classique de grille perpétuelle. Cette stratégie est très populaire sur notre plateforme récemment. Par rapport à la grille au comptant, elle n'a pas besoin de détenir de monnaie et peut ajouter un effet de levier, ce qui est beaucoup plus pratique que la grille au comptant. Cependant, comme elle ne peut pas être directement backtestée, elle n'est pas propice à la sélection de symboles de monnaie. Ici, nous utilisons le moteur de backtest juste maintenant pour le tester.
En haut de
Plus la période de la ligne K est courte, plus les résultats du backtest correspondant sont précis et plus la quantité de données requise est importante.
Dans [241]:
le symbole =
e = échange (([symbole], redevance=0.0002, solde initial_10000)
init_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])
rés = pd.DataFrame ((data=res_list, colonnes=[
Ce type de stratégie est également relativement populaire, mais la plate-forme FMZ n'est pas très bonne pour backtesting des stratégies multi-symbole, il suffit d'utiliser ce moteur de backtest pour essayer.
Tout d'abord, obtenez les prix de clôture des quatre symboles au cours de l'année écoulée. On peut voir que l'ETH a la plus forte augmentation, et les trois autres ont des augmentations similaires. Si vous détenez ces quatre symboles en moyenne, la valeur nette finale est de 4,5. Après backtest, la stratégie d'équilibre a une valeur nette finale de 5,3, qui est légèrement améliorée.
Dans [290]:
les symboles = [
La stratégie tortue est une stratégie de tendance classique, qui comprend une logique stop-loss complète pour ajouter des positions.https://zhuanlan.zhihu.com/p/27987938Nous allons mettre en œuvre une version simple ici pour le backtest.
La période de stratégie de la tortue a une grande influence sur la stratégie, et il est déconseillé de choisir une période trop courte. Ici, nous choisissons 6h. La période du canal de Donchian est sélectionnée comme 5, et le ratio de position est sélectionné comme 0,003 selon le backtest. Lorsque le prix franchit la bande ascendante du canal pour ouvrir 1 unité de position longue, et que le prix continue à augmenter de 0,3 volatilité après avoir ouvert les positions, continuez à ajouter 1 unité, et le prix tombe en dessous de 2,5 Volatilité du dernier prix ouvert pour arrêter la perte. Le principe de l'ordre court est le même. En raison du grand marché haussier de l'ETH, la stratégie de la tortue a capturé la tendance principale et a finalement réalisé 27 fois les profits, avec un effet de levier maximum de 4 fois pendant la période.
Les paramètres de la stratégie tortue sont étroitement liés à la période et doivent être sélectionnés par backtest.
On peut voir sur le graphique final de la valeur nette que la stratégie de la tortue est une stratégie à long terme, au cours de laquelle il peut y avoir aucun profit pendant 3 à 4 mois, et des pertes d'arrêt répétées, mais une fois qu'il y a une grosse cotation de marché d'un côté, la stratégie de la tortue peut profiter de la tendance pour accumuler une grande position, la maintenir jusqu'à la fin de la tendance, gagner beaucoup de profits. À la fin de la hausse, la stratégie accumulera beaucoup de positions. À ce moment-là, la volatilité sera relativement grande et de gros profits seront souvent retirés.
Dans [424]:
le symbole =
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']])
rés = pd.DataFrame ((data=res_list, colonnes=[
Si vous maîtrisez l'utilisation de la plateforme de recherche jupyter notebook, vous pouvez facilement effectuer des opérations, telles que l'acquisition de données, l'analyse de données, le backtest de stratégie, l'affichage de graphiques, etc., ce qui est la voie inévitable vers le trading quantitatif.
Utilisez Python pour effectuer une analyse de données:https://wizardforcel.gitbooks.io/pyda-2e/content/
Tutoriel quantitatif Python:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
Dans [ ]: