私にとって投資は趣味の一つです.ですので,投資についていろいろ考えたり,実験したりするのは好きなんですね.
しかし,同じことを何回も繰り返すのはめんどくさいと感じてしまいます.特に,「この作業自動化できるやん」って思う作業を手作業でやるのは億劫になります.例えば,ポートフォリオのリバランスとか.
投資信託やETF等を利用して固定比率ポートフォリオを運用している場合,定期的なリバランスが必要になります.この作業って,決まった比率に戻すだけなので作業としては簡単です.ただ,ちょっとした計算が必要であったり,実際にリバランスするのに間隔があいてしまい忘れてしまったりする場合があります.
こんな感じで,レバレッジド・ポートフォリオであるhass LPF-MkII(以下参照)を実運用する際に,ETFの売買やリバランスは自動化して,私は入金だけすれば良いようなことができないか,ということを考えているわけです.
ということで今回は,最終的には自動化を目指して,クラウドベースのトレードプラットフォームである Quantopian (英語サイト)を触って遊んでみました.
コンテンツ
Quantopianとは
Quantopian はクラウドベースのトレーディングプラットフォームで,プログラミング言語のひとつであるPythonを使って取引ロジックを簡単に記述することができます.
主にFXで自動取引する際によく使われている Meta Trader4 (MT4) と比べると,かなり簡単にかけるので,すこし勉強したら誰でもできそうです.
利用できるコードを見る限りは,本来は中短期のトレードをするためのプラットフォームのようですが,もちろん長期取引に使えます.
そんなQuantopianの特徴をまとめるとこんな感じです.
- 作成した取引ロジックを分足レベルでバックテストとフォワードテストが可能
- 他のトレーダーが作成した取引ロジックを見ることができる
- Quantopianで作った取引ロジックをIB証券のリアル口座で利用する方法がある
- Web上で様々なデータを統計処理をして簡単にグラフ化できる
特徴1: 作成した取引ロジックを分足レベルでバックテストとフォワードテストが可能
どうやら2002年からの分足レベルのデータがあるようで,それらのデータを使ったバックテストをすることができます.バックテストでは,売買手数料を考慮できたり,売買銘柄の流動性を反映して売買する銘柄数や買値/売値が都合の悪い方へ動いたり(スリッページ)します.より現実的なバックテストができます.バックテストについては後ほど,例を使った説明します.
さらに,バックテストを行った取引ロジックに対して,実際のリアルタイムな株価推移で取引ロジックでテストするフォワードテストをすることができます.S&P500などをベンチマークにして,アルファやベータ,最大ドローダウンなどの各指標を計測することができます.
特徴2: 他のトレーダーが作成した取引ロジックを見ることができる
「Community -> Forums」では,他のトレーダーが作成した取引ロジックが公開されています.
自分が中短期なトレーディングをしないにしても,そこでの考え方は参考になります.もちろん,自分の作成した取引ロジックを公開することもできます.
特徴3: Quantopianで作った取引ロジックをIB証券のリアル口座で利用する方法がある
Quantopian で作成したコードは,QuantopianとIB証券を統合してリアル口座で実際に取引ができたようです(過去形).どうやら現在は利用できないようです.もしかしたら私の探し方が悪いのかもしれませんが.
これだけだと,「バックテストやフォワードテストができてよかったね」で終わってしまうのでおもしろくありません.
ということで調べると,Quantopianで作成したコードをそのまま使って取引ができるIBridgePyというのをみつけました.後日,実際に使えるかどうかレビューしたいと思います.
特徴4: Web上で様々なデータを統計処理して可視化可能
「Research -> Notebook」では,株価やPERなどのデータを用いて統計的な分析がインタラクティブにできます.Pythonでは統計処理できるライブラリが充実しており,Quantopianでもそのようなライブラリが利用できるようです.
また,「Learn -> Lectures」では,Pythonの使い方から統計処理の方法まで,Quantopianを使うにあたって役立つことを体系的に学べるコンテンツがあります.チュートリアルも含め,コンテンツは充実している印象です.
hass LPF Mk-IIを例にバックテストしてみる
では,実際にQuantopianを利用してバックテストした例をみてみましょう.
私はテクニカルトレードは信用していないので,テクニカルに基づいた売買をするのではなく,ポートフォリオのリバランスなどを自動化するために利用することを考えます.
ということで,hass LPF Mk-IIのバックテストをしてみました.バックテストの条件は次の通りです.
- 期間: 2012/1/1から2017/12/25
- リバランス: 3ヶ月に1回.リバランスをする月の月末に,リバランスを実施する.
- 売買手数料: 一株あたり$0.001で,最低$1 (デフォルト値)
IDE画面
コーディング画面はこんな感じです.画面左側にコードを書いて保存しビルドすると,画面右側で自動で簡単なバックテストが走ります.ちなみに,この画面のバックテストは2017年1月から12月末までの結果です.
実際のコードは以下のとおりです.最低限しか書いていないので,実際に運用する際には,売買コスト最小になるようにリバランスするようにするなど工夫が必要でしょう.
def initialize(context): # UPRO, SVXY, TMF, TLT, BND context.security_list = [sid(38533), sid(41968), sid(38294), sid(23921), sid(33652)] context.pf_weights = [0.35, 0.10, 0.15, 0.25, 0.15] context.rebalance_per = 3 # month context.count_month = 0 # リバランスは月末の取引開始時に行う schedule_function(rebalance, date_rules.month_end(days_offset=0), time_rules.market_open()) schedule_function(initial_order, date_rules.every_day(), time_rules.market_open()) schedule_function(record_vars, date_rules.every_day(), time_rules.market_close()) def initial_order(context, data): for i in range(len(context.security_list)): security = context.security_list[i] if context.portfolio.positions[security].amount == 0: weight = context.pf_weights[i] if data.can_trade(security): order_target_percent(security, weight) def rebalance(context, data): if context.count_month % context.rebalance_per == (context.rebalance_per-1): for i in range(len(context.security_list)): security = context.security_list[i] weight = context.pf_weights[i] if data.can_trade(security): order_target_percent(security, weight) context.count_month += 1 def record_vars(context, data): pf_val = context.portfolio.portfolio_value weights = [] for sym in context.security_list: val = context.portfolio.positions[sym].amount*context.portfolio.positions[sym].last_sale_price weights += [val/pf_val] record(w_upro=weights[0], w_svxy=weights[1], w_tmf=weights[2], w_tlt=weights[3],w_bnd=weights[4])
簡単にこのコードを説明します.
Quantopian では「initialize」のところで,定期的に実施する処理のスケジュールを「schedule_function」で設定します.このコードでは,「rebalance」,「initial_order」,「record_vars」を定期実行するように設定しています.たとえば,9行目では,リバランスをする関数であるrebalanceを月末のマーケットオープン時に実行することを表しています.
rebalance関数では3ヶ月に1度リバランスをするように設定しています.schedule_functionでは最大で月毎の実行までしか設定できません.そのため,それ以上の間隔にするためにちょこっとコードを書いています.
ここで注目すべきなのは「order_target_percent」関数です.これは,指定した銘柄を指定した比率になるように売買する関数です.これで適切に売買してくれます.簡単ですね.
initial_order関数は,ポートフォリオの銘柄の初回購入のためのコードです.初回かどうかは,ポートフォリオに1株以上の株が含まれるかどうかで簡易的に判断しています.
record_vars関数は取引に関する情報を記録するための関数で,今回はポートフォリオの構成比率を毎日の取引後に記録するようにしています.
バックテスト結果
バックテストの結果はこんな感じです.ベンチマークとしてS&P500の結果をのせています.ベータを見る限り,hass LPF Mk-IIはS&P500より気持ち大きいくらいの変動幅でったようですね.
ドローダウンをみると,19%弱とそこそこ大きいですね.でも,損失ではなくて評価益が上下するだけですから,実運用上ではさほど気にならないんじゃないかと思います.もちろん,利益が出ていない運用開始直後に大きく下がるとびっくりするかもしれませんが.
おわりに
今回はクラウドベースのトレーディングプラットフォームであるQuantopianを簡単に紹介しました.
中短期取引をゴリゴリやっていくようなのが本来の使い方でしょうが,長期取引でも使えます.私のように「入金はするからリバランスはいい感じにやっておいてくれ」みたいな人や,ちょっと凝ったリバランスの仕方をする人にとっては使ってみると良いかもしれません.
とはいえ,実際に取引を自動化するまでには,いろいろと超えないといけない問題もあり,現時点では万人におすすめできるようなものではないと思います.
コメント
[…] https://hass104.blog/brief-introduction-quantopian/ […]