Advertisement
Maurizio-Ciullo

Strategia BREAKIN - Esempio ottimizzazione EURUSD

Apr 16th, 2022
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.24 KB | None | 0 0
  1.                      
  2.                                             Strategia BREAKIN - Esempio ottimizzazione EURUSD
  3.  
  4.  
  5. # Prima di caricare il file.csv aprire la scheda di venv qui sulle tendina di visual studio dove contiene tutti i file e trascinare il nuovo file li.
  6.  
  7. # Questo รจ il link sorgente di tutti i file con i dati scaricati:
  8. # https://code.10mintrader.com/user/2ea804d37d1d4fa4dc85bbc9f104f25aadd67366/tree/python_4_trading
  9.  
  10.  
  11.                                                         # librerie da installare
  12.  
  13. !pip install backtrader
  14. !pip install matplotlib==3.2.2
  15. !pip install pandas
  16. !pip install tqdm
  17. !pip install ipywidgets
  18. # py -m pip install ....le librerie chi mi servono... se uso venv
  19.  
  20. ---------------------------------------------------------------------------
  21.  
  22.                                                        # carico la strategia
  23.  
  24. import backtrader as bt
  25.  
  26.  
  27. class BreakIn(bt.Strategy):
  28.    
  29.     params = (
  30.         ('atrPeriodo', 14),
  31.         ('atrMult', 2),
  32.         ('stopLoss', 0.0030),
  33.         ('takeProfit', 0.0050),
  34.     )
  35.  
  36.     def __init__(self):
  37.         self.atr = bt.ind.ATR(period=self.params.atrPeriodo)
  38.         self.openPrice = self.datas[0].open
  39.         self.highPrice = self.datas[0].high
  40.         self.lowPrice = self.datas[0].low
  41.         self.closePrice = self.datas[0].close
  42.  
  43.     def next(self):
  44.         if abs(self.openPrice - self.closePrice) > (self.atr * self.params.atrMult) and self.closePrice > self.openPrice and self.position.size == 0 :
  45.             stopLoss = self.closePrice - self.params.stopLoss
  46.             takeProfit = self.closePrice + self.params.takeProfit
  47.             self.buy_bracket(size=50000, stopprice=stopLoss, limitprice=takeProfit, exectype=bt.Order.Market)
  48.  
  49.         elif abs(self.openPrice - self.closePrice) > (self.atr * self.params.atrMult) and self.closePrice < self.openPrice and self.position.size == 0:
  50.             stopLoss = self.closePrice + self.params.stopLoss
  51.             takeProfit = self.closePrice - self.params.takeProfit
  52.             self.sell_bracket(size=50000, stopprice=stopLoss, limitprice=takeProfit, exectype=bt.Order.Market)
  53.  
  54. ---------------------------------------------------------------------------
  55.  
  56.                                  # Carico e imposto il motore cerebro con la callback per ogni ottimizzazione
  57.  
  58. import backtrader as bt
  59. from datetime import datetime
  60. import numpy as np
  61. import pandas as pd
  62. from backtrader import CommInfoBase
  63. from tqdm import tqdm # NON RISCO AD IMPORTARE IL MODULO
  64.  
  65.  
  66. def optimizer_callbacks(cb):
  67.     pbar.update()
  68.  
  69.  
  70. def ottimizzazioneStrategia(**kwargs):
  71.     total = np.prod([len(value) for key, value in kwargs.items()])
  72.  
  73.     initCapital = 10000
  74.     cerebro = bt.Cerebro()
  75.     cerebro.broker.setcommission(leverage=30, commission=0.00001, commtype=CommInfoBase.COMM_FIXED)
  76.     cerebro.broker.set_slippage_fixed(0.0001)
  77.     data = bt.feeds.GenericCSVData(
  78.         dataname='FXCM_EURUSD_1H_20170101_20211013.csv',
  79.         timeframe=bt.TimeFrame.Minutes,
  80.         compression=60,
  81.         fromdate=datetime(2017, 1, 1),
  82.         todate=datetime(2019, 1, 1),
  83.         dtformat=('%Y%m%d'),
  84.         tmformat=('%H%M'),
  85.         date=0,
  86.         time=1,
  87.         open=2,
  88.         high=3,
  89.         low=4,
  90.         close=5,
  91.         volume=6,
  92.         openinterest=-1
  93.     )
  94.     # Add the data to Cerebro
  95.     cerebro.adddata(data)
  96.     # Set our desired cash start
  97.     cerebro.broker.setcash(initCapital)
  98.  
  99.     cerebro.addanalyzer(bt.analyzers.DrawDown, _name="drawdown")
  100.     cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name="trade")
  101.  
  102.     strats = cerebro.optstrategy(BreakIn, **kwargs)
  103.     global pbar
  104.  
  105.     pbar = tqdm(position=0, leave=True, smoothing=0.05, desc='Optimization Runs', total=total)
  106.     cerebro.optcallback(optimizer_callbacks)
  107.  
  108.     result = cerebro.run(optreturn=False, maxcpus=4)
  109.     print('')
  110.     res_list = [[x[0].params.atrPeriodo,
  111.                  x[0].params.atrMult,
  112.                  x[0].params.stopLoss,
  113.                  x[0].params.takeProfit,
  114.                  x[0].analyzers.trade.get_analysis()['total']['total'],
  115.                  abs(x[0].analyzers.trade.get_analysis()['won']['pnl']['total']) / abs(
  116.                      x[0].analyzers.trade.get_analysis()['lost']['pnl']['total']),
  117.                  x[0].analyzers.drawdown.get_analysis()['max']['drawdown'],
  118.                  x[0].analyzers.trade.get_analysis()['long']['won'] / x[0].analyzers.trade.get_analysis()['long'][
  119.                      'total'],
  120.                  x[0].analyzers.trade.get_analysis()['short']['won'] / x[0].analyzers.trade.get_analysis()['short'][
  121.                      'total']
  122.                  ] for x in result]
  123.  
  124.     pd.set_option("max_columns", None)
  125.     pd.set_option('display.max_rows', None)
  126.     pd.set_option('display.width', 300)
  127.  
  128.     dfOpt = pd.DataFrame(res_list,
  129.                          columns=['atrPeriodo', 'atrMult', 'stopLoss', 'takeProfit', 'tot_trade', 'ProfitFactor', 'DDMax',
  130.                                   'Win%Long', 'Win%Short'])
  131.  
  132.     dfOpt = dfOpt.sort_values(['ProfitFactor','tot_trade', 'DDMax', 'Win%Long', 'Win%Short'],
  133.                               ascending=[False, False, True, False, False])
  134.     print(dfOpt)
  135.  
  136. ---------------------------------------------------------------------------
  137.  
  138.                                                         # lancio l'ottimizzazione
  139.  
  140. ottimizzazioneStrategia(stopLoss = list(np.arange(0.0030, 0.0060, 0.001)),
  141.                         takeProfit = list(np.arange(0.0030, 0.0060, 0.001)),
  142.                         atrMult = list(np.arange(1.9, 2.1, 0.1)))
  143.  
  144. ---------------------------------------------------------------------------
  145.  
  146.                                                        # Backtest out-of-sample
  147.  
  148. initCapital = 10000
  149. cerebro = bt.Cerebro()
  150.  
  151. cerebro.broker.setcommission(leverage=30, commission=0.00001, commtype=CommInfoBase.COMM_FIXED)
  152. cerebro.broker.set_slippage_fixed(0.0001)
  153.  
  154.  
  155. data = bt.feeds.GenericCSVData(
  156.     dataname='FXCM_EURUSD_1H_20170101_20211013.csv',
  157.     timeframe=bt.TimeFrame.Minutes,
  158.     compression=60,
  159.     fromdate=datetime(2019, 1, 1),
  160.     todate=datetime(2021, 10, 21),
  161.     dtformat=('%Y%m%d'),
  162.     tmformat=('%H%M'),
  163.     date=0,
  164.     time=1,
  165.     open=2,
  166.     high=3,
  167.     low=4,
  168.     close=5,
  169.     volume=6,
  170.     openinterest=-1
  171. )
  172. # Add the data to Cerebro
  173. cerebro.adddata(data)
  174. # Set our desired cash start
  175. cerebro.broker.setcash(initCapital)
  176.  
  177. cerebro.addanalyzer(bt.analyzers.DrawDown, _name="drawdown")
  178. cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name="trade")
  179. cerebro.addanalyzer(bt.analyzers.TimeReturn, _name="timereturn")
  180.  
  181. # Run over everything
  182.  
  183. cerebro.addstrategy(BreakIn)
  184.  
  185. result = cerebro.run(tradehistory=True)
  186.  
  187. ---------------------------------------------------------------------------
  188.  
  189.                                                             # Statistiche
  190.  
  191.     finalCapital = initCapital + result[0].analyzers.trade.get_analysis()['pnl']['net']['total']
  192.  
  193.     print("+++++++++++++++++++++++++++++++++++++++++++++++++++++")
  194.     print("+++++++++++++++++++++ Backtest ++++++++++++++++++++++")
  195.     print("+++++++++++++++++++++++++++++++++++++++++++++++++++++")
  196.     print("")
  197.     print("Ordini Totali..........: {}".format(result[0].analyzers.trade.get_analysis()['total']['total']))
  198.     print("Ordini Streak vinti....: {}".format(result[0].analyzers.trade.get_analysis()['streak']['won']['current']))
  199.     print("Ordini Streak persi....: {}".format(result[0].analyzers.trade.get_analysis()['streak']['lost']['current']))
  200.     print("Profit Factor..........: {}".format(
  201.         abs(result[0].analyzers.trade.get_analysis()['won']['pnl']['total']) / abs(
  202.             result[0].analyzers.trade.get_analysis()['lost']['pnl']['total'])))
  203.     print("Drawdown Max...........: {}".format(result[0].analyzers.drawdown.get_analysis()['max']['drawdown']))
  204.     print("Capitale finale........: {}".format(finalCapital))
  205.     print("Profitto %.............: {}".format(((finalCapital - initCapital) / initCapital) * 100))
  206.     print("PNL lorda..............: {}".format(result[0].analyzers.trade.get_analysis()['pnl']['gross']['total']))
  207.     print("PNL netta..............: {}".format(result[0].analyzers.trade.get_analysis()['pnl']['net']['total']))
  208.     print("---------------- Vincite -------------")
  209.     print("Trade totali...........: {}".format(result[0].analyzers.trade.get_analysis()['won']['total']))
  210.     print("Trade PNL totale.......: {}".format(result[0].analyzers.trade.get_analysis()['won']['pnl']['total']))
  211.     print("Trade PNL medio........: {}".format(result[0].analyzers.trade.get_analysis()['won']['pnl']['average']))
  212.     print("Trade PNL massimo......: {}".format(result[0].analyzers.trade.get_analysis()['won']['pnl']['max']))
  213.     print("---------------- Perdite -------------")
  214.     print("Trade totali...........: {}".format(result[0].analyzers.trade.get_analysis()['lost']['total']))
  215.     print("Trade PNL totale.......: {}".format(result[0].analyzers.trade.get_analysis()['lost']['pnl']['total']))
  216.     print("Trade PNL medio........: {}".format(result[0].analyzers.trade.get_analysis()['lost']['pnl']['average']))
  217.     print("Trade PNL massimo......: {}".format(result[0].analyzers.trade.get_analysis()['lost']['pnl']['max']))
  218.     print("----------------- Long ---------------")
  219.     print("Trade totali...........: {}".format(result[0].analyzers.trade.get_analysis()['long']['total']))
  220.     print("Trade vinti............: {}".format(result[0].analyzers.trade.get_analysis()['long']['won']))
  221.     print("Trade persi............: {}".format(result[0].analyzers.trade.get_analysis()['long']['lost']))
  222.     print("Win/Loss Ratio.........: {}".format(
  223.         result[0].analyzers.trade.get_analysis()['long']['won'] / result[0].analyzers.trade.get_analysis()['long'][
  224.             'total']))
  225.     print("Trade PNL totale.......: {}".format(result[0].analyzers.trade.get_analysis()['long']['pnl']['total']))
  226.     print("Trade PNL Medio........: {}".format(result[0].analyzers.trade.get_analysis()['long']['pnl']['average']))
  227.     print("Trade Vincite Totali...: {}".format(result[0].analyzers.trade.get_analysis()['long']['pnl']['won']['total']))
  228.     print(
  229.         "Trade Vincita Media....: {}".format(result[0].analyzers.trade.get_analysis()['long']['pnl']['won']['average']))
  230.     print("Trade Vincita Massima..: {}".format(result[0].analyzers.trade.get_analysis()['long']['pnl']['won']['max']))
  231.     print(
  232.         "Trade Perdita Totali...: {}".format(result[0].analyzers.trade.get_analysis()['long']['pnl']['lost']['total']))
  233.     print("Trade Perdita Media....: {}".format(
  234.         result[0].analyzers.trade.get_analysis()['long']['pnl']['lost']['average']))
  235.     print("Trade Perdita Massima..: {}".format(result[0].analyzers.trade.get_analysis()['long']['pnl']['lost']['max']))
  236.     print("----------------- Short ---------------")
  237.     print("Trade totali...........: {}".format(result[0].analyzers.trade.get_analysis()['short']['total']))
  238.     print("Trade vinti............: {}".format(result[0].analyzers.trade.get_analysis()['short']['won']))
  239.     print("Trade persi............: {}".format(result[0].analyzers.trade.get_analysis()['short']['lost']))
  240.     print("Win/Loss Ratio.........: {}".format(
  241.         result[0].analyzers.trade.get_analysis()['short']['won'] / result[0].analyzers.trade.get_analysis()['short'][
  242.             'total']))
  243.     print("Trade PNL totale.......: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['total']))
  244.     print("Trade PNL Medio........: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['average']))
  245.     print(
  246.         "Trade Vincite Totali...: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['won']['total']))
  247.     print("Trade Vincita Media....: {}".format(
  248.         result[0].analyzers.trade.get_analysis()['short']['pnl']['won']['average']))
  249.     print("Trade Vincita Massima..: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['won']['max']))
  250.     print(
  251.         "Trade Perdita Totali...: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['lost']['total']))
  252.     print("Trade Perdita Media....: {}".format(
  253.         result[0].analyzers.trade.get_analysis()['short']['pnl']['lost']['average']))
  254.     print("Trade Perdita Massima..: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['lost']['max']))
  255.  
  256.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement