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

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

backtrader の最初の一歩

f:id:dogwood008:20201023005656j:plain
Photo by Pixabay from Pexels

昨日の振り返りと今日やること

how-to-make-stock-trading-system.dogwood008.com

昨日は Dockerfile 内で pipenv sync を呼ぶ事で、固定したバージョンで backtrader をインストールした。今日は backtrader の最初のサンプルを実行する。

メインの Python スクリプトを作成する

まずは、backtrader の Docs にある、 Basic Setup から、ソースをコピーしてくる。下記を main.py という名前で保存しておく。

なお、先頭の2行分は、 Python 2 で実行した時用なので、今回は必要1ない。

# 以下引用: mementum, "Quickstart Guide - Backtrader", 
# "https://www.backtrader.com/docu/quickstart/quickstart/#basic-setup", 
# アクセス日:2020年10月23日, コメント部は著者による

from __future__ import (absolute_import, division, print_function,    # ←この行は要らない
                        unicode_literals)  # ←この行は要らない

import backtrader as bt

if __name__ == '__main__':
    cerebro = bt.Cerebro()

    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

    cerebro.run()

    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

Dockerfile の修正

次に、 main.py を Docker から見えるようにする2

昨日の記事では ADD 命令をしようしたが、脚注にも書いたとおりADD 命令より COPY 命令の方が好ましいので、それに書き換えた上で最後にも命令を追加する。

FROM python:3.8.6
LABEL maintainer="dogwood008"
ARG workdir=/app

RUN mkdir $workdir
WORKDIR $workdir
COPY Pipfile $workdir  # ← ADD から COPY へ変更
COPY Pipfile.lock $workdir  # ← ADD から COPY へ変更
COPY main.py $workdir    # ←追加

RUN pip install --upgrade pip && \
    pip install pipenv && \
    pipenv sync

CMD ["pipenv", "run", "python", "main.py"]      # ←追加

Makefile の修正とビルド

次に、 Makefile (便利スクリプト)も書き換えておこう。

build:
  docker build -t dogwood008/backtrader .

run:
  docker run --rm -it dogwood008/backtrader bash

up:    # ←追加
  docker run --rm -it dogwood008/backtrader    # ←追加

この状態で make build を実行すると、前回と同じようにイメージがビルドされる。

$ make build
docker build -t dogwood008/backtrader .
[+] Building 1.9s (12/12) FINISHED
 => [internal] load build definition from Dockerfile                                           0.0s
 => => transferring dockerfile: 342B                                                           0.0s
 => [internal] load .dockerignore                                                              0.0s
 => => transferring context: 2B                                                                0.0s
 => [internal] load metadata for docker.io/library/python:3.8.6                                1.9s
 => [1/7] FROM docker.io/library/python:3.8.6@sha256:0d3333986c2684c699fefa9f39767bd185980ac6  0.0s
 => [internal] load build context                                                              0.0s
 => => transferring context: 88B                                                               0.0s
 => CACHED [2/7] RUN mkdir /app                                                                0.0s
 => CACHED [3/7] WORKDIR /app                                                                  0.0s
 => CACHED [4/7] COPY Pipfile /app                                                             0.0s
 => CACHED [5/7] COPY Pipfile.lock /app                                                        0.0s
 => CACHED [6/7] COPY main.py /app                                                             0.0s
 => CACHED [7/7] RUN pip install --upgrade pip &&     pip install pipenv &&     pipenv sync    0.0s
 => exporting to image                                                                         0.0s
 => => exporting layers                                                                        0.0s
 => => writing image sha256:c2bcf0dd34712bc0283434e12cc38818fbf61fba8479241c95511fad3d4d11fb   0.0s
 => => naming to docker.io/dogwood008/backtrader

実行

昨日は make run で実行したが、今日は make up で実行する。違いはコマンドの最後に bash が入っていない点である。これにより、 DockerfileCMD 命令で指定した命令が自動的に実行される。

$ make up
docker run --rm -it dogwood008/backtrader
Starting Portfolio Value: 10000.00
Final Portfolio Value: 10000.00

Portfolio Value が表示されたらOKだ。自動的に実行が終了し、コンテナからも抜けるようになった。これで最初の一歩が終わり!


  1. 今回は Python 3.8 系を使用している。

  2. 後日別の記事で書くが、少なくとも開発時に於いては、このやり方はスクリプトの中身を書き換える度にビルドが必要であり不便である。発展課題としては Volume を マウントするのが良いだろう。今日の記事ではスキップする。

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