これの続きをやっていく。
how-to-make-stock-trading-system.dogwood008.com
下記を参考に、本当に必要な部分のみを記載して実行してみる。なお、諸般の事情によりGoogle Colabを使用して実行する。
how-to-make-stock-trading-system.dogwood008.com
なお、実行前に予め調整後終値を下記の記事で使用したスクリプトを使って付与し、カラム名を全角文字から半角文字へ変換しておく。
how-to-make-stock-trading-system.dogwood008.com
how-to-make-stock-trading-system.dogwood008.com
以下、1つのコード枠が Jupyter の1つのセルに対応する。
# backtraderのインストール # 頭にエクスクラメーションマークを付けると、シェルで実行できる !pip install backtrader
# 調整後終値を予め付与して、全てカラム名を半角英数に変換し、エクスポートしたCSVを使用する。 path_to_csv = '/content/drive/MyDrive/略/japan-stock-prices-2_2020_9143_adjc.csv' import pandas as pd csv = pd.read_csv(path_to_csv) csv
# 早速、作りかけのパーサを噛ませて、動作を試験する class KabuPlusJPCSVData(bt.feeds.YahooFinanceCSVData): ''' Parses pre-downloaded Yahoo Japan CSV Data Feeds (or locally generated if they comply to the Yahoo format) Specific parameters: - ``dataname``: The filename to parse or a file-like object - ``reverse`` (default: ``True``) It is assumed that locally stored files have already been reversed during the download process - ``adjclose`` (default: ``True``) Whether to use the dividend/split adjusted close and adjust all values according to it. - ``adjvolume`` (default: ``True``) Do also adjust ``volume`` if ``adjclose`` is also ``True`` - ``round`` (default: ``True``) Whether to round the values to a specific number of decimals after having adjusted the close - ``roundvolume`` (default: ``0``) Round the resulting volume to the given number of decimals after having adjusted it - ``decimals`` (default: ``2``) Number of decimals to round to - ``swapcloses`` (default: ``False``) [2018-11-16] It would seem that the order of *close* and *adjusted close* is now fixed. The parameter is retained, in case the need to swap the columns again arose. ''' params = ( ('reverse', True), ('adjclose', True), ('adjvolume', True), ('round', True), ('decimals', 2), ('roundvolume', False), ('swapcloses', False), ) # 未だ途中
import datetime import backtrader as bt if __name__ == '__main__': cerebro = bt.Cerebro() data = KabuPlusJPCSVData( dataname=path_to_csv, fromdate=datetime.datetime(2020, 1, 1), todate=datetime.datetime(2020, 11, 30), reverse=False) cerebro.adddata(data) cerebro.run()
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-4-3050a133376b> in <module>() 12 13 cerebro.adddata(data) ---> 14 cerebro.run() 5 frames /usr/local/lib/python3.6/dist-packages/backtrader/feeds/yahoo.py in _loadline(self, linetokens) 132 self.lines.datetime[0] = dtnum 133 o = float(linetokens[next(i)]) --> 134 h = float(linetokens[next(i)]) 135 l = float(linetokens[next(i)]) 136 c = float(linetokens[next(i)]) ValueError: could not convert string to float: 'SGホールディングス'
どうやら、open
, high
, low
, close
の同定にはカラム名を使用するのではなく、単純に左からN番目という情報しか使っていないようである。
feeds/yahoo.py
の L134で転けているようなので、この辺の処理を含むメソッド丸ごとを、オーバライドすれば良さそうだ。
次回以降はその点を念頭に進めていく。
技術書典10に出展します!是非ご覧ください。