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

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

Pipenv を使って backtrader をインストールする:イメージのビルドの段階でインストール編

これまでの振り返り

昨日はコンテナの中でインストールしたが、今度はその操作を Dockerfile に書き込むことで、自動化する。

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

今日の完成形

GitHubにも本日の状態を再現した状態でアップロードしてあるので、参考にしてほしい。

github.com

昨日作ったファイル

下記の2つのファイル Pipfile Pipfile.lock が、昨日作成したファイルである。未だ作っていない人は、下記をコピーしてもOKである(その場合、コマンド部1は除いてほしい)。

root@8e82ce23f287:/# cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
backtrader = "*"

[requires]
python_version = "3.8"
root@8e82ce23f287:/# cat Pipfile.lock
{
    "_meta": {
        "hash": {
            "sha256": "62f2c898940a09cc88c8fc42c85e52c3526c851c12517325c638b20dfa1be2ab"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.8"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "backtrader": {
            "hashes": [
                "sha256:0dc8912a98352b75122f8d7084bc63ee47f61c2a1d16f506d4d82aee3941297a"
            ],
            "index": "pypi",
            "version": "==1.9.76.123"
        }
    },
    "develop": {}
}

Dockerfile の修正

次に、 Dockerfile を次のように修正する。イメージに Pipfile Pipfile.lock を追加して、それを読み込みながら環境(固定したバージョンがインストールされた状態)を再現する操作 pipenv sync 2を記述することが目的である。

ADD 命令は、イメージをビルドする際に指定したファイルをDocker から見えるようにするコマンドである。今回は PipfilePipfile.lock を見えるようにするために、イメージに追加する。似た命令に、 COPY 命令3がある。

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

RUN mkdir $workdir
WORKDIR $workdir
ADD Pipfile $workdir  # ←イメージに Pipfile を追加する
ADD Pipfile.lock $workdir  # ←イメージに Pipfile.lock を追加する

RUN pip install --upgrade pip && \
    pip install pipenv && \
    pipenv sync    # ←Pipfile.lock を読み込み、固定したバージョンを再現する

イメージのビルド

次に、 make build 4 で、イメージをビルドする。

$ make build
docker build -t dogwood008/backtrader .
[+] Building 19.6s (11/11) FINISHED
 => [internal] load .dockerignore                                                              0.1s
 => => transferring context: 2B                                                                0.0s
 => [internal] load build definition from Dockerfile                                           0.2s
 => => transferring dockerfile: 315B                                                           0.1s
 => [internal] load metadata for docker.io/library/python:3.8.6                                2.4s
 => [internal] load build context                                                              0.0s
 => => transferring context: 61B                                                               0.0s
 => [1/6] FROM docker.io/library/python:3.8.6@sha256:0d3333986c2684c699fefa9f39767bd185980ac6  0.0s
 => CACHED [2/6] RUN mkdir /app                                                                0.0s
 => CACHED [3/6] WORKDIR /app                                                                  0.0s
 => CACHED [4/6] ADD Pipfile /app                                                              0.0s
 => CACHED [5/6] ADD Pipfile.lock /app                                                         0.0s
 => [6/6] RUN pip install --upgrade pip &&     pip install pipenv &&     pipenv sync          15.7s
 => exporting to image                                                                         1.3s
 => => exporting layers                                                                        1.3s
 => => writing image sha256:324eda94515de559ac34a897b159f6c7b875c1c96072feb0f61e3f689d845cc9   0.0s
 => => naming to docker.io/dogwood008/backtrader

動作確認

無事ビルドできたら、試しに実行してみる。

$ make run
docker run --rm -it dogwood008/backtrader bash
root@1dcdc85f7015:/app#

コンテナには入れたら、さらに続けて pipenv run python で、本体とライブラリのバージョンを固定した Python を起動する。 import backtrader と入力し、エラーが表示されなかったら、正常に backtrader のインストールが完了している。

root@1dcdc85f7015:/app# pipenv run python
Python 3.8.6 (default, Oct 13 2020, 20:37:26)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import backtrader
>>>         # ←「>>>」のみが表示されればOK

これで backtrader を使える状態が整った。次は backtrader の Quickstart Guide を見ながら、実際に backtrader を動かしてみよう。


  1. root@ ~~~ cat Pipfile の部分。

  2. pipenv sync だと Pipenv.lock のバージョンから完全一致で再現してくれる。
    一方、 pipenv install だと、 Pipenv を満たす条件でインストールするので、 Pipenv でメジャーバージョンの固定を行っていないと、勝手にその時の最新版をインストールしようとするので、本当は固定しておいた方が驚きが少なくて済む。今回は手間省略のために特に指定しなかった。

  3. Docker のベストプラクティスによると、 ADD より COPY が望ましいようである。 ADDtar ファイルの展開やリモートURLからのダウンロードに対応しているが、 COPY はそうではないようだ。別の記事で修正したい。

  4. 過去の記事Makefile を作っているため、このコマンドで実行できる。作っていない場合でも、 docker build -t タグ名 . でビルドできる。

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