プログラミング言語 Python を利用して、自前のアルゴリズムで自動売買をするアプリ開発に取り組んでいます。
楽天証券では、ネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード2 RSS を介して取引をする構成を取っています。
以下は株価・取引に関連する情報の流れを示しています。
RSS によるはじめての発注 [2026-01-27]
売買アルゴリズムがなければ自動売買なんかできないと考え、ひたすらアルゴリズムの開発に精を出してきました。しかし 2026 年になり、そろそろ Python から Excel VBA 経由で発注できることを確認しようと準備を進めてきました。
今回は、ごく簡単な売買テストを実施しました。
- 楽天証券のマーケットスピード2 RSS を利用した、信用建玉の売買および返済をする発注機能を、Python の GUI アプリから制御できることを確認する。
下記の OS 環境で動作確認をしています。
|
Windows 11 Pro | 25H2 |
| Excel | 2024 MSO | |
| Python | 3.13.9 | |
| PySide6 | 6.10.1 | |
| xlwings | 0.33.20 |
テスト用の発注条件は以下のとおりです。
| 対象銘柄 | NTT (9432) |
|---|---|
| 信用区分 | 一般信用(いちにち) |
| 注文数量 | 100 株 |
| 価格区分 | 成行 |
| 制 約 | ナンピン禁止 (GUI) |
Python 側
売買テスト専用に 買建 / 売建 / 返済 ボタンが並んだ簡単な GUI アプリを用意しました。
ボタンはナンピンできないように Enable / Disable されますが、テスト中はそれを解除する必要が出てくることを考慮して、ボタンの状態を初期化する「解除」ボタンも用意しました。
GUI のイベントループに影響しないように、別スレッドを用意して xlwings で Excel VBA とやり取りをするようにしています。
この GUI アプリはほとんどを Linux 上で作成したため、クリックの動作確認を Linux 上でできるような作りになっています。
ログ用
ログを残すために、以下の関数を使用しています。
Excel 側
Excel ファイル名は collector.xlsm です。
RSS の設定はとりあえず下記のようにしました。約定の確認は建玉一覧の情報などから事後に確認する方針です。
シートの構成
このテストで使用するシートは 2 つです。
シート「Positions」には、RSS のワークシート関数 RssMarginPositionList() で信用建玉一覧を表示します。この一覧に建玉を返済するのに必要な情報が記載されます。
シート「Logs」は、本アプリが使用するログを記載するのに利用します。まだ有効に利用できていません。
VBA の設定
VBA で、RSS の VBA 用関数をできるようにするため、Visual Basic Editor の画面上のツールバーから、「ツール(T)」→「参照設定(R)...」で参照設定のダイアログ画面を表示して、□ Marketspeed_Rss_Vba にチェックを入れます。
楽天証券のオンラインヘルプとマニュアル
楽天証券のマーケットスピードのサイトではオンラインヘルプが用意されていて、さらに RSS 関数マニュアルが PDF で公開されています。
マニュアルで引数が「価格」、「数量」などと書かれていれば数値型であると勝手に解釈してしまい、その結果「ByRef 引数の型が一致しません。」のコンパイルエラーに悩まされ続けました。
Visual Basic Editor の画面上のツールバーから、「表示(V)」→「オブジェクトブラウザー(C)」で 'MsRss' のメンバーで利用する VBA 関数をクリックすることで、引数の型を確認することが出来ました。
今回利用する RSS の VBA 関数は、信用売買で建玉の新規売買 RssMarginOpenOrder_V と返済 RssMarginCloseOrder_V の 2 つです。
Function RssMarginOpenOrder_V(OrderId As Long, BrandCode As String, BuySell As String, OrderType As String, SOR As String, MarginType As String, Quantity As String, [PriceType As String], [Price As String], [ExpiryType As String], [ExpiryDate As String], [AccountType As String], [StopTriggerPrice As String], [StopTriggerType As String], [StopPriceType As String], [StopPrice As String], [SetType As String], [SetPriceType As String], [SetPrice As String], [SetExpiryType As String], [SetExpiryDate As String]) As String
Function RssMarginCloseOrder_V(OrderId As Long, BrandCode As String, BuySell As String, OrderType As String, SOR As String, MarginType As String, Quantity As String, [PriceType As String], [Price As String], [ExpiryType As String], [ExpiryDate As String], [AccountType As String], [OpenDate As String], [OpenPrice As String], [OpenMarket As String], [StopTriggerPrice As String], [StopTriggerType As String], [StopPriceType As String], [StopPrice As String]) As String
最初の OrderId(発注ID)が Long 型ですが、他は全て String 型でした。
最低限の注文機能 (Excel VBA)
本番運用にはまだまだ機能不足ですが、かと言って始める前から使わない機能をあれこれ実装するのも無駄なので、売買に必要な最低限の機能に絞りました。
約定確認 [2026-01-28]
Python アプリの 買 建 および 返 済 ボタンのクリック・イベントから xlwings 経由で VBA の関数を実行して、建玉の買建および返済の成行注文ができました。
しかし、成行注文の送信成功を確認しても、その注文が約定されたことの確認にはなりません。
「約定しているはず」でアプリを動かし続けることは避けたいので、約定を確認する処理を追加しました。
- 注文関数の実行を確認後、約定したことを何らかの方法で確認する。
下記の OS 環境で動作確認をしています。
|
Windows 11 Pro | 25H2 |
| Excel | 2024 MSO | |
| Python | 3.13.9 | |
| PySide6 | 6.10.1 | |
| xlwings | 0.33.20 |
テスト用の発注条件は以下のとおりです。
| 対象銘柄 | セブン銀行 (8410) |
|---|---|
| 信用区分 | 一般信用(いちにち) |
| 注文数量 | 100 株 |
| 価格区分 | 成行 |
| 制 約 | ナンピン禁止 (GUI) |
約定を確認するアプローチ
開発中の取引システムは「ナンピン禁止」を前提としています。
「Positions」シートに、RSS のワークシート関数 RssMarginPositionList で信用建玉一覧を表示しています。
取引システム側がナンピン禁止であれば、建玉すればその銘柄コードの行は一覧に追加され、しかも重複した銘柄コードの行は存在しません。一方、建玉を返済すればその銘柄コードの行一覧から削除されます。
すなわち、「建玉後に一覧に追加された」「返済後に一覧から削除された」状態を、約定が反映された結果とみなすことができます。もちろん、発注の瞬間に約定しないので、間をおいて何回か確認するようにします。
全体の流れ(概略)
GUI 側の事情も含めて、全体の流れをまとめると以下のようになります。
- 買建 / 売建 / 返済 ボタン押下
- 買建売建返済 ボタンをロック
- RSS の VBA 関数で注文送信
- 成功/失敗を受け取る
- 成功であれば Positions シートの建玉一覧をチェック
- 反映されるまでリトライ(指定した最大回数まで)
- 成功/失敗に応じて GUI ボタンの状態を更新
- ログ記録・画面更新
Python 側
最初の売買テストに使用した GUI アプリに手を加えました。
GUI の外観に変更はありません。
この GUI アプリはほとんどを Linux 上で作成したため、クリックの動作確認を Linux 上でできるような作りになっています。
Excel 側
前回の VBA コードに IsPositionPresent 関数を加えました。これは、「Positions」シート上に指定銘柄 code の行があれば True、なければ False を返す関数です。
実行結果
下記のように約定の確認ができました。
2026-01-28 12:51:36,700 - INFO - RSSWorker: ClearLogs completed 2026-01-28 12:51:45,749 - INFO - RSSWorker: DoBuy returned True 2026-01-28 12:51:47,752 - INFO - RSSWorker: 約定が反映されました (attempt 1). 2026-01-28 12:51:57,364 - INFO - RSSWorker: DoRepay returned True 2026-01-28 12:51:59,368 - INFO - RSSWorker: 約定が反映されました (attempt 1). 2026-01-28 12:52:07,091 - INFO - RSSWorker: DoSell returned True 2026-01-28 12:52:09,093 - INFO - RSSWorker: 約定が反映されました (attempt 1). 2026-01-28 12:52:19,117 - INFO - RSSWorker: DoRepay returned True 2026-01-28 12:52:21,121 - INFO - RSSWorker: 約定が反映されました (attempt 1).
参考サイト
- マーケットスピード II RSS | 楽天証券のトレーディングツール
- MarketspeedⅡ RSS Excelで自動売買しよう
- PythonでGUIを設計 | Qtの公式Pythonバインディング
- Python in Excel alternative: Open. Self-hosted. No limits.
- Book - xlwings Documentation









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