日本株のバックテスト用データはどうしていますか。
いろんな銘柄でバックテストしたいと思うのですが、これまでなかなかいいデータが見つかりませんでした。
- 日足用
- 全銘柄
- 修正株価
このあたりの要件を満たすデータを探していたら、やっと見つかりました。Stooqのデータです。
APIで一つの銘柄のデータを取得する方法はよく紹介されていますが、今回は一度で全銘柄のデータを取得する方法です。
実はこのStooqは時系列データをここで公開しています。
JapanのASCIIデータ(200MBくらい)を選択すると、画面に表示される文字列を入力するウィンドウがでます。正しく入力できると、ダウンロードできるようになります。
今回は日々自動でデータを取得することが目的ではないので、問題なしです。
これだけではただのデータ紹介になるので、ZIPデータを開いてbacktesting.pyでグラフ化します。
まずデータをpandasで読み込む関数を作ります。backtesting.pyに渡せるように、カラム名を変えています。
import zipfile
from pathlib import Path
import pandas as pd
def read_data(price_path):
stooq_zip = Path('d_jp_txt.zip')
use_cols = {
'<DATE>': 'Date',
'<OPEN>': 'Open',
'<HIGH>': 'High',
'<LOW>': 'Low',
'<CLOSE>': 'Close',
'<VOL>': 'Volume',
}
with zipfile.ZipFile(stooq_zip) as zip_dir:
with zip_dir.open(price_path) as f:
data = pd.read_csv(f, usecols=use_cols.keys())
data['<DATE>'] = pd.to_datetime(data['<DATE>'], format='%Y%m%d')
data = data.rename(columns=use_cols)
data = data.set_index('Date')
return data
ZIP内でデータは株価、ETF、指標のデータなどがフォルダーで分けられており、株価は更に1と2のフォルダーに分けられています。
以下の例ではトヨタ自動車の株価を取得します。
トヨタ自動車(7203)は2のフォルダーに入っていますが、ZIP内でのパスをハードコードします。
株価を取得したら、backtesting.pyのクラスに渡してグラフ化します。
from backtesting import Strategy, Backtest
class MyStrategy(Strategy):
def init(self):
pass
def next(self):
pass
def main():
price_path = rf'data/daily/jp/tse stocks/2/7203.jp.txt'
toyota = read_data(price_path=price_path)
bt = Backtest(toyota, MyStrategy)
bt.run()
bt.plot()
if __name__ == '__main__':
main()
1999年4月からのデータが入っているようですね。
これでシストレの練習が捗りそうです。