移動平均をボリンジャーバンドに置き換えただけの簡単なプログラムです。
2σの線にタッチしたら売りまたは買いを行います。
ボリンジャーバンドの期間は40日対象は米Yahooとmainの最初で定義しています。
import matplotlib matplotlib.use('Agg') from pyalgotrade import strategy from pyalgotrade import plotter from pyalgotrade.tools import yahoofinance from pyalgotrade.technical import bollinger from pyalgotrade.stratanalyzer import sharpe class BBands(strategy.BacktestingStrategy): def __init__(self, feed, instrument, bBandsPeriod): strategy.BacktestingStrategy.__init__(self, feed) self.__instrument = instrument self.__bbands = bollinger.BollingerBands(feed[instrument].getCloseDataSeries(), bBandsPeriod, 2) def getBollingerBands(self): return self.__bbands def onBars(self, bars): lower = self.__bbands.getLowerBand()[-1] upper = self.__bbands.getUpperBand()[-1] if lower is None: return shares = self.getBroker().getShares(self.__instrument) bar = bars[self.__instrument] if shares == 0 and bar.getClose() < lower: sharesToBuy = int(self.getBroker().getCash(False) / bar.getClose()) self.marketOrder(self.__instrument, sharesToBuy) elif shares > 0 and bar.getClose() > upper: self.marketOrder(self.__instrument, -1*shares) def main(plot): instrument = "yhoo" bBandsPeriod = 40 # Download the bars. feed = yahoofinance.build_feed([instrument], 2011, 2012, ".") strat = BBands(feed, instrument, bBandsPeriod) sharpeRatioAnalyzer = sharpe.SharpeRatio() strat.attachAnalyzer(sharpeRatioAnalyzer) if plot: plt = plotter.StrategyPlotter(strat, True, True, True) plt.getInstrumentSubplot(instrument).addDataSeries("upper", strat.getBollingerBands().getUpperBand()) plt.getInstrumentSubplot(instrument).addDataSeries("middle", strat.getBollingerBands().getMiddleBand()) plt.getInstrumentSubplot(instrument).addDataSeries("lower", strat.getBollingerBands().getLowerBand()) strat.run() print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05) if plot: plt.plot(None,None,"output.png") if __name__ == "__main__": main(True)
実行すると現金不足のエラーが出ます。残金を確認せずに発注しているので仕方ないです。
シャープレシオは0.71をたたき出しました。いいですね。
売りと買いを同時に行っているので往復で稼いでいます。
よく見ると買った瞬間から下がってしまい、売った直後から上がってます。頭としっぽはくれてやれといいますが、ほとんど食われているような。
0 件のコメント:
コメントを投稿