LoginSignup
3
4

More than 1 year has passed since last update.

日本株のバックテスト用データ取得

Last updated at Posted at 2022-11-26

日本株のバックテスト用データはどうしていますか。
いろんな銘柄でバックテストしたいと思うのですが、これまでなかなかいいデータが見つかりませんでした。

  • 日足用
  • 全銘柄
  • 修正株価

このあたりの要件を満たすデータを探していたら、やっと見つかりました。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()

7203.png

1999年4月からのデータが入っているようですね。
これでシストレの練習が捗りそうです。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4