PyAlgoTradeの日本語解説ブログ

PyAlgoTrade の勝手に日本語解説ブログ。日本語の内容に関して保証はいたしておりません。必ず本家のサイトをご確認ください。

2015年9月23日水曜日

PyAlgoTrade の plot機能でグラフを書く

今までガン無視してきたplotについて、まとめて取り上げます。

グラフを書くにはplt クラスを定義して、strategyをrunした後にplotします。
stategyを実行した後にまとめてグラフ関係を処理したいのですが、必ず間に挟まないとダメみたいです。その割にはOnBarsで計算した値を先に指定するとか、よくよく考えれば順番がおかしい気がしますが、動いているからいいのです。

この間のvwapを使ったサンプルを改造してテストします。
出力するグラフは4枚、

まず
plotter.StrategyPlotter(strat, arg1, arg2, arg3)

arg1 値動きと取引に関するグラフのON/OFF
arg2 Buy-Sellマークを付ける
arg3 ポートフォリオのグラフのON/OFF

ある程度を組み合わせたものを下のプログラムに書きました。


import matplotlib 
matplotlib.use('Agg')
from pyalgotrade import strategy
from pyalgotrade import plotter
from pyalgotrade.tools import yahoofinance
from pyalgotrade.technical import vwap
from pyalgotrade.stratanalyzer import sharpe
import numpy as np

class VWAPMomentum(strategy.BacktestingStrategy):
    def __init__(self, feed, instrument, vwapWindowSize, threshold):
        strategy.BacktestingStrategy.__init__(self, feed)
        self.__instrument = instrument
        self.__vwap = vwap.VWAP(feed[instrument], vwapWindowSize)
        self.__threshold = threshold
        self.__price= feed[instrument].getPriceDataSeries()
        self.__delta= []
        self.__notional=[]

    def getVWAP(self):
        return self.__vwap

    def getDelta(self):
        return self.__delta

    def getNotional(self):
        return self.__notional

    def onBars(self, bars):
        vwap = self.__vwap[-1]
        if vwap is None:
            return
        price = self.__price[-1]
        shares = self.getBroker().getShares(self.__instrument)
        #price = bars[self.__instrument].getClose()
        notional = shares * price
        self.__delta.append(price-vwap)
        self.__notional.append(notional)
        if price > vwap * (1 + self.__threshold) and notional < 1000000:
            self.marketOrder(self.__instrument, 100)
        elif price < vwap * (1 - self.__threshold) and notional > 0:
            self.marketOrder(self.__instrument, -100)


def main():
    instrument = "aapl"
    vwapWindowSize = 25
    threshold = 0.01

    # Download the bars.
    feed = yahoofinance.build_feed([instrument], 2011, 2012, ".")

    strat = VWAPMomentum(feed, instrument, vwapWindowSize, threshold)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)

    plt = plotter.StrategyPlotter(strat, True, True, True) #standard use
    plt.getInstrumentSubplot(instrument).addDataSeries("vwap", strat.getVWAP()) #Add VWAP Line

    plt2 = plotter.StrategyPlotter(strat, True, True, False) # without portfolio
    plt3 = plotter.StrategyPlotter(strat, False, True, True) #portfolio only

    plt4 = plotter.StrategyPlotter(strat, True, True, False) #Optional Graph
    plt4.getOrCreateSubplot("delta").addDataSeries("price-vwap", strat.getDelta())
    plt4.getOrCreateSubplot("notional").addDataSeries("notional", strat.getNotional())
    plt4.getOrCreateSubplot("notional").addLine("limit", 1000000)
    
    strat.run()
 
    plt.plot(None,None,"output.png")
    plt2.plot(None,None,"output2.png")
    plt3.plot(None,None,"output3.png")
    plt4.plot(None,None,"output4.png")

if __name__ == "__main__":
    main()


出力されるのは以下のグラフです。
output.png

output2.png

output3.png

output4.png
出力サイズは決まっているみたいなので、拡大したければ不要なグラフを削るしかなさそうです。
4番目のグラフは指標ではなくデバッグで作ってみました。
価格とVWAPを引いた値、価格と出来高をかけたnotionalの値をプロットして、意図したタイミングで売買がされているかを確認するためのものです。

0 件のコメント:

コメントを投稿