楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で動作する マーケットスピード II RSS を利用した Python アプリ (Kabuto) を開発しています。
デイトレ用自作アプリ Kabuto
以下は株価・取引に関連する情報の流れを示しています。
楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、RSS を介して取引をする構成を取っています。
バックテストを実施する体制を構築中
| 対象銘柄 | ソフトバンクグループ (9984) | |
|---|---|---|
| ティック | 2 秒間隔 | |
| 注文数量 | 100 株 | |
| 制 約 | ナンピン禁止 | |
| モ デ ル | MA1 - VWAP のクロス・シグナルによる単純売買 | |
| パラメータ | ||
| PERIOD_WARMUP | 150 | |
| PERIOD_MA_1 | 30 | |
| PERIOD_RSI | 150 | |
| LOSSCUT_1 | -10 | |
| N_MINUS_MAX | 300 | |
| DD_PROFIT | 50 | |
| DD_RATIO | 0.9 | |
当初はエントリをプログラムに任せるのはちょっと怖いな、と思っていたので、自動で損切りする機能を強化して、手動でエントリ、自動または手動でエグジットするセミオートからアプリの運用を始めました。
セミオートで確認できたことは以下のとおりです。
- 売買、返済ボタンをクリックすれば成行売買ができる
- ロスカットやトレーリング・ストップによる利確が設定どおり機能する
- 複数銘柄での取引
ここで思い知ったことは、自ら定めたルールを平気で破ってしまう自分の性格によって、手動エントリでは無駄な資金の損失を重ねてしまうだろうということでした。
自動で妥当なエントリができる機能を探索する時期と考えて、週の途中から実際の取引を中断し、自動売買を実現するための条件探しのためにバックテスト中心の活動へ切り替えました。
ルールに従ったプログラムによる自動取引でも収益を上げられなければ、それは単にそのルールがヘボだったということでまだ諦めがつきます。
現在、MA1 と VWAP のクロス・シグナルでエントリするように機能を追加して評価を始めています。ただ、過去のティックデータを利用して Kabuto のデバッグモードでシミュレーションをする場合、100msec 間隔でタイマーを回しているので、2 秒間隔のティックデータであれば 20 倍速になりますが、それでも取引時間全部で 20 分程度かかってしまいます。色々な条件で多くの過去データを試すには、時間がかかりすぎます。
そこで、GUI を使わずにコンソール上だけでシミュレーションを実行できる、Kayaba というバックテスト専用の CLI アプリを開発しています。パラメータの設定を組み合わせて DOE(実験計画)を組んで網羅的なバックテストをできるように準備をしています。
デイトレ用取引アプリの構成概略 ─ Kabuto 0.7
- アプリ開発の目的
- 自作したアプリを使って好きなようにデイ・トレードをしたい。
- しかし、感情に簡単に左右される自分がトレーダーの達人にはとてもなれそうにはないし、その気もない。
- そうであれば、アルゴリズム的なアプローチで自動売買することを目指したい。
- まずはセミオートから始め、バックテストを重ねて自動売買ができるようにしたい。
- セミオードでの動作確認を終えて、オートで稼働できるようにバックテストを実施できる体制を整備しています。
- 最終的には強化学習モデル[候補]による自動売買システムの実現を目標にしています。
- 本システムは MIT License のオープンソースとして Github 上に公開していますが、自分が納得できるまでは、ドキュメンテーションなど、他人が理解でき、使いやすいようにするためのサポートは一切おこないません。
- 何時になるか判りませんが、バージョン 1.0.0 のリリース直前になったら、ドキュメンテーション整備を始めます。
- 現在のペースだと、ドキュメンテーションの整備はバージョンが 0.90.0 になってからになりそうです。
- マーケットスピードⅡ RSS / Excel とのやりとり
- 複数銘柄(20 銘柄程度)のティックデータを収集
- 4 本足データは収集していません。
- 素人考えかもしれませんが、ティックデータを取得できるのに、デイトレでわざわざ四本足データでローソク足チャートを作るはもったいないと考えています。
- アプリが取得する情報は、(原則)時刻、株価と出来高のみ
- ティックデータの取得頻度は、マーケットスピードⅡ RSS のデフォルトの更新頻度の 2 秒
- 収集したティックデータは、銘柄コードをシート名にした新規 Excel ブック (.xlsx) に自動保存
- 発注の約定確認は、Python と Excel VBA とで最低限のやり取りをしています。
- 信用建玉発注・返済(成行注文)
- 取引対象の銘柄は、ティックデータを収集する銘柄の中から選択
- 複数銘柄はタブで切り替えて表示。取引対象の銘柄数に上限を設定していないが、とりあえず 3 銘柄までは問題なく表示できるように、本番環境のターゲット CPU (Intel N150) の負荷を考慮して設計
- Excel 側に、RSS の VBA 関数で発注・約定確認をするユーザー VBA 関数を実装
- Python 側からVBA 関数を実行。
- 含み益の情報は Excel から取得せず、アプリ内部で見込み額を算出
- RSS と本アプリの xlwings が同一の Excel シートへアクセスするため、一定頻度で COM の衝突が発生します。
- 衝突による例外発生時にリトライ回数を設定してはいますが、Excel とのやり取りを必要最低限に抑えようとしています。
- 現在のところ、建玉発注時の建玉価格や返済価格の情報すらアプリ側で取得していません。機を見て約定価格を取得するように改善する予定です。
- 株価チャート
- テクニカル指標
- MA1(短周期 n=30 の移動平均)
- VWAP(バンドの追加を検討中)
- RSI
- Momentum を評価中
- 株価トレンド
- 最新株価の点
- 短周期移動平均線 MA1 と 売買高加重平均価格 VWAP のトレンド線
- MA1 と VWAP がクロスしたタイミングの縦線
- 直近のゴールデン・クロスとデッド・クロスを色を変えて表示
- 一般の取引ツールと異なり、当日の取引時間幅に固定したチャート
- デイトレは取引時間内の値動きに集中したいので、どうしてもこのようなチャートにしたかった。
- 売買ロジックの構成
- Gymnasium を利用した環境クラス
- Maskable PPO 互換のインターフェイスを備えた自作アルゴリズムの疑似モデル
- 疑似モデルのクラス AlgoTrade は、importlib.import_module でロードしてインスタンスを生成
- 将来的には複数の AlgoTrade から選択できるようにするため。
- 自動エントリ
- MA1 と VWAP のクロス・シグナルによる自動エントリ
- 買 建 と 売 建 ボタンをクリックして手動でエントリも可能
- クリック可能なボタンの制御は、ナンピンができないロジックになっている。
- 寄り付き後、設定期間(デフォルトは 150 step = 300 秒)は売買ボタンをロックして売買禁止。
- 自動エグジット
- 移動平均線がクロスしたタイミングで建玉があれば返済
- ただし、ゴールデン・クロス時に買建、デッド・クロス時に売建の建玉を持っている場合は返済しない。
- トレーリングストップによる利確
- ドローダウンとドローダウン比率を設定して運用
- トレーリングストップは、含み損益 \(profit\) が 最大含み益 \(profit_{max}\) からどれだけ落ちたら利確するかを決める仕組みです。
-
\[ \text{drawdown} = profit_{max} - profit \]
-
\[ \text{drawdown_ratio} = \frac{drawdown}{profit_{max}} \]
- トレーリングストップのアルゴリズムがシンプル過ぎると感じているので、含み益に応じて多段に設定することを検討中です。
- 含み損がしきい値(マイナス側)を超えればロスカット
- 含み損が連続して設定回数を超えればロスカット
- 建玉があるときに 返 済 ボタンをクリックすれば手動で返済(エグジット)することも可能
参考サイト
- マーケットスピード II RSS | 楽天証券のトレーディングツール
- マーケットスピード II RSS 関数マニュアル
- 注文 | マーケットスピード II RSS オンラインヘルプ | 楽天証券のトレーディングツール
- PythonでGUIを設計 | Qtの公式Pythonバインディング
- Python in Excel alternative: Open. Self-hosted. No limits.
- Book - xlwings Documentation



0 件のコメント:
コメントを投稿