PyAlgoTradeの日本語解説ブログ

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

2015年9月22日火曜日

PyAlgoTrade サンプルの動作を調べる VWAPを使った売買

リファレンスマニュアルを淡々と読んでいると眠くなってくるので、一足飛びにサンプルを見てみる。
題材としてはVWAPを使ったApple株の取りひき。Appleなんて適当に買っても利益が出そうだ。
20年前の俺にあったらひとこと言いたい「ゴミくずとか言わないでAppleかっとけ」
いや、後悔先に立たずなので未来に向かって分析をしようか。

もともとのサンプルはXindows環境でプロットするが、SSHでリモートログインしているので画面がテキストしかない。 よって、ファイルに吐き出してみた。 もちろん、事前にplot関巣の改造は必要だ。以下を参照のこと
  PyAlgoTradeが出力するグラフの出力先を変更したい


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


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

    def getVWAP(self):
        return self.__vwap

    def onBars(self, bars):
        vwap = self.__vwap[-1]
        if vwap is None:
            return

        shares = self.getBroker().getShares(self.__instrument)
        price = bars[self.__instrument].getClose()
        notional = shares * price

        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(plot):
    instrument = "aapl"
    vwapWindowSize = 5
    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)

    if plot:
        plt = plotter.StrategyPlotter(strat, True, False, True)
        plt.getInstrumentSubplot(instrument).addDataSeries("vwap", strat.getVWAP())

    strat.run()
    print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05)

    if plot:
        plt.plot(None,None,"output.png")

if __name__ == "__main__":
    main(True)

出力結果は以下の通り。はい。儲かりました。
 

さて、お分かりだと思いますがVWAPの復習です。


VWAPの重要な3つの機能
VWAPの重要な機能として、以下の3点があると言えます。
  • 市場参加者の強気・弱気を判断する
  • 抵抗線、支持線として機能する
  • ファンド(正確には証券会社)などが買いを入れる(VWAP取引)基準として使用する
1 市場参加者の強気・弱気を判断する
ちなみに株価がVWAPを上回っている状態では、今日買った人全員の損益を合計したらプラスで、逆に株価がVWAPを下回っている場合はマイナスだ、ということがわかります。つまり、株価がVWAPを上回っている時には、短期的には強含みでその後も買い目線が続くだろうと判断できるわけです。逆に下回る時なんかは弱含みとなり、買いの手は控えようと考える投資家がおおくなるため、軟調に推移することが多くなります。
2 抵抗線、支持線として機能する
また、VWAPには抵抗・支持というその先の付近に株価が近づくと跳ね返されるという機能があります。
当然VWAPを見てトレードをしている人がおおく、VWAPトレーダーと呼ばれる「VWAPに近づくと買いを入れる」トレーダーも多く存在するため(後述)、その付近ではいったん株価は反発することになります。
そのことを知っておけば、移動平均線やトレンドラインにもう1つ抵抗・支持の役割をもつ指標を自分のトレードの手法の一つとして持っておくことができますよね。
3 ファンド(正確には証券会社)などが買いを入れる(VWAP取引)基準として使用する
ファンドや投資家などが市場で買いを入れると、多量の注文の場合はマーケットインパクトが大きくなって市場に混乱をきたします。そのため、そのような大口の注文は証券会社などによって上手に捌いてもらう必要が有るのです。
そしてそのために使用されるのがこれまで説明してきたVWAPであり、このような取引をVWAP取引といいます。
投資の教科書より


改めてプログラムを見直していきます。
 vwap.VWAP(feed[instrument], vwapWindowSize) でvwapを計算します。ウィンドウサイズを5にしています。
 肝心の売買はonBarsです。 価格がvwap*(1+調整分)より高かったら100買います。価格がvwap*(1-調整分)低かったら100売ります。調整分がついているのはわずかな変動は無視するためでしょう。notional という出来高*価格という指標がついているのですが意味は分かりません。
調整分は0.01にしています。
買えるだけ買って売れるだけ売るので、現金不足や株不足が起きます。
その時は以下のようなメッセージが出ます。
2012-01-25 00:00:00 broker.backtesting [DEBUG] Not enough cash to fill aapl order [190] for 100 share/s


売買ロボットの評価については利回りだけでなくシャープレシオというものを使う。 sharpeRatioAnalyzer.getSharpeRatio(0.05)の0.05が無リスクのときの利回り。

そもそもシャープレシオって何だ?これだ

 [AllAbout]シャープレシオは投資の効率性を示す指標

0 件のコメント:

コメントを投稿