PyAlgoTradeの日本語解説ブログ

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

2015年9月23日水曜日

PyAlgoTrade データ取得方法を見直して任意のデータを扱えるようにする

以前に米Yahoo!に頼らない方法としてjsmを使って日本のYahoo!から取得する方法を紹介した。


日本の時系列株価データーがほしい時にはjsmを使う
http://pyalgotradejp.blogspot.jp/2015/09/jsm.html

手元に蓄積したデータがあってそれを使いたい場合は、feedにCSVファイルを読み込むことができる。

まずはフィードにCSVから読み込む改造
9997は証券コードだが、別に何でもいい。test.csvからデータをフィードに取り込んでいる。

ポイントは3つ from pyalgotrade.barfeed import csvfeed
feed = csvfeed.GenericBarFeed(bar.Frequency.DAY)
feed.addBarsFromCSV("9997","test.csv")
あとはいつもと変わらない。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import matplotlib 
matplotlib.use('Agg')
from pyalgotrade import plotter
from pyalgotrade.technical import highlow
from pyalgotrade import strategy
from pyalgotrade import bar
from pyalgotrade.barfeed import csvfeed
from pyalgotrade.technical import cross


class MyStrategy(strategy.BacktestingStrategy):
    def __init__(self, feed, instrument):
        strategy.BacktestingStrategy.__init__(self, feed)
        self.__prices = feed[instrument].getPriceDataSeries()
        self.__high = highlow.High(feed[instrument].getCloseDataSeries(),10)
        self.__low = highlow.Low(feed[instrument].getCloseDataSeries(),10)
        self.__instrument = instrument

    def onBars(self, bars):
        bar = bars[self.__instrument]
        self.info("%f Hi:%s Lo:%s" % (self.__prices[-1],self.__high[-1],self.__low[-1]))


# Load the Local feed from the CSV file
feed = csvfeed.GenericBarFeed(bar.Frequency.DAY)
feed.addBarsFromCSV("9997","test.csv")

# Evaluate the strategy with the feed's bars.
myStrategy = MyStrategy(feed, "9997")

plt = plotter.StrategyPlotter(myStrategy, True, True, True)
myStrategy.run()
plt.plot(None,None,"output.png")



データベースから直接読み取りたいところであるが、サポートしていないようだ。
仕方ないので、データベースからcsvで書き出すプログラムを書いた。「それSQLでできるよ」なのだが、指定のヘッダーが必ず必要なのでどうせならとpythonで書いてしまった。


#/usr/bin/python

import MySQLdb
from MySQLdb.cursors import DictCursor

import sys

argvs = sys.argv
argc = len(argvs)
if(argc != 2):
 print "usage: # python %s code" % argvs[0]
 quit()
code=argvs[1]

connection = MySQLdb.connect(db="stock",user="stock")

cursor = connection.cursor()

cursor.execute("select * from bulk_data where code=%s order by reg_date",(code,))
result=cursor.fetchall()

print "Date Time,Open,High,Low,Close,Volume"
for row in result:
 print("%s 15:00:00,%d,%d,%d,%d,%d" % (row[0],row[2],row[3],row[4],row[5],row[6]))

cursor.close()
connection.close()

ぶっちゃけシェルスクリプトで書くこともできるが、あえてpythonで書く。というのも、調整終値の欄がないからだ。
 分割などでいきなり株価が半分になっているのを権利落ち修正しないとデーターの連続性がなくなってしまう。データーがないのであればいっそ切り捨てたほうがいい。というような処理をしたいときに困るだろうという配慮だ。
 ちなみに、この銘柄は2014年1月に分割している


0 件のコメント:

コメントを投稿