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

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

Dockerfileの作成:バックテスト環境の構築

Docker
Docker

docker と docker-compose

※TODO

docker のインストール

※TODO

docker-compose のインストール

※TODO

はじめの一歩:Python3の実行 in Docker コンテナ

開発環境と本番環境をできるだけ近い状態にするため、またプログラムの作成時期によって結果が変わることをできるだけ減らすため、 Docker を用いてコンテナで開発を進めることにする。

まずは、下記のファイルを Dockerfile という名前で作成する。

FROM python:3.8.6
LABEL maintainer="dogwood008"

なお、 LABEL は動作に影響を及ぼさないので、各自自分の情報に書き換えて欲しい。

次に、下記のコマンドで、ビルド(今回は実質的にはイメージをプルだけに留まる)する。

# イメージのビルド
stock-trading-system$ docker build -t backtrader .

これを行うと、インターネット上から予めインストールを済ませたLinux環境をダウンロードすることができる。今回の場合は、Pythonのバージョン 3.8.6 を使えるように、セットアップ済みの環境(Dockerイメージ)をダウンロードしてくる。

次に、下記のコマンド1を入力2すると、イメージからコンテナを作成し、bashのターミナルにログインできる。この時、 -t backtrader のオプションで指定している backtrader はタグと呼ばれる識別子である。イメージを作成する際と、イメージからコンテナを作成する際、どのイメージかを識別するために用いられる。別の名前に変えても良いが、その際は当然、 docker run する際にも同じタグを使用しなければならない。

# イメージからコンテナの作成と実行
stock-trading-system$ docker run --rm -i -t backtrader bash

試しに、 python と入力し Enter キーを押すと、Pythonのインタラクティブシェルが立ち上がる。 1+1 と入力すると、結果として 2 が表示されるし、 'a' + 'b' と入力すると、文字結合結果の ab が表示される。

# bashでログインし、Python のインタラクティブシェルを起動する
root@8396150c6d3d:/# 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.
>>> 1+1
2
>>> 'a' + 'b'
'ab'

さて、次回は Pipenv によるバージョン固定機能を使いつつ、 backtrader をインストールしていく。

セキュリティについて

今回、bashでログインした際、表示されるプロンプトが root@ce2bceed647a:/# のように root であることに気付いた人もいると思う。開発時はひとまず動けば良い、というスタンスのプロジェクトやチームならこれでも良いが、個人的にはあまり勧めない。root でのコンテナの実行には下記のようなリスクがあるようだ。本番稼働させる際には、特に注意されたい。

unit42.paloaltonetworks.jp

blog.trendmicro.co.jp

なお、Docker には、 Rootless モードというものも用意されているので、合わせて参考にしたい。

docs.docker.jp


  1. --rm は、実行完了後にコンテナを削除するオプション。これを付けないと終了後のコンテナが増えていくので、ストレージを圧迫していく。ただし、付けると当然だが終了後のコンテナからデータを取り出せなくなるが、この問題は docker-compose を使用したときのボリュームのマウントによって解決する。今は詳細の説明を省く。

  2. 説明のために -i-t を分離したが、 $ docker run --rm -it backtrader bash でも問題ない。こちらの方がややタイプ数が少なくなる。

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