6つの構成要素について
- Strategies
- いつ買っていつ売るかの戦略
- Feeds
- 価格データー、例えばカンマ区切りのCSVデータとか
- Brokers
- 売買の実行
- DataSeries
- 時系列データーの取り扱い
- Technicals
- テクニカル指標の計算、移動平均とかRSIとか
- Optimizer
- 複数のコンピューターでバックテストを分散処理するためのクラスセット
実際にやってみましょう。
2000年のOracleの株価をyahoo!(米)financeからダウンロードします。
python -c "from pyalgotrade.tools import yahoofinance; yahoofinance.download_daily_bars('orcl', 2000, 'orcl-2000.csv')"
取得したCSVファイルは以下のようになります。
Date,Open,High,Low,Close,Volume,Adj Close 2000-12-29,30.875,31.3125,28.6875,29.0625,31702200,27.208866 2000-12-28,30.5625,31.625,30.375,31.0625,25053600,29.081304 2000-12-27,30.375,31.0625,29.375,30.6875,26437500,28.730222 2000-12-26,31.50,32.1875,30.00,30.9375,20589500,28.964276 2000-12-22,30.375,31.984381,30.00,31.875,35568200,29.841982 2000-12-21,27.8125,30.25,27.3125,29.50,46719700,27.618462 2000-12-20,28.0625,29.8125,27.50,28.50,54440500,26.682243 2000-12-19,31.8125,33.125,30.125,30.625,58653700,28.671708 2000-12-18,30.00,32.4375,29.9375,32.00,61640100,29.959009 2000-12-15,29.4375,30.078119,28.1875,28.5625,120004000,26.740756
OK! 終値を求めるかんたんなストラテジーを書いてみる。
from pyalgotrade import strategy from pyalgotrade.barfeed import yahoofeed class MyStrategy(strategy.BacktestingStrategy): def __init__(self, feed, instrument): strategy.BacktestingStrategy.__init__(self, feed) self.__instrument = instrument def onBars(self, bars): bar = bars[self.__instrument] self.info(bar.getClose()) # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("orcl", "orcl-2000.csv") # Evaluate the strategy with the feed's bars. myStrategy = MyStrategy(feed, "orcl") myStrategy.run()
このコードでは3つのことをやってます。
- Strategy(戦略)の宣言、唯一のメソッドonBarsの定義、onBarsはFeedの1行ごとに呼び出されます。
- CSVファイルをFeedに読み込みます。
- Feedに対してStrategyを実行します。
それじゃあ、単純移動平均を使った売買ルールをストラテジーに書いてみましょう
from pyalgotrade import strategy from pyalgotrade.barfeed import yahoofeed from pyalgotrade.technical import ma class MyStrategy(strategy.BacktestingStrategy): def __init__(self, feed, instrument): strategy.BacktestingStrategy.__init__(self, feed) # We want a 15 period SMA over the closing prices. self.__sma = ma.SMA(feed[instrument].getCloseDataSeries(), 15) self.__instrument = instrument def onBars(self, bars): bar = bars[self.__instrument] self.info("%s %s" % (bar.getClose(), self.__sma[-1])) # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("orcl", "orcl-2000.csv") # Evaluate the strategy with the feed's bars. myStrategy = MyStrategy(feed, "orcl") myStrategy.run()
変更点は2つ
実行すると終値と単純にどう平均を表示するけど、14日目まではNoneになる。15日いどうへいきんだからデーターがないからね。
- 単純移動平均の初期化を追加
- 終値の表示に単純移動平均株価を追加
実行すると終値と単純にどう平均を表示するけど、14日目まではNoneになる。15日いどうへいきんだからデーターがないからね。
2000-01-03 00:00:00 strategy [INFO] 118.12 None 2000-01-04 00:00:00 strategy [INFO] 107.69 None 2000-01-05 00:00:00 strategy [INFO] 102.0 None 2000-01-06 00:00:00 strategy [INFO] 96.0 None 2000-01-07 00:00:00 strategy [INFO] 103.37 None 2000-01-10 00:00:00 strategy [INFO] 115.75 None 2000-01-11 00:00:00 strategy [INFO] 112.37 None 2000-01-12 00:00:00 strategy [INFO] 105.62 None 2000-01-13 00:00:00 strategy [INFO] 105.06 None 2000-01-14 00:00:00 strategy [INFO] 106.81 None 2000-01-18 00:00:00 strategy [INFO] 111.25 None 2000-01-19 00:00:00 strategy [INFO] 57.13 None 2000-01-20 00:00:00 strategy [INFO] 59.25 None 2000-01-21 00:00:00 strategy [INFO] 59.69 None 2000-01-24 00:00:00 strategy [INFO] 54.19 94.2866666667 2000-01-25 00:00:00 strategy [INFO] 56.44 90.1746666667 . . . 2000-12-27 00:00:00 strategy [INFO] 30.69 29.9866666667 2000-12-28 00:00:00 strategy [INFO] 31.06 30.0446666667
その他すべての指標は計算できないときはNullになる。
連続したデータに対して使うように設計されているため、複数の指標を組み合わせて使うことができる。
例えば、単純移動平均とRSAとか
from pyalgotrade import strategy from pyalgotrade.barfeed import yahoofeed from pyalgotrade.technical import ma from pyalgotrade.technical import rsi class MyStrategy(strategy.BacktestingStrategy): def __init__(self, feed, instrument): strategy.BacktestingStrategy.__init__(self, feed) self.__rsi = rsi.RSI(feed[instrument].getCloseDataSeries(), 14) self.__sma = ma.SMA(self.__rsi, 15) self.__instrument = instrument def onBars(self, bars): bar = bars[self.__instrument] self.info("%s %s %s" % (bar.getClose(), self.__rsi[-1], self.__sma[-1])) # Load the yahoo feed from the CSV file feed = yahoofeed.Feed() feed.addBarsFromCSV("orcl", "orcl-2000.csv") # Evaluate the strategy with the feed's bars. myStrategy = MyStrategy(feed, "orcl") myStrategy.run()実行結果はこうなる
最初の14日RSIはNoneになる
最初の28日間移動平均はNoneになる。なぜなら14日後のRSIの平均をとるためにはさらに15日必要だからね。
2000-01-03 00:00:00 strategy [INFO] 118.12 None None 2000-01-04 00:00:00 strategy [INFO] 107.69 None None 2000-01-05 00:00:00 strategy [INFO] 102.0 None None 2000-01-06 00:00:00 strategy [INFO] 96.0 None None 2000-01-07 00:00:00 strategy [INFO] 103.37 None None 2000-01-10 00:00:00 strategy [INFO] 115.75 None None 2000-01-11 00:00:00 strategy [INFO] 112.37 None None 2000-01-12 00:00:00 strategy [INFO] 105.62 None None 2000-01-13 00:00:00 strategy [INFO] 105.06 None None 2000-01-14 00:00:00 strategy [INFO] 106.81 None None 2000-01-18 00:00:00 strategy [INFO] 111.25 None None 2000-01-19 00:00:00 strategy [INFO] 57.13 None None 2000-01-20 00:00:00 strategy [INFO] 59.25 None None 2000-01-21 00:00:00 strategy [INFO] 59.69 None None 2000-01-24 00:00:00 strategy [INFO] 54.19 23.5673530141 None 2000-01-25 00:00:00 strategy [INFO] 56.44 25.0687519877 None 2000-01-26 00:00:00 strategy [INFO] 55.06 24.7476577095 None 2000-01-27 00:00:00 strategy [INFO] 51.81 23.9690136517 None 2000-01-28 00:00:00 strategy [INFO] 47.38 22.9108539956 None 2000-01-31 00:00:00 strategy [INFO] 49.95 24.980004823 None 2000-02-01 00:00:00 strategy [INFO] 54.0 28.2484181864 None 2000-02-02 00:00:00 strategy [INFO] 54.31 28.505177315 None 2000-02-03 00:00:00 strategy [INFO] 56.69 30.5596770599 None 2000-02-04 00:00:00 strategy [INFO] 57.81 31.5564353751 None 2000-02-07 00:00:00 strategy [INFO] 59.94 33.5111056589 None 2000-02-08 00:00:00 strategy [INFO] 59.56 33.3282358994 None 2000-02-09 00:00:00 strategy [INFO] 59.94 33.7177605915 None 2000-02-10 00:00:00 strategy [INFO] 62.31 36.2205441255 None 2000-02-11 00:00:00 strategy [INFO] 59.69 34.6623493641 29.0368892505 2000-02-14 00:00:00 strategy [INFO] 62.19 37.4284445543 29.9609620198 . . . 2000-12-27 00:00:00 strategy [INFO] 30.69 51.3196802735 49.8506368511 2000-12-28 00:00:00 strategy [INFO] 31.06 52.1646203455 49.997518354 2000-12-29 00:00:00 strategy [INFO] 29.06 47.3776678335 50.0790646925