working4coins

Bitcoin - MA cross over strategy - daily - mtgoxBTCUSD

May 12th, 2013
1,296
0
Never
13
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.15 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import pytz
  5. from collections import OrderedDict
  6. import pandas as pd
  7. import numpy as np
  8. import matplotlib.pyplot as plt
  9. from zipline.algorithm import TradingAlgorithm
  10. from zipline.transforms import MovingAverage, batch_transform
  11. from zipline.utils.factory import load_from_yahoo
  12.  
  13. class DualMovingAverage(TradingAlgorithm):
  14.     """Dual Moving Average Crossover algorithm.
  15.  
  16.    This algorithm buys btc once its short moving average crosses
  17.    its long moving average (indicating upwards momentum) and sells
  18.    its shares once the averages cross again (indicating downwards
  19.    momentum).
  20.  
  21.    """
  22.     def initialize(self):
  23.         # Add 2 mavg transforms, one with a long window, one
  24.         # with a short window.
  25.         self.add_transform(MovingAverage, 'short_mavg', ['price'],
  26.                            window_length=10)
  27.  
  28.         self.add_transform(MovingAverage, 'long_mavg', ['price'],
  29.                            window_length=20)
  30.        
  31.         # To keep track of whether we invested in the stock or not
  32.         self.invested = False
  33.        
  34.         self.short_mavg = []
  35.         self.long_mavg = []
  36.         self.buy_orders = []
  37.         self.sell_orders = []
  38.  
  39.     def handle_data(self, data):
  40.         if (data['BTC'].short_mavg['price'] > data['BTC'].long_mavg['price']) and not self.invested:
  41.             self.order('BTC', 200)
  42.             self.invested = True
  43.             self.buy_orders.append(data['BTC'].datetime)
  44.             print "{dt}: Buying 100 BTC shares.".format(dt=data['BTC'].datetime)
  45.         elif (data['BTC'].short_mavg['price'] < data['BTC'].long_mavg['price']) and self.invested:
  46.             self.order('BTC', -200)
  47.             self.invested = False
  48.             self.sell_orders.append(data['BTC'].datetime)
  49.             print "{dt}: Selling 100 BTC shares.".format(dt=data['BTC'].datetime)
  50.        
  51.         # Save mavgs for later analysis.
  52.         self.short_mavg.append(data['BTC'].short_mavg['price'])
  53.         self.long_mavg.append(data['BTC'].long_mavg['price'])
  54.  
  55.  
  56. def rename_col(df):
  57.     df = df.rename(columns={'Weighted Price': 'price',
  58.                             'High':'high',
  59.                             'Low':'low',
  60.                             'Open':'open',
  61.                             'Close':'close',
  62.                             'Volume (BTC)':'volume',
  63.                             'Volume (Currency)':'volume_usd'
  64.                            })
  65.     df = df.fillna(method='ffill')
  66.     #df = df[['price', 'sid']]    
  67.     return df
  68.  
  69.  
  70. def display_dataframe(df):
  71.     print(df.head())
  72.     print(df)
  73.     print(df.tail())
  74.  
  75. if __name__ == '__main__':    
  76.     data = OrderedDict()
  77.     #data['BTC'] = pd.DataFrame.from_csv('http://www.quandl.com/api/v1/datasets/BITCOIN/MTGOXUSD.csv?trim_start=2012-01-01&sort_order=desc')
  78.     #data['BTC'] = pd.DataFrame.from_csv('http://www.quandl.com/api/v1/datasets/BITCOIN/MTGOXUSD.csv?trim_start=2012-01-01&sort_order=desc')
  79.     data['BTC'] = pd.DataFrame.from_csv('MTGOXUSD.csv')
  80.     data['BTC'] = data['BTC'].tz_localize(pytz.utc)
  81.  
  82.     data['BTC'] = rename_col(data['BTC'])
  83.    
  84.     data = pd.DataFrame({key: d['price'] for key, d in data.iteritems()})
  85.    
  86.     print("="*10 + " Display price " + "="*10)
  87.     data.plot()
  88.     plt.show()
  89.    
  90.     #print(data)
  91.     #display_dataframe(data['BTC'])
  92.  
  93.     print("="*10 + " Running strategy " + "="*10)
  94.     dma = DualMovingAverage()
  95.     results = dma.run(data)
  96.  
  97.     print("="*10 + " Display results " + "="*10)
  98.  
  99.     dma.short_mavg.append(0)
  100.     dma.short_mavg.append(0)
  101.     dma.long_mavg.append(0)
  102.     dma.long_mavg.append(0)
  103.     print len(dma.long_mavg)
  104.     print len(dma.short_mavg)
  105.     print len(data['BTC'])
  106.  
  107.     ax1 = plt.subplot(211)
  108.     data['short'] = dma.short_mavg
  109.     data['long'] = dma.long_mavg
  110.     data[['BTC', 'short', 'long']].plot(ax=ax1)
  111.     plt.plot(dma.buy_orders, data['short'].ix[dma.buy_orders], '^', c='m', markersize=10, label='buy')
  112.     plt.plot(dma.sell_orders, data['short'].ix[dma.sell_orders], 'v', c='k', markersize=10, label='sell')
  113.     plt.legend(loc=0)
  114.  
  115.     ax2 = plt.subplot(212)
  116.     results.portfolio_value.plot(ax=ax2)
  117.  
  118.     plt.show()
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment