株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

Backtrader で KABU+ のデータを読めるようにする その2

これの続きをやっていく。

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

japan-stock-prices-2_2020_9143_adjc.csv
japan-stock-prices-2_2020_9143_adjc.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に出展します!是非ご覧ください。

techbookfest.org

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.