pythonVBA投資楽天RSS2機械学習金策

楽天RSS2(マーケットスピード2 RSS)をエクセルで利用する

python
スポンサーリンク

twitter見てて気づいたが、ごく最近リリースされた模様

 株取引をシステム化したく、いろいろ構成を考えていたが、ちょうどいいタイミングでリリースされていた。
 自動売買まで行える模様。最高か?売買タイミングでメール通知程度を考えていたが、自動売買までが一気にめどがついた。
 楽天RSS2でうれしいのがティックが取得できることで、分析データの収集がだいぶ楽。最大300ぽいので、取引量の多いものはザラ場も動かすほかない。取りこぼしをいかになくすかが難しそうではある。ただ、そこまで資金量が多いわけでもないし、小さめのフィールドで戦う分にはもっと単純な手法で強力に利用できる感が強い。
 ただ、個人ですらここまでのツールが手に入るとなると、ツールを利用した売買をいかに狩るかであり、それに耐えうるシステムを個人で作れるのかは謎。地道に利用していく。ただ、VBAでなくてもいいのでは?楽天証券利用者の何%がこれ使いこなせるのだろうか?

構成

判定部分はこのVBAでもいいが、より性能を向上したく、pythonを利用したい。データ量によってはデータベースとの連携も考えたい。せっかくaccese買ったし勉強がてら作成してみる。
ひとまずExcelがないとはじまらない。

環境構築(エクセルでサンプルシートを利用するまで)

 本家サイトのご利用までの準備サンプルシートダウンロードを行って、好きなサンプルシート (今回は国内株-先物OP発注サンプルシート)を利用する。ご利用までの準備は少しわかりにくいが手順ごとにリンクがあり、そこに詳細が書いてある。
 エクセルにアドインの登録が必要で、VBAを使っていないとかなりとっつきにくいが、説明ページにさえたどり着ければ割と詳細に記載してある。
 サンプルシートだけでもいろんな関数が盛り込まれていて、発注(つまり売買の命令)もできる模様。ただ、これだけでは自動売買に思いのほか遠い。そもそも用意されたサンプルシートから自動売買は無理で、VBAを使用してプログラムを作成する必要がある。天下一武道会をみるヤムチャ視点どころか一般人視点になる人も多そう。ひとまずマーケットスピード2にログイン状態でサンプルシートを開けば勝手に動作するはず。サンプルシートでは銘柄コード部分がまず重要で、そこにコードを入れればそれに応じて全体がその銘柄コードの情報で上書きされるつくりになっている。銘柄情報等の取得に関してはなんとなく理解できるかとは思う。
 しっかり理解しようと思うと関数の意味が全く分かっていなかったがよくよく見たら一覧表があった。少しずつ読み解いていこう。

関数一覧表を読み解く

 ぱっと見には長いこと書いてあってふむふむわからんとなるが、よく読むと関数は4ページと5ページに記載があるもののみで多くない。株式の現物に限れば4ページで使うのはNo.1,5のみだ。こう見ればそこまで複雑に考えることはない。人にもよると思うが5ページで私が重視したい情報は保有銘柄と最良買気配値と最良売気配値くらいで、自動売買を考慮するとその関連のいくつかも(余力、注文状況、発注ID等)考慮する必要はあるが、まず必要なのは4ページNo.1(現物注文を出す関数)No.5(現物注文を取り消す関数)5ページRssMarket(最良買気配値と最良売気配値)のみになる。

自動売買への課題と解決策

 一番の課題は発注がVBA関数の為、VBAでプログラムを作成しない限りサンプルシートをどれだけこねくり回しても自動売買にならない点にある。サンプルシートを利用するだけでは劣化マーケットスピードのため、まずはここを作成する。

VBAによる指値注文

ご注意:①ここで記載したコードによるいかなる損失も補償できません。利用の際は自己責任で使用してください。②指値買い注文を行うため、不要な注文の場合、注文取消しを行うことを忘れないようお願いします。
VBAから買い注文を行うには関数:RssStockOrder_vを利用する。相当回数躓いたが、注文を出すことができた。

とりあえず注文発注できた

RssStockOrder_vにはNo.2発注トリガーを除く19の引数があるが、
買いの指値注文するだけのコードが以下になる。(上のキャプチャではソフトバンクですが、下記コードでは万が一の誤発注の際でもお安いランドにしています)ひとまず注文するだけなので関数に値を直打ちしていますが、実運用時は変数にして使用する必要があります。

'ここで記載したコードによるいかなる損失も補償できません。利用の際は自己責任で使用してください。
'発注に成功した場合、不要な注文であれば注文取り消しを忘れないようにしてください
Sub Stock_Purchase_Order()
Dim ret
    ret = RssStockOrder_v(1, "8918.T", "3", "0", "0", "100", "1", "2", "1", , 0)
    
    Debug.Print ret
    
End Sub
引数No内容説明
1ID上記コードでは1を指定(1回使用ごとに別のIDを使用する必要がある2,3…と変更(インクリメントする必要あり)
2銘柄コード“銘柄コード.市場”の形式で入力。上記コードでは8918.T(ランド(東証))を指定
3売買区分“1”だと売り、”3″だと買い。上記コードでは”3″(買い)を指定
4注文区分0だと通常注文。
5SOR区分0だと通常注文、1だとSOR注文。上記コードでは0(通常注文)を指定
6注文数量注文株数。上記コードでは100を指定
7価格区分0だと成行、1だと指値。上記コードでは1(指値)を指定
8注文価格注文価格を指定。上記コードでは2(2円)を指定
9執行条件執行条件を指定。上記コードでは1(本日中)を指定
10注文期限執行条件が5(期間指定)の場合必要。今回は不要の為ブランク
11口座区分0が特定口座、1が一般口座、2がNISA口座。上記コードでは特定口座を指定

発注までで引っかかったところ

実は発注までに相当回数引っかかっており、VBAに慣れていない人であれば心おられそうなレベル。VBAのイミディエイトウィンドウより関数の戻り値のエラーを確認し、内容に従い対応する。
VBAからエラーコードが出なくなっても確定で発注成功しているわけではなく、RssOrderIDlistを使用して状況を確認し、対応する必要がある。

VBAのデバッグ画面。苦戦した姿がうかがえる
エクセル上の発注リスト。苦戦した姿がうかがえる

①VBAのエラー(SubまたはFunctionが定義されていません)

コードを入力してもこういう表示が出てくる場合、参照設定で楽天RSSが登録されていない可能性があるので、登録する。

ツール→参照設定を選択する
Marketspped2 Rss Vbaにチェックを入れてOKする

②発注ロック中(発注を行うには発注機能を有効にしてください)

初回だと何の話かと思うが、エクセル側で発注ロックがかかっている。マーケットスピードⅡタブをクリックし、発注不可→発注可にしておく

発注不可を発注可にしておく

注文ID=1 は既に使用済みです。

1度注文を行うと注文IDはエクセルを再起動するまで使用状態となる。注文を投げるたびにIDを変更する必要がある。無難なのは2,3,4…と1づつ加算していくようにする。

注文は1(売り)か3(買い)で指定してください

自動取引にした際に引っかかった。3を指定しているつもりなのでかなり悩んだ。結果としてVBAでは整数型からstr()で文字列型に変換すると” 3″のようにスペースが入るため、それで”3″or”1″と一致せず楽天RSS側からこのエラーを突き付けられた模様。投げる段階で”3″を指定するようにした。

マーケットスピードⅡへ注文を投げた時のエラー

上記までのエラーに対応して処理すれば、ここ以降は RssStockOrder_v の戻り値でエラーは出ない。 注文一覧に注文がなければ、RssOrderIDlistを使用し状況を確認し、対応する必要がある。

エクセル上の発注リスト。どこかのセルに= RssOrderIDlist と記載するとそれ以下の行に使用した発注1Dの処理結果をリストで返してくれる

①エラー[RSS発注機能を利用する場合、マーケットスピード IIの環境設定「注文・約定2」の取引暗証番号を設定してください。]

マーケットスピードⅡを操作必要がある。設定画面で

設定画面をクリック
赤枠のところを適切に設定する

エラー[各種設定にて、発注上限金額を設定してください。]

マーケットスピードⅡ側と見せかけてエクセル側。1回の発注金額上限が0円になっているため、これを適切な金額に指定する。また自動売買においては確認画面の項目にチェックが入っているとオーダーを投げた際に確認画面が表示されてしまうため、チェックを外しておく必要がある。

というわけで稼げるものが作りたい

結局何がしたいかってもちろん勝手にお金を増やしてくれるツールの作成である。勝手にお金を減らすツールの作成ではない。ひとまず、仕様を考えてみた。

要求事項No概要詳細、懸念点
発注、取り消しを自動で行う発注時にIDをインクリメントするのと、現在のポジション、注文を把握する必要がある。
アイスバーグ的な手法で購入する。先に板に出すよりさらに有利なはず。また、小刻みに購入することで、安く、
小口に見せかけての購入が可能。ひとまずは指定した価格まで来たら指値を出す程度でOK
時間軸の概念を持ち、注文取消しやポジション処理を行う。逆張りであれば時間による処理も必要な気がする(特に注文状態のもの)。
予想と違い、上昇していないものは処分する
買いと売りで1日100万円以内の取引量とする一日定額の範囲で取引を行う。小ロットの為、手数料がすさまじい重みになりかねない。
一日の取引量を記録する必要がある。
ひとまず最低ロットでの取引を行う。ロット上げたいところだが、まずは動作確認のため最小ロットで。銘柄の最小ロットを把握する必要がある。
購入、損きり、利益確定ラインを自動で算出する何らかのアルゴリズムに沿って取引を行う。コア中のコア。なくてもよいのでは?人力アルゴリズム(売り買いの値段を自分で入力)でもいいかも

まずは本当に簡単な自動取引ツールを作成する

 取引したい銘柄について買いの値段と売りの値段を決めておき、売りと買いを行う。一日の取引量は一定額までとする。
 さすがに注文関数だけでなく、投資情報関数も必要となる。びっくりしたのがRssMarketが値を全然表示してくれないと思っていたら、取得項目側に入れるのはNoでなく取得項目そのものの為、私の場合、”最良売気配値”とか “最良買気配値” と入れるのが正しい。

ひとまず作成

 スナイパー注文と何が違うんだという出来だが、とりあえずできた。自動売買もできるはずだが、場が開いている間は仕事の為、動作確認ができないので徐々に動かしていくしかない(オーダーを投げ続けるバグが怖いため)

とんでもないトラップ

 次元の違うぶっちぎり一位のトラップがあった。別で記事を書くくらいに悩んでいたものがここでも発生した。

通常、メインルーチンを定期的に処理したい場合、waitかsleepを使う、もしくは指定時間まで待つループを作るような手法があると思います。私はNowを利用してこんな感じで作っていた。

oldtime=Now()
Do
	doevents
	If oldtime + TimeValue("00:00:02") <= Now() Then
		'定期的な処理をここへ書く
		oldtime=Now()
	Endif
Loop

 これをやると速攻でエクセルのセル上の楽天RSS関数の処理が止まる。そのため、個別銘柄の気配値取得を定周期ごとに行っていたが、一見正常に動いているように見えたが、ずっと同じ値段のためおかしいなと思っていたが、もちろん現実の銘柄は値が変化しており、私のエクセル上だけのバグだった。
 どうやらVBA側で処理を持ち続けるとダメな模様。つまりApplication.Ontimeを使う必要がある。(他の方法あったら教えてください。)

Application.Ontime を使って一定周期で処理を行う

 最高にとっつきにくいのが再帰的に呼び出す必要がある点である。競技プログラミングで曲がりなりにも再帰を勉強した甲斐があったというものであるw(ここで生きるとはw)楽天はいったい誰にこのシステムを使わせたいのだろうか?

Sub main_start()
'スタート用。これをまず呼ぶ
'イニシャル処理等はこっちで行う
'↓メインを呼び出す
ScheduleTime = Now() + TimeValue("00:00:05")
Application.OnTime ScheduleTime, "Auto_Stock_Trading"

End Sub

Sub main_end()
'終了用
Application.OnTime ScheduleTime, "Auto_Stock_Trading", , False

End Sub

Sub Auto_Stock_Trading()
'メイン
'定期的な処理をここへ書く
'自分で自分を呼び出す↓
ScheduleTime = Now() + TimeValue("00:00:05")
Application.OnTime ScheduleTime, "Auto_Stock_Trading"
      
End Sub

※変数ScheduleTimeはグローバル変数にしてお
ざっくりとはこんな感じ。詳細は以下の記事参照。多分今日は動くだろう。

 

動いた!今まで放置していた課題が噴出

2021/11/02追記 動いた。
取引が発生しないと何もログが残らないためひとまず1分ごとに狙っている銘柄の最良売り気配をログに残すことにした。昨日はメインループをdo-loopにdoeventsで作っていたためこれがずっと同じ値であった。

1分ごとに最良売気配のログが取れていることがわかる(※ログ上は最良買気配となっているが、取得しているのは最良売気配)

 今日は最良売気配の値が変化している。動き始めてくると次々と課題が沸いてくる。というより今までは動かないから良しとしていた部分が気になってくる。

マーケットスピード2への自動ログイン

 マーケットスピード同様、朝方のどこかでログアウトさせられるようで、日をまたぐと自力で再ログインさせないといけない。せっかくの自動取引のため、完全自動で1週間(月~金)くらいは動いてほしいものだ。ログイン維持はイメージが難しいし、はるか昔にはマーケットスピード1の自動ログインツールを2400円で購入したこともあったが、今はその作り方がネットに転がっている。参考サイトを参考に作ってみることにする。あまり参考にならなかったので別でページ作りました。

楽天RSS2の自動接続

 こうなるとExcel起動→マーケットスピード2起動となるため、楽天RSSに自動で接続できない。(どの道発注不可→発注可の対策も必要)ここも自動で行う必要がある。めちゃくちゃ苦戦したが、結局コードは数行になった…と思いきや全く安定動作せず、使い物にならないので、寄り道したルートを結局使うことになった。

 これで深夜になったら自動でマーケットスピードⅡとエクセルを落とし、タスクスケジューラに自動取引用エクセルを登録することで朝には起動するつくりとなった。

条件に引っかからない

 そんな簡単に購入(売却)条件に引っかかる方がおかしいのだが、なかなか引っかからない。実際の取引動作を見ないと積極的に機能を拡張していきづらいところだが、こればっかりはどうしたものか。ひとまず購入条件に強制的にひっかけたところバグがあった。悲しい思いをせず済んだ。
 週明けは複数銘柄で条件指定して、動作確認を行う。

条件に引っかかり、発注が行われた。

 ただしとんでもないバグのおまけつき。無限に発注してしまう…恐れていた事態が。一応使用するIDをだいぶ低めに上限設定していたおかげで事なきを得てはいる。
 処理をよくよく見ているとポジションに条件に引っかかった銘柄がある場合と、そうでない場合で分岐を設けたが、ポジションチェックの結果ポジションがあると判断した場合でも無条件に購入するようになっていた。処理を直し、動作確認。これで形は出来上がった。

基本は構築できたためあとは強化していくのみ。

 最小構成のはずがいつの間にか仕様通りのものができていた。あとは強化しつつ、株で儲けるだけである。

ゼロデイ攻撃

 2021/11/10追記マイクロソフトによるゼロデイ攻撃(自動アップデート)が行われていた。今日このプログラムが何をしたのかがほとんどわからなくなった。debug.printではなく、外部にログを残す機能を付けておこう。これはほぼほぼ参考サイトのコードをそのまま使用しただけで完成した。以下がその参考サイト

一喜一憂してはいけないのだが

 2021/11/13追記。自動売買分が含み益とはいえプラスになった。無限買いバグを月曜、火曜と2日続けて出し、そこのポジションが圧倒的なウェイトを占めているが、その二つがプラテンした。今日、動作確認していると少しバグを見つけた。最良売り気配や買い気配が空白の状態でも発注を行う(そもそも接続状態でも発注可でもないのだが…)そのためとりあえず接続状態と発注可否状態監視で両方OKでない場合は発注というかポジションチェック、対象銘柄の価格チェック、発注決定のフェーズを飛ばすようにした。
 状況によって無限にオーダーを出し続ける可能性があるため、RssOrderStatusを利用してひとつ前の注文が約定しているか確認し、約定してから次の注文を出すようにした。約定しない場合、特定の時間が経過するとキャンセルする機能を追加した。

逆指値をつけるかどうか

 逆指値機能も付けようと思って、検討を始めた。逆指値は好きではない(好きな人間いるのだろうか?)画面に張り付いていられない以上、逆指値は欲しい。ただ、逆指値をいかにうまく狩るかが今の相場の最大の要素な気もする。cis本の中でも、AIはリスクが取れない(AIが取れないのではなく、中の人が取れない)話が出てくるし、これを狩るような動きが最近は目立つ。私が検討した逆指値の基準も、逆指値狩りというか現実の相場でのテストで見事狩られ、逆指値の実装を余計にためらわせてくれる。

 逆指値を付けるにあたって、逆指値で反対決済したそばからなにこれお得となって取引しないようにプログラムを作る必要がある。ここは当たり前。
 私が大口だったら逆指値をあらかた狩りつくしたうえでトレンド転換する。それどころか最近は絶望的な状況でトレンド転換することが多くなっているように思う(ほぼ誰もこの状態で上がると思ってないから仕込めてないし、少し前にいったん下がって逆指値があらかた消えたような状態)これをどうアルゴリズムというかプログラムで書き起こせばいいのかはわからない。cis本に記載のある、相場が悪い状態で赤字状態の企業に長期投資というのは逆指値が0でいいため一つの解だが、その場合取引機会がまれなためこのプログラムに大きな意味があるのかはわからない。

2022/1/21追記 逆指値(損切機能)今更付けましたw

やっちまった…

 なにこれ安いとなり購入してしまった銘柄があったが、この時期特有の極悪決算発表直後の銘柄だった。そりゃあそうだ。決算は割と防ぎようがない。どうするのがいいんだろうか?決算でアナリスト予想よりいいであろう銘柄を選別し、対象銘柄をそこに絞るとか、決算時期は事前に決済してしまうという対策になるのだろうか。なにこれ安いとなって購入した直後超絶良決算で爆上げた銘柄もあるため何とも言えないが、基本的には分が悪い気がする。

出来すぎ

 自動売買分が平均でプラス3%を記録(上のやっちまった銘柄がなければ4.5%)地合いがよかったのもあるが、買った瞬間トレンド転換しているというレベルのものも多く、ちょっと出来すぎである。ただし、買い、売りの基準は手動で入力している。

完全にこれの為、どうプログラムでアルゴリズムにしていいかわからないが、この勢いで稼げるならこの方向で伸ばせばいいんじゃないかとも思う。

動いていない…

 今日帰ってみたらバグってて動いていなかった。よく見るとExcelのいちばん上が白く、クイックアクセスツールバーが表示されていない。無茶させすぎたか。再起動しても治らない。なんだこれ…再インストールか?

クイックアクセスツールバーが表示されなくなり、ここをチェック入れることで表示されるように。

と思いつつネットを調べていたら発見。どうもExcelのアップデートらしい。ありえん…信じられないほどダサい。そしてクイックアクセスツールバーをデフォルトで表示しないという私のマクロを狙い撃ちしたかのようなアップデート。本気で意味が分からない。とりあえず参考サイトを見つけたのでそれに従い修正。上書き保存が二つになるがそれでよければ今のまま使える。それが嫌な場合はクイックアクセスツールバーから上書き保存を消し、ショートカットで呼び出すキーが変わるので変更する(4→3、5→4)
 ひとまず動作するようになった。

注文キャンセル機能が動作していない

上のほうでキャンセル機能を付けたはずだったが、見た目にはキャンセルしていたがキャンセルしていなかった。ザラ場外では正常動作していた気がしたため、全く気付かなかった。

2021/12/10マーケットスピード2に自動ログイン後、VBAが動作していない。

 今までは動いていた気がするのですが、少なくともマーケットスピード2RSSがクイックアクセスツールバーに表示されず、動いている気配がないため、マーケットスピード2にログインして20秒間待ってからExcelをアクティブにするよう改修することで動くようになった。

コメント

  1. ゆきょう より:

    はじめまして。楽天RSSで自動売買を目指す者です。
    私は時間管理をSleepを使用していましたが現在値が更新されない問題に
    ぶつかりこちらの記事にたどりつきました。
    貴方様の記事により無事に解決し次に進めましたことに感謝申し上げます。
    ありがとうございました。

  2. nobu より:

    お忙しい中、不躾な質問で申し訳ありませんでした。
    自己解決しました。
    ①Maketspeed2のサンプルシートと同じロジックにしたら、関数認識できました。
    「発注ボタン」を作り、その押下により、動くようになりました。
    またFormula命令をしたことで、セットされたセルが文字型になったことも、関数認識しなかったようです。

    貴重なお時間を頂きありがとうございます。

  3. nobu より:

    貴殿のノウハウで知恵があればご教示願います。
    「チャート」系の株価歩み照会や「注文約定」系の~一覧はどれもきれいに表示されるのですが、
    「注文」系の注文や取消が、セットされた関数を認識せず、関数の後ろに注文ステータスも表示されず、無反応です。
    貴殿のサイト情報も全部読み込み、設定は全部行っています。
    関数はワークシート関数と_VのつくVBA関数ともに反応しません。
    方法としては、一旦関数文字列を整形し、文字情報として変数格納したあと、Formula命令でEXCELのセルにMoveしています。
    何か知恵がありましたら、よろしくお願いします。

    • kotatsu kotatsu より:

      コメントありがとうございます。
      >方法としては、一旦関数文字列を整形し、文字情報として変数格納したあと、Formula命令でEXCELのセルにMoveしています。

      これがどのようなものなのかちょっとイメージがつかないのですが、VBAで標準モジュールに注文用の関数を作成して実行しても動作しないのでしょうか。

  4.   より:

    自動売買に興味がありましたが、VBAとかが複雑すぎて初心者に毛が生えた程度の私では難しいので諦めましたw

    楽天さんーさては、一般に広く門戸を開放する気ないな?

    • kotatsu kotatsu より:

      コメントありがとうございます。
      最小構成の物を作れるところまでたどり着くまでが、敷居が高いように思います。
      最近楽天公式サイト見てないですけど自動売買ができるサンプルプログラムとか作らないんですかね。
      自分で作らないならクラウドワークスやランサーズで作ってもらうのも手かもしれません。
      仕様にもよりますが5~10万円くらいはかかると思います。

  5. standstone より:

    こちらの記事を参考に自分でも自動発注を作成しようと日々奮闘中です。(まだバグだらけで思うように動いてくれませんが)
    質問なのですが、成行で売り約定した場合、結局株価いくらで売れたのかを取得する関数、および項目を見つけられていないのですが、もしご存じでしたらご教示いただけますと幸いです。

    • kotatsu kotatsu より:

      コメントありがとうございます。
      注文約定関数のRssExecutionListを使うと12番目の戻り値として取得できるようです。
      自動取引頑張ってください。

      • standstone より:

        見つかりました!ありがとうございます!
        自動売買のプログラムに着手して5ヶ月経過しますがまだ思うように動いてくれません。
        特にテストと本番とで挙動を同じにしているつもりですが、テストではうまく利益が出て「イケる」と思っていたのに本番では損失になる事が多く、難しさを実感しています。やはり実際の取引では約定までのタイムラグがあるので、テストで本番と全く同じような取引を再現できないところがあります。仕方なく本番で動かして検証するので資金が地味に減り続けて大変です。。

        • kotatsu kotatsu より:

          見つかってよかったです。
          結局のところ、儲かるアルゴリズムを考え、実装するというのが圧倒的に難しく、
          名だたる大企業が英知を結集して取り組んでいるところだと思います。
          今ではAIによって自動化されて証券ディーラーがほとんど全員クビになったという話も昔話になりつつあります。

          お互い、稼げるプログラムを作成できるように頑張りましょう。

  6. 増田 より:

    自動発注しようにも、ユーザーフォームが出て困っていたところ、このサイトで学べました。各種設定のところにチェックボタンを外す作業でよかったんですね。ありがとうございます。

タイトルとURLをコピーしました