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

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

Pipenvのインストール:Pipenvによるパッケージのバージョン固定

Pipenv
Pipenv

リポジトリの紹介

今回の作業内容について、下記のリポジトリで差分を見ることができる。

github.com

Pipenvの紹介

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

昨日は、Docker で Python 3 を動かすところまでやった。今日は、 Python のライブラリである backtrader をインストールするために Pipenv というバージョンを固定するためのライブラリをインストールする。

日本語版: pipenv-ja.readthedocs.io 英語最新版: pipenv.pypa.io

これを使うと、PipfilePipfile.lock という2つのファイル1で、ライブラリと Python 本体のバージョンを固定してくれる。さらにはバージョンのみならず、ハッシュ値も記録してくれるので、例えば PyPI2ではなく git を通じて取得したライブラリも、しっかりと固定してくれる。

これにより、開発環境はもとより、本番環境でも自動的に固定したバージョンのライブラリをダウンロードしてきてくれる。ただ、 Docker の文脈だと、本番環境特有のバグや、バージョン不一致等を避けるために、開発環境も本番環境も同じイメージを使うのが望ましい3という狙いがある。したがって、この場合はどちらかという冪等性4を保てるという意味に於いて、バージョン固定の意義が大きい。

便利スクリプトの作成

その前に、便利スクリプトを作っておこう。これから何回も使用するので、タイプ数を減らす目的である5。なお、作らなくても問題ない。

下記の dogwood008 の部分は、自分のIDやニックネーム等、好きなものに変更してほしい。

# Makefile
build:
  docker build -t dogwood008/backtrader .

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

これをmac, Linuxの人は Makefile という名前で保存する。Windows の人はやや長くなるので、最後に書く。

Dockerfile を修正する

まず、昨日作った Dockerfile を、下記のように変更する。なお、 Makefile と同様、 maintainer の部分も好きに変えてほしい。

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

RUN mkdir $workdir
WORKDIR $workdir

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

Dockerfile を使った、イメージのビルド

次に、この Dockerfile をビルドしよう。 Makefile を作ったので、 make build でビルドできる。作っていない人は、コマンド docker build -t dogwood008/backtrader . をそのまま入力すれば良い(最後のピリオドを忘れないように)。

そうすると、下記のような出力が表示される。 Successfully built と表示されればOKだ。

$ make build
docker build -t backtrader .
Sending build context to Docker daemon  152.1kB
Step 1/8 : FROM python:3.8.6
 ---> a52c041f5098
Step 2/8 : LABEL maintainer "dogwood008+stock-trading-system@example.com"
 ---> Running in d0832df533b2
Removing intermediate container d0832df533b2
 ---> 3a9495df3959
Step 3/8 : ARG workdir=/app
 ---> Running in 40e89d02d76e
Removing intermediate container 40e89d02d76e
 ---> 8588c1675a64
Step 4/8 : RUN mkdir $workdir
 ---> Running in 43b166c04830
Removing intermediate container 43b166c04830
 ---> c82c123c0bd1
Step 5/8 : WORKDIR $workdir
 ---> Running in 72d852d8e7ae
Removing intermediate container 72d852d8e7ae
 ---> 6eb637219842
Step 6/8 : ADD Pipfile $workdir
 ---> edd28b96ca89
Step 7/8 : ADD Pipfile.lock $workdir
 ---> e08c91d623c5
Step 8/8 : RUN pip install --upgrade pip &&     pip install pipenv
 ---> Running in 93e3c7cd5e63
Collecting pip
  Downloading pip-20.2.4-py2.py3-none-any.whl (1.5 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.2.3
    Uninstalling pip-20.2.3:
      Successfully uninstalled pip-20.2.3
Successfully installed pip-20.2.4
Collecting pipenv
  Downloading pipenv-2020.8.13-py2.py3-none-any.whl (3.9 MB)
Collecting virtualenv
  Downloading virtualenv-20.0.35-py2.py3-none-any.whl (4.9 MB)
Collecting virtualenv-clone>=0.2.5
  Downloading virtualenv_clone-0.5.4-py2.py3-none-any.whl (6.6 kB)
Requirement already satisfied: setuptools>=36.2.1 in /usr/local/lib/python3.8/site-packages (from pipenv) (50.3.0)
Requirement already satisfied: pip>=18.0 in /usr/local/lib/python3.8/site-packages (from pipenv) (20.2.4)
Collecting certifi
  Downloading certifi-2020.6.20-py2.py3-none-any.whl (156 kB)
Collecting filelock<4,>=3.0.0
  Downloading filelock-3.0.12-py3-none-any.whl (7.6 kB)
Collecting distlib<1,>=0.3.1
  Downloading distlib-0.3.1-py2.py3-none-any.whl (335 kB)
Collecting appdirs<2,>=1.4.3
  Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
Collecting six<2,>=1.9.0
  Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: filelock, distlib, appdirs, six, virtualenv, virtualenv-clone, certifi, pipenv
Successfully installed appdirs-1.4.4 certifi-2020.6.20 distlib-0.3.1 filelock-3.0.12 pipenv-2020.8.13 six-1.15.0 virtualenv-20.0.35 virtualenv-clone-0.5.4
Removing intermediate container 93e3c7cd5e63
 ---> 4c92855b6b6d
Successfully built 4c92855b6b6d
Successfully tagged doogwood008/backtrader:latest

これで Pipenv のインストールは完了である。次回は、 Pipenv を使用して、ライブラリ backtrader をインストールする。

Windows の人向け

Windows の人は、それぞれの docker ~ の行でファイルを分けて、 build.batrun.bat にして、中身を下記の通りにすると動くんじゃないかと思う(未検証)。この場合、 make ~~~ ではなく、bat ファイルを直接実行することになるだろう。

# build.bat
docker build -t dogwood008/backtrader .
# run.bat
docker run --rm -it dogwood008/backtrader bash

しかし、素直に VirtualBox + Vagrant の構成にしてしまうか、WSL 2 を導入するのが、躓きが少なくなると思う6

参考記事: qiita.com note.com


  1. Node.js でいうところの package.jsonpackage-lock.json 、 Ruby で言うところの GemfileGemfile.lock である。

  2. Node.js でいうところの npm 、Ruby でいうところの RubyGems である。

  3. これを実現させるために、同じイメージからコンテナを作成し、コンテナを実行するときに環境変数で動作を変えるようにすることが多い。

  4. 冪等性(べきとうせい; idempotency, idempotence)とは、(特にコンピュータ科学の文脈に於いては)何度実行しても同じ結果を出力することを言う。このために、状態によって振る舞いが変わるような部分の排除が必要になったりする。 Docker の文脈でいうと、「開発用マシンでも本番用マシンでも、どんな環境にイメージを持っていっても(だいたい)ビルドして同じ引数を与えてやれば同じ動作をする」ということを実現させるために冪等性が必要、という意味で語られることが多いように思う。

  5. なお、後日の記事で書くが、この便利スクリプトは更に docker-compose によって置き換えられる。

  6. てっきり、Win 10 Homeだと Hyper-V が載ってないので、使えないと思い込んでいたが、 Hyper-Vはいらないらしい。最近知った。

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