Python製のディープラーニング用ライブラリが多々ある影響もあってか、最近はPythonに関する記事を目にすることが多くなってきたと感じています。そういった記事を見るなどして、Pythonの勉強を始められた方々に役立つことを目指して、「米国株売買シミュレーションで学ぶPythonプログラミング」という記事を複数回に分けて投稿したいと思います。この連載では売買シミュレーションアプリのコードに沿って、デコレータなどの使い方などを説明していく予定です。
連載の第一回目(この投稿)は、米国株のシミュレーションをするアプリについてざっくりと説明します。なお、当連載ではPythonの基本的な文法を解説しません。Pythonの基礎的なことについては、書籍や別のサイトなどで学習してください。
※当連載で扱うシミュレーションアプリはあくまでも勉強用です。これを使って実際に運用することを想定したものではないのでご注意ください。
※当連載で扱うアプリのソースはGitHub上に公開してあります。 https://github.com/yusukemurayama/ppytrading
環境周り
必要なソフトウェア
当アプリではPythonに加えて、日々の売買情報の保存などでSQLiteを使っています。
実行環境
当アプリはMacで開発しました。また、Windows上でも動作することを確認しています。動作を確認した環境は以下のようになります。
Mac
- OS X El Capitan 10.11.4
- Python 3.5.1
- SQLite 3.8.10.2
Windows
- Windows 8.1
- Python 3.5.1
- SQLite 3.12.2
使うPythonのパッケージ
- SQLAlchemy
- NumPy
SQLAlchemy
O/Rマッパーです。SQLを書かずに、オブジェクトを操作してデータの検索や保存などを実行することができます。
NumPy
多次元の配列や行列を扱えるライブラリです。指標(移動平均線)などの計算に使います。
売買シミュレーションアプリについて
売買シミュレーションで何をするかというと、前もって定めておいたルールで売買した場合に、どの程度の利益・損失が発生したのかを検証します。もちろん未来の動きはわからないので、過去の株価を使って検証します。
なお、売買に用いるルールは、例えば「過去の高値を更新したら買い、購入後に30日経過したら売る」といったものです。ルールにしたがって売買した(できた)と仮定して、規定の期間でどの程度のパフォーマンスだったのかを調べるアプリです。
※あくまでも売買できたと仮定しての結果です。実際には売買できなかった、またはより不利な価格での注文になったというケースも多いかと思われます。また、手数料も考慮していません。
シミュレーションの結果は以下のようにコンソールに表示されます。また、ファイルに詳細な結果を出力することもできるようになっています。
売買シミュレーションの流れ
売買シミュレーションは以下のような流れで進みます。
- データ取り込み(update_data.py)
- 銘柄をフィルタリング(filter_stocks.py)
- 売買シミュレーション実施(backtest.py)
データ取り込み
規定のディレクトリに置かれたCSVファイルを読み込み、DBに過去のデータを書き込みます。書き込むデータは銘柄情報、ファイナンス関係の情報、履歴情報の3つになります。
銘柄はGoogle(Alphabet)やFacebookなどの投資先のマスタです。ファイナンス関連の情報は、年ごとの売上高や純利益などの情報を保存します。履歴情報は、日毎の株価や出来高などのデータを保持します。
銘柄情報とファイナンス関連の情報に関しては更新頻度が低いと思われるので、ある程度の長いスパンで走らせるイメージです。履歴情報に関しては、毎日走らせてデータを取り込んでいくイメージになります。
取り込む対象のCSVについて
当アプリケーションには、取り込む対象のCSV(実際のデータ)を作成する機能を実装していません。その代わりに、取り込み用のサンプルデータを作成する機能(create_samplecsv)を用意してあります。
銘柄をフィルタリング
銘柄数が多いので、すべての銘柄に対してシミュレーションを実施するとかなりの時間がかかってしまいます。それを防ぐために、事前にシミュレーション対象の銘柄を絞り込むようにしています。絞り込む条件は、例えば「過去3年間 純利益が3%増加している」などです。
売買シミュレーション実施
取り込んだ過去のデータと、決めておいたルールに従って、絞りこまれた銘柄に対して売買シミュレーションを実行します。
ディレクトリ構成について
アプリのディレクトリ構成を簡単に説明しておきます。
ppytrading下
ファイル名/ディレクトリ名 | 説明 |
---|---|
data/ | 過去の株価など、DBに取り込むCSVファイルを置くディレクトリです。 |
db.sqlite3 | SQLiteのDBデータです。 |
filters/ | 銘柄をフィルタリングするときのルールを記述した、JSONファイルを置くディレクトリです。 |
manager.py | 各コマンドをキックするスクリプトです。 |
output/ | シミュレーション結果などを出力するディレクトリです。 |
ppyt/ | manager.py以外のソースを置いてあります。 |
requirement | アプリで必要になるパッケージの情報が記述されたファイルです。 |
rules/ | 売買シミュレーションのルールが記述された、JSONファイルを置くディレクトリです。 |
ppyt下
ファイル名/ディレクトリ名 | 説明 |
---|---|
command/ | このディレクトリ内のPythonファイルがコマンドとして実行できます。 |
const.py | 定数を定義したPythonファイルです。 |
decorators.py | デコレータを定義したPythonファイルです。 |
exceptions.py | 例外クラスを定義したPythonファイルです。 |
filters/ | 銘柄の絞り込むで使うロジックを記述した、Pythonファイルを格納したディレクトリです。 |
finder.py | 特定のクラス検索する処理を記述したPythonファイルです。 |
indicators/ | 指標計算用のPythonファイルを格納したディレクトリです。 |
mixins.py | Mixinを定義したPythonファイルです。 |
models/ | 計算用のモデルや、DBのモデルを定義したPythonファイルを格納したディレクトリです。 |
rules/ | 売買シミュレーションのロジックを記述した、Pythonファイルを格納したディレクトリです。 |
trading_manager.py | 売買シミュレーションを実行するPythonファイルです。 |
utils.py | ユーティリティ関数を記述したPythonファイルです。 |
参考書籍
当アプリを作成するにあたって参考にした書籍を紹介します。
MarketHack流 世界一わかりやすい米国式投資の技法
私は米国株のことを全く知らなかったので、まずはこの本を5回くらい読みました。特に、「営業キャッシュフローに注目して投資対象を選別する」あたりが参考になりました。
filter_stocks(シミュレーションをする前に銘柄を絞り込むコマンド)周りは、この本を読まなければ実装できなかったと感じています。
Rubyではじめるシステムトレード
以前、株式投資のシミュレーションソフト(Java)を作ったことがあるのですが、10年近く前なので殆ど覚えていませんでした。そのときの記憶を呼び起こすためにも、1冊本を読んでみました。
この本では「範囲外のデータにアクセスしたときに例外を投げる」など、様々な手法が参考になりました。