楽天証券を使っているんだけど、
株式投資でテクニカルを使って自動で売買できるプログラムを、
Excel(エクセル)でつくることってできないかな。
(ZACK IT編集)
Microsoft Excelの標準機能にはないけど、
証券会社が追加機能を提供していたりするので、システムトレードを実現できる場合があるよ。今回は楽天証券の事例で紹介していこう。
- 楽天RSSでできること
- VBAなしで日本株を新規発注する方法
- 発注関数の内容を理解する(RssMarginOpenOrder関数)
- 発注ID:1~
- 発注トリガー:0または1(セル参照も可能)
- 銘柄コード:東証のコードを参照
- 売買区分:1/売・3/買
- 注文区分:0/通常注文、1/逆指値付き通常注文、2/逆指値注文
- SOR区分:0/通常注文、1/SOR注文
- 信用区分:1/制度信用、2/一般信用(無期限)、3/一般信用(14日)、4/一般信用(一日)
- 注文数量:100~
- 価格区分:0/成行、1/指値
- 注文価格:指値の場合は入力(成行の場合は省略可)
- 執行条件:大体の場合は1/本日中。場合によっては6/大引不成とか使うかも?
- 注文期限:執行条件で5/期間指定を選んだ場合は入力(それ以外は省略可)
- 口座区分:0/特定、1/一般
- 逆指値条件価格:逆指値付き注文にした場合は条件価格を入力(それ以外は省略可)
- 逆指値条件区分:1/以上、2/以下
- 逆指値価格区分:0/成行、1/指値
- 逆指値価格:逆指値価格区分が指値の場合は指値を入力(成行の場合は省略可)
- セット注文区分:0/通常(予約しない)、1/セット注文(予約する)
- セット注文価格区分:セット注文ありの場合、1/指値、2/値幅指定(セット注文しない場合は省略可)
- セット注文価格:セット注文価格区分1/指値選択した場合は指定
- セット注文執行条件:通常注文の執行条件と同じなのでそちら参照
- セット注文期限:通常注文の注文期限と同じなのでそちら参照
- まとめると…
- 発注関数の内容を理解する(RssMarginOpenOrder関数)
- おわりに
楽天RSSでできること
楽天RSSとは楽天証券が無料で提供している株式投資のExcel向け追加機能であり、できることとしてはExcelシート上での株価リアルタイム更新の他、信用倍率や決算日情報などの投資指標などは大方表示でき、なおかつ複数銘柄にわたってリアルタイム監視できる機能(銘柄上限数あり)。
当記事は既に楽天RSSをインストールはしたものの効率的な活用方法がまだこれから手探りで探していく人向けの内容となっている。もしまだインストールしていない人はこちらの楽天証券のページから確認するか、「楽天RSS」で検索をおすすめする。利用自体は楽天証券ユーザーであれば無料で使用できるが、RSS利用規約に同意してないと使えない点は留意したい。
PERやPBRは勿論、テクニカルでいえば移動平均なども標準で表示できるため非常に利便性は高い一方、それだけ見れば別にマーケットスピード2で表示可能な機能ばかり。当然エクセルで計算できることも併せてできるので、RSIやMACD、EMAの分析も可能だ。
しかし楽天RSSで最も大きいメリットはそこでは終わらない。なんと東証に上場している日本株を自動売買することがExcel上で実現できることがこのツール最大のメリットだ。楽天RSSには発注関数が実装されているためそれを利用することで、買い/売りサインが出た場合に新規/返済注文を出すことが可能になる。
自動売買と聞くとAPIキーを発行している証券会社などでPythonを使ってプログラミングするイメージを持つかもしれないが、Excel上で実現できると聞いたら少しハードルが下がった気がするかもしれない。
VBAなしで日本株を新規発注する方法
※以下で説明している方法にて発注した株で、いかなる利益/損失が発生しても当サイトは一切責任を負わないものとする。あくまで楽天RSSの機能である発注関数を使用した注文方法の説明しているにすぎず、万一含み損や確定損失が出ても責任を負いかねる点に注意してほしい。※
PythonやAPIを使った小難しいことはやらずに済んでも、ExcelといえばVBAやマクロを組まないといけないんでしょ?
(ZACK IT編集)
そんなことないよ!
勿論VBAが使えたほうができることの幅は広がるけど、
今回の記事ではVBAを使わない手法で説明していくから安心して最後まで読んでね。
発注関数の内容を理解する(RssMarginOpenOrder関数)
まず信用新規で買建する前提で使う関数はRssMarginOpenOrder関数だ。
必要な引数が上の画像の通りだが羅列しても訳が分からないだろう。今回の記事ではこれをわかる状態にするのがゴールだ。
自動売買の話の前に、発注関数の中身を理解しておくことが重要となるので各引数に対してどのように記述していくかを説明する。
というのも発注関数は引数(システム側に渡さなければいけない情報)が多すぎて初見で嫌になること間違いなしだからだ。
例えば下記の画像のようなシートがあったとして、M2セルに発注関数を入力するとしよう。A2に入力されている銘柄CD:7912の大日本印刷(あくまで発注関数の説明のための一例であり、買い推奨銘柄ではない)を発注したいとする。
次章から各引数に対しての入力例を説明する。
発注ID:1~
一意の値である必要がある。つまり1を一度使ったら二度と使えない(ただしエクセルを一度再起動すれば再度使用できる)。そのため2→3→4と加算していくかもしくは、完全ランダムに作っていくかいくつか方法はある。
桁の上限数だがマニュアルを当サイトで確認する限りは8もしくは9桁までは使えたことを報告しておく。そのため、例えば05月01日09時39分に発注であれば、05010939という数列を生成して発注番号として割り当てることも可能というわけだ。
後々登場するが発注IDと注文番号は異なるので注意。(注文番号は訂正注文時必要になる)
なおRANDBETWEEN関数使用できない。確かにこの関数を使えば膨大なパターンの乱数を生成できるため一見よさそうに見えるが、使ったら壊れたスロットのように永遠に数字が変わり続け最後にはフリーズしたことをここに報告しておく。
RSSの更新間隔との相性と思われるが、使わないほうがいいだろう。
とにかく、RSSの内部的に更新間隔(1秒?)ごとにシートを更新しているので、RANDBETWEENで生成されたランダム整数もまた更新されてしまい、無限ループしてしまっている様子。最悪応答なくなって強制終了しか手段なくなるのでやらないことをお勧めする。
発注トリガー:0または1(セル参照も可能)
これは簡単。0は待機(注文されない状態)、1は注文したら飛ぶ状態(誤発注注意!)
察しがいい方はお気づきかと思うが、ここが1に変われば勝手に発注されるので、判定条件を作り0から1に値が変わるよう関数を書いておけば自動で発注がされることとなる。返済注文もあらかじめ関数と条件を作っておけば自動売買成立となるわけだ。
※トリガーが1になっている間は際限なく注文が飛び続ける。つまり発注IDさえ被っていなければ、重複発注も十分あり得るということ。考えただけでも恐ろしいが、検証の際100株注文するつもりが1000株分くらい重複で飛んでいたらしく資金が底をつきかけた。絶対誤発注せぬようご注意のほど喚起しておく。
あくまで参考アイデアとしてだが、注文照会(RssOrderList関数)を活用して、該当銘柄の返済注文が注文照会に載った場合はトリガーを0に戻すなど対策すればいいかと思われる。あるいは発注が正常に飛んだことを確認できるまで発注IDを変更しなければ少なくとも重複注文が飛んで資金いっぱいまで買われることはない。
銘柄コード:東証のコードを参照
特に説明不要かと思うが、もちろんセル参照で行けるため上の画像で説明するとA2選択でOK。
売買区分:1/売・3/買
買建オンリーの人は3しか使わないのではないだろうか。空売りの手法も取り入れている場合は売建で1も使われるといいだろう。(ここでいう売買はあくまで新規注文。返済注文とは別なので注意してほしい)
注文区分:0/通常注文、1/逆指値付き通常注文、2/逆指値注文
いつもトレードで使用する注文方法を選択。ZACK ITでは検証時、新規発注では0/通常注文しか使わず、返済注文で逆指値付きを使うことが多かった。
SOR区分:0/通常注文、1/SOR注文
1のSORは東証の他JNXやChi-Xなど、自分の注文に対して有利な条件価格があればそっちで約定させてあげますよという内容。検証ではとりあえず1/SOR注文。
信用区分:1/制度信用、2/一般信用(無期限)、3/一般信用(14日)、4/一般信用(一日)
今回はデイトレでの検証だったため4/一般信用(一日)を使用。その場合は必ず大引までに返済するように注意が必要。
注文数量:100~
自動売買構築直後は実際に運用してみて予測してない挙動にならないかのチェックの為資金沢山あってもテスト運用で100をお勧めする。
価格区分:0/成行、1/指値
これは例などはないため、手法やタイミングに合わせて使いわけてほしい。
注文価格:指値の場合は入力(成行の場合は省略可)
1/指値の際は呼値に注意。例えば1ティック5円なのに10,001円で発注してもエラーで発注が飛ばない。その場合は10,005円や10,000円で発注しなければいけない。呼値って何の人はまずはそこを調べよう。
執行条件:大体の場合は1/本日中。場合によっては6/大引不成とか使うかも?
指値で期間指定したい場合は、5/期間指定を選択。
注文期限:執行条件で5/期間指定を選んだ場合は入力(それ以外は省略可)
期間指定の書式はYYYYMMDD。
今日(2024/5/1)から1か月後とかにしたいんだったら下記みたいな感じで指定が可能。MONTH(NOW())+1にすれば5月+1で6になるって感じ。
TEXT(YEAR(NOW()),"0000")&TEXT(MONTH(NOW())+1,"00")&TEXT(DAY(NOW()),"00")
とはいえ検証では期間指定をしたことがなかったが、祝日や土日などってどうなるんだろう避けなきゃってなると色々面倒な前提条件の設定が必要になるだろう。
祝日シート作って、WORKDAY関数等々検討しよう。
口座区分:0/特定、1/一般
大体の場合は0/特定ではないだろうか。
逆指値条件価格:逆指値付き注文にした場合は条件価格を入力(それ以外は省略可)
新規注文で逆指値あまり使ったことないのでわからないが、とりあえず指値で待ち構えておくけど、節目の価格をブレイクして上がってしまう場合乗り遅れるので成行にしたい場面等で使用。
その場合「10,000円」以上になったら成行発注するのであれば10,000を引数にすればOK。
呼値に注意。例えば1ティック5円なのに10,001円で発注してもエラーで発注飛ばない。その場合は10,005円や10,000円で発注しなければいけない。呼値って何の人はまずそれ調べ(ry
逆指値条件区分:1/以上、2/以下
例えば10,000以上になったら成行発注するといった逆指値トリガーを予約したい場合、逆指値条件価格に10,000と入力し、逆指値条件区分1/以上を選択する。
逆指値価格区分:0/成行、1/指値
逆指値はそもそも新規ではなく返済で使うことが当方は多いが使うのであれば十中八九逆指値使う場合は0/成行を使うのではないか。
例を挙げると10,000以上になったら成行発注するといった感じです。
逆指値価格:逆指値価格区分が指値の場合は指値を入力(成行の場合は省略可)
呼値に注意。例えば1ティック5円なのに10,001円で発注してもエラーで発注飛ばない。その場合は10,005円や10,000円で発注しなければいけない。呼値って何の人はま(ry
セット注文区分:0/通常(予約しない)、1/セット注文(予約する)
例えばこの関数の前半で指定している銘柄の新規買い建て注文が約定したとする。するとすぐさまそれの利確のための予約注文がされるわけだ。便利とはいえ使い時は限られるかも。また、一日信用を使っている場合は大引不成もしくは不成を選択しないとエラーになるため注意。
セット注文価格区分:セット注文ありの場合、1/指値、2/値幅指定(セット注文しない場合は省略可)
意外と値幅指定が便利かも。10円利益のったら利確したい的な。勿論株価の利幅だ。1,000円の株が1,010円で売りたいなら利幅は10円で指定。
1/指値の場合は呼値に注意。例えば1ティック5円なのに10,001円で発注してもエラーで発注飛ぶことはない。その場合は10,005円や10,000円で発注しなければいけない。呼値っt(ry
セット注文価格:セット注文価格区分1/指値選択した場合は指定
1/指値の場合は呼値に注(ry
セット注文執行条件:通常注文の執行条件と同じなのでそちら参照
セット注文期限:通常注文の注文期限と同じなのでそちら参照
まとめると…
いかがだっただろうか。だいぶ条件定義が長いため気が遠くなった読者もいるのではないだろうか。
全てまとめるとM2セルにはこんな感じになるい。今回省略可のところは”,(カンマ)”だけにしている。
=RssMarginOpenOrder(1,0,A2,3,0,1,4,100,0,,1,,0,,,,,0,,,,)
M2セルの末尾に”=>待機中”と表示されていれば成功。発注トリガーが1になって建余力がある場合はもう後は勝手に発注してザラ場であればキャンセルできず約定するので(成行なら)ご注意を。
よくある注意点
まだ発注するうえでいくつか見落としがちな注意点がある。
ExcelのマーケットスピードⅡのタブにて、発注不可の状態になっている場合は発注トリガーが1の状態でも発注されない。せっかくいい自動売買ロジックができたから寄付から試すぞー!って思って中々発注されないからなんでだろうと思ってよく見たら発注ロックがかかっていた状態が稀によくある。
同じくExcelのマーケットスピードⅡのタブにて、各種設定の中にあるRSSの設定だが、おそらく初期設定は発注上限金額が0円だったと思うので、これも変更してあげないといつまでも発注されないため注意。
こちらはマーケットスピードⅡの環境設定にある、注文・約定2の画面。
この二つにチェックを入れて右に隠れてしまっているが、取引暗証番号をあらかじめ入力して適用しておくことをすすめる。
おわりに
さて、いかがだっただろうか?
今回は楽天RSSを活用して自動売買を実現するために必要不可欠なまずは新規発注を手動で行うというところまで説明してきた。
言ってしまえば自動で売買を行うことは今日学んだことの応用なのでここがまだ少しよくわからないよという方はぜひX(旧Twitter)の当アカウントへブログ読んだ旨伝えて気軽に質問してもらえればありがたい。わかる範囲・答えられる範囲でお答えする所存だ。
次回は返済注文の関数について説明する予定なのでぜひTwitterと当サイトをブックマークしてお待ちいただきたい。