Advertisement
Guest User

Untitled

a guest
Dec 30th, 2020
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.60 KB | None | 0 0
  1. import warnings
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. import pandas as pd
  5. import seaborn as sns
  6. import yfinance as yf
  7. from sklearn import linear_model
  8. from sklearn.naive_bayes import GaussianNB
  9. from sklearn.svm import SVC
  10. from sklearn.ensemble import RandomForestClassifier
  11. from sklearn.neural_network import MLPClassifier
  12. import datetime
  13. import backtrader as bt
  14. from backtrader.feeds import PandasData
  15. import backtrader.analyzers as btanalyzers
  16.  
  17. warnings.filterwarnings("ignore")
  18. plt.style.use('seaborn-colorblind')
  19.  
  20. ticker = 'TSLA'
  21. start = datetime.datetime(2000, 1, 1)
  22. end = datetime.datetime(2030, 12, 28)
  23. stock = yf.download(ticker, progress=True, actions=True, start=start, end=end)
  24.  
  25. stock = stock['Adj Close']
  26. stock = pd.DataFrame(stock)
  27.  
  28. stock.head()
  29.  
  30. stock.rename(columns = {"Adj Close": ticker}, inplace=True)
  31.  
  32. stock['returns'] = np.log(stock/stock.shift(1))
  33. stock.dropna(inplace=True)
  34.  
  35. stock['direction'] = np.sign(stock['returns']).astype(int)
  36.  
  37. stock.head(10)
  38.  
  39. fig, ax = plt.subplots(2, 1, sharex=True, figsize=(12, 6))
  40. ax[0].plot(stock[ticker], label = f'{ticker} Adj Close')
  41. ax[0].set(title=f'{ticker} Closing Price', ylabel='Price')
  42. ax[0].grid(True)
  43. ax[0].legend()
  44. ax[1].plot(stock['returns'], label = 'Daily Returns')
  45. ax[1].set(title=f'{ticker} Daily Returns', ylabel='Returns')
  46. ax[1].grid(True)
  47. ax[1].legend()
  48.  
  49. lags= [1,2,3,4,5]
  50. cols = []
  51. for lag in lags:
  52.     col = f'rtn_lag{lag}'
  53.     stock[col] = stock['returns'].shift(lag)
  54.     cols.append(col)
  55. stock.dropna(inplace=True)
  56. stock.head(2)
  57.  
  58. def create_bins(data, bins=[0]):
  59.     global cols_bin
  60.     cols_bin = []
  61.     for col in cols:
  62.         col_bin = col+'_bin'
  63.         data[col_bin] = np.digitize(data[col], bins=bins)
  64.         cols_bin.append(col_bin)
  65.  
  66. create_bins(stock)
  67.  
  68. models = {
  69.     'log_reg': linear_model.LogisticRegression(),
  70.     'gauss_nb': GaussianNB(),
  71.     'svm': SVC(),
  72.     'random_forest:': RandomForestClassifier(max_depth=10, n_estimators=100),
  73.     'MLP': MLPClassifier(max_iter=100)
  74. }
  75.  
  76. def fit_models(data):
  77.     nfit = {model: models[model].fit(data[cols_bin], data['direction']) for model in models.keys()}
  78.  
  79. def derive_positions(data):
  80.     for model in models.keys():
  81.         data['pos_' + model] = models[model].predict(data[cols_bin])
  82.  
  83. def evaluate_strats(data):
  84.     global strategy_rtn
  85.     strategy_rtn = []
  86.     for model in models.keys():
  87.         col = 'strategy_' + model
  88.         data[col] = data['pos_' + model] * data['returns']
  89.         strategy_rtn.append(col)
  90.     strategy_rtn.insert(0, 'returns')
  91.  
  92. fit_models(stock)
  93. derive_positions((stock))
  94. evaluate_strats(stock)
  95. stock[strategy_rtn].sum().apply(np.exp)
  96. ax = stock[strategy_rtn].cumsum().apply(np.exp).plot(figsize=(12, 6), title='ML return Comp')
  97. ax.set_ylabel('Cum Returns')
  98. ax.grid(True)
  99.  
  100. price = yf.download(ticker, progress=True, action=True, start=start, end=end)
  101. price.head()
  102.  
  103. predictons = stock['strategy_svm']
  104.  
  105. predictions = pd.DataFrame(predictons)
  106.  
  107. predictions.rename(columns = {'strategy_rtn': 'predicted'}, inplace=True)
  108.  
  109. price = predictions.join(price, how='right').dropna()
  110.  
  111. price.head()
  112.  
  113. predictions.head()
  114.  
  115. OHLCH=['open', 'high', 'low', 'close', 'volume']
  116.  
  117. class SignalData(PandasData):
  118.     cols = OHLCH +['predicted']
  119.     lines = tuple(cols)
  120.     params = {c: -1 for c in cols}
  121.     params.update({'datetime': None})
  122.     params = tuple(params.items())
  123.  
  124. cols = OHLCH + ['predicted']
  125. lines = tuple(cols)
  126. params = {c: -1 for c in cols}
  127. params.update({'datetime': None})
  128. params = tuple(params.items())
  129.  
  130. print(params)
  131.  
  132. class MLStrategy(bt.Strategy):
  133.     params = dict(
  134.  
  135.     )
  136.     def __init__(self):
  137.         self.data_predicted = self.datas[0].predicted
  138.         self.data_open = self.datas[0].open
  139.         self.data_close = self.datas[0].close
  140.  
  141.         self.order=None
  142.         self.price=None
  143.         self.comm=None
  144.  
  145.     def log(self, txt):
  146.         """Logging function"""
  147.         dt = self.datas[0].datetime.date(0).isoformat()
  148.         print(f'{dt}, {txt}')
  149.  
  150.     def notify_order(self, order):
  151.         if order.status in [order.Submitted, order.Accepted]:
  152.             # order already submitted/accepted - no action required
  153.             return
  154.         # report executed order
  155.         if order.status in [order.Completed]:
  156.             if order.isbuy():
  157.                 self.log(f'BUY EXECUTED --- Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f},Commision: {order.executed.comm:.2f}'
  158.                 )
  159.                 self.price = order.executed.price
  160.                 self.comm = order.executed.comm
  161.             else:
  162.                 self.log(f'SELL EXECUTED --- Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}, Commission: {order.executed.comm:.2f}'
  163.                 )
  164.         # report failed order
  165.         elif order.status in [order.Canceled, order.Margin,
  166.                               order.Rejected]:
  167.             self.log('Order Failed')
  168.         # set no pending order
  169.         self.order = None
  170.  
  171.     def notify_trade(self, trade):
  172.         if not trade.isclosed():
  173.             return
  174.         self.log(f'OPERATION RESULT --- Gross: {trade.pnl:.2f}, Net: {trade.pnlcomm:.2f}')
  175.  
  176.     def next_open(self):
  177.         if not self.position:
  178.             if self.data_predicted>0:
  179.                 size = int((self.broker.getcash()/self.datas[0].open)*0.9)
  180.                 self.log(f"BUY CREATED - SIZE: {size}, CASH: {self.broker.getcash():.2f}, Open: {self.data_open[0]}, Close: {self.data_close[0]}")
  181.                 self.buy(size=size)
  182.  
  183.         else:
  184.             if self.data_predicted < 0:
  185.                 self.log(f'SELL CREATED - SIZE: {self.position.size}')
  186.                 self.close()
  187.  
  188. data = SignalData(dataname=price)
  189.  
  190. cerebro = bt.Cerebro(cheat_on_open=True)
  191. cerebro.addstrategy(MLStrategy)
  192. cerebro.adddata(data, name=ticker)
  193. cerebro.broker.setcash(100000.0)
  194. cerebro.broker.setcommission(commission=0.00025)
  195.  
  196. cerebro.addanalyzer(btanalyzers.SharpeRatio, _name='sharpe')
  197. cerebro.addanalyzer(btanalyzers.DrawDown, _name='drawdown')
  198. cerebro.addanalyzer(btanalyzers.Returns, _name='returns')
  199. print('Start Cash: %.2f' % cerebro.broker.getvalue())
  200. back = cerebro.run()
  201. print('Ending Cash: %.2f' % cerebro.broker.getvalue())
  202.  
  203. par_list = [[
  204.     x.analyers.returns.get_analylis()['rtot'],
  205.     x.analyers.returns.get_analylis()['rnorn100'],
  206.     x.analyers.drawdown.get_analylis()['max']['drawndown'],
  207.     x.analyers.sharpe.get_analylis()['sharperatio']
  208. ] for x in back]
  209.  
  210. par_df = pd.DataFrame(par_list, columns = ['Total Return', 'APR', 'Drawdown', 'Sharpe'])
  211. print(par_df)
  212.  
  213. cerebro.plot(style='style')
  214.  
  215. stock.head()
  216. print(stock)
  217. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement