前回の振り返り
前回はグラフに単純移動平均のグラフを追加した。
how-to-make-stock-trading-system.dogwood008.com
how-to-make-stock-trading-system.dogwood008.com
今回の内容
Jupyter Notebook を導入する。今までよりも変更しやすく、結果を見やすくする目的である。
主に backtrader.Strategy
を継承したクラスのパラメータやロジック等を試行錯誤で変更し、その実行結果を素早く得る目的で導入した。
解説
全ての変更差分は下記の通り。
いつもは修正差分だけを取りあげるが、今回は修正範囲が大きいたため、差分の表示ではなく変更後のファイルを解説する。
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 が表示される。
この状態で、画面右側にある New
→ Python3
を選択すると新規に Jupyter Notebook ファイルを作成できる。
作成した新規ファイルに main.py
の中身を移植すると、下図のようになる。
Cell
→ Run All
をクリックすると、各セルのコードを実行できる。
実行すると下記のようになる。これで今までより試行錯誤をやりやすくなった。