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

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

Jupyter Notebookの導入 ◆ Backtrader 最初の戦略その7

Jupyter
Jupyter

前回の振り返り

前回はグラフに単純移動平均のグラフを追加した。

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

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

今回の内容

Jupyter Notebook を導入する。今までよりも変更しやすく、結果を見やすくする目的である。

主に backtrader.Strategy を継承したクラスのパラメータやロジック等を試行錯誤で変更し、その実行結果を素早く得る目的で導入した。

解説

全ての変更差分は下記の通り。

github.com

いつもは修正差分だけを取りあげるが、今回は修正範囲が大きいたため、差分の表示ではなく変更後のファイルを解説する。

Dockerfile

FROM jupyter/scipy-notebook:42f4c82a07ff  # ベースイメージをscipyが載ったJupyter Notebookに変更
LABEL maintainer="dogwood008"
ARG workdir=/home/jovyan/work       # ワーキングディレクトリを上記イメージに合わせ変更
ARG btrepodir=/opt/backtrader
ARG tmpdir=/tmp

EXPOSE 8888  # 8888番ポートを開放

ENV TZ=Asia/Tokyo

USER root            # rootでの実行は必要最小限に留める
RUN git clone https://github.com/mementum/backtrader.git $btrepodir && \
     chown -R jovyan $btrepodir

USER jovyan        # 使用するイメージで生成される一般権限ユーザを使用する

WORKDIR $tmpdir
COPY Pipfile $tmpdir
COPY Pipfile.lock $tmpdir

RUN pip install --upgrade pip && \
    pip install pipenv && \
    pipenv install --system --ignore-pipfile --python=$(conda run which python) --site-packages      # --site-packages を付けることで、Anacondaがインストールしたパッケージを再利用できる
WORKDIR $workdir

# Run Jupyter
CMD ["start-notebook.sh"]  # start-notebook.sh にはベースイメージでPATHを通してある

# When Run backtest
# CMD ["pipenv", "run", "python", "main.py"]

docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    volumes:
      - .:/home/jovyan/work  # コンテナ内のワーキングディレクトリを変更
    ports:
      - '8888:8888'  # `Dockerのホスト側ポート` : `ゲストコンテナ側ポート` のバインドを行う

Pipfile

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
backtrader = {editable = true, ref = "patch-1", git = "https://github.com/Larry-u/backtrader.git"}  # masterに取り込まれていない変更を適用するため。現在の masterでは matplotlib > 3.2.2 の時動かない。
matplotlib = "*"   # ベースイメージでAnacondaがインストールしたパッケージを再利用する都合上、バージョンを固定しない
backtrader-plotting = "*"

[dev-packages]
jupyter = "*"
jupyterthemes = "*"

[requires]
python_version = "3.8"

特に、 PIpfile では Git を使って GitHub から直接パッケージを取得する用に変更した点に注意。このPRが master にマージされたら、 backtrader = "*" に戻す。

実行

いつものように、 docker-compose up で実行できる。

$ docker-compose up
Starting stock-trading-system_app_1 ... done
Attaching to stock-trading-system_app_1
app_1  | Executing the command: jupyter notebook
app_1  | [I 00:03:33.820 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.8/site-packages/jupyterlab
app_1  | [I 00:03:33.820 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
app_1  | [I 00:03:33.826 NotebookApp] Serving notebooks from local directory: /home/jovyan/work
app_1  | [I 00:03:33.826 NotebookApp] Jupyter Notebook 6.1.4 is running at:
app_1  | [I 00:03:33.826 NotebookApp] http://235401d65ca4:8888/?token=451(中略)c319
app_1  | [I 00:03:33.826 NotebookApp]  or http://127.0.0.1:8888/?token=451(中略)c319
app_1  | [I 00:03:33.826 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
app_1  | [C 00:03:33.833 NotebookApp]
app_1  |
app_1  |     To access the notebook, open this file in a browser:
app_1  |         file:///home/jovyan/.local/share/jupyter/runtime/nbserver-6-open.html
app_1  |     Or copy and paste one of these URLs:
app_1  |         http://235401d65ca4:8888/?token=451(中略)c319
app_1  |      or http://127.0.0.1:8888/?token=451(中略)c319

実行すると、最後の行に http://127.0.0.1:8888/?token=(トークン) と表示されるので、このURLにアクセスすると Jupyter Notebook が表示される。

ファイル一覧
ファイル一覧

この状態で、画面右側にある NewPython3 を選択すると新規に Jupyter Notebook ファイルを作成できる。

Python 3を選択
Python 3を選択

作成した新規ファイルに main.py の中身を移植すると、下図のようになる。

main.pyの中身をコピペで移植
main.pyの中身をコピペで移植

CellRun All をクリックすると、各セルのコードを実行できる。

Cell → Run All
CellRun All

実行すると下記のようになる。これで今までより試行錯誤をやりやすくなった。

実行結果
実行結果

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