#はじめに
QuantXが新エンジンにバージョンアップしました!
旧バージョンと比べて機能追加や変わった点などいくつかあります!
以下の記事にまとめたのでよかったら参照ください!(いいねくださると嬉しいです...)
https://qiita.com/katakyo/items/12b41fec940a3bac1142
#今回やること
今回は前回の記事であまり触れなかった指値注文をQuantXで実装する方法を紹介します!!
説明することとしては
- 指値注文とは何か?
- 指値注文と成行注文のメリットデメリットの比較
- 実際の実装方法
- 結果検証
以上の4点になります
#指値注文について
株取引の注文方法は大きく2つで値段を指定する指値(さしね)注文と、指定しない成行(なりゆき)注文にわかれます。
注文方法 | 概要 |
---|---|
指値(さしね)注文 | 希望価格を指定して発注する方法 |
成行(なりゆき)注文 | 希望価格を指定せず、どんな価格でもいいので取引したいという注文方法 |
旧エンジンではシグナルが出た株価が金額的に注文可能であれば約定していたため成行注文であるということがわかります。
希望価格を指定して発注する指値取引ですが、その中でも指値(さしね)注文と逆指値(ぎゃくさしね)注文の大きく二つに分けることができます。
注文方法 | 購入 | 売却 |
---|---|---|
指値(さしね)注文 | 希望価格より安くなったら購入 | 希望価格より高くなったら売却 |
逆指値(ぎゃくさしね)注文 | 希望価り高くなったら購入 | 希望価格より安くなったら売却 |
#指値注文と成行注文のメリットデメリットの比較
##指値注文
指値注文は自分で希望金額で取引可能です。(実際の相場は値幅制限があります。)よって、株価が自分が指定した金額にならない限りは約定(取引が成立すること)しません。自分が思った通りの値段で取引ができる点がメリットとなります。
逆に言えば、相場と離れた金額を設定してしまうとなかなか取引が成立しません。
##成行注文
成行注文は注文してしまえば*ほぼ購入可能です。
しかし、希望金額を指定していないので、株価の暴騰や暴落により自分の想定していない金額で取引が成立してしまうことがあります。
*ほぼと言ったのは、売買が殺到して注文数が足りない場合に関しては取引が成立しないからです。(ストップ高、ストップ安とかいうアレです。)
##まとめ
注文方法 | メリット | デメリット |
---|---|---|
指値(さしね)注文 | 自分の希望した金額で取引ができる | 相場と離れた金額を指定していると取引が成立しにくい |
成行(なりゆき)注文 | 取引が成立しやすい | 自分の想定していない金額で取引が成立してしまうことがある |
#QuantXでの実装方法
現状は逆指値注文はできなさそうなので指値注文のやり方だけ書きます
注)今回は使い方のための記事なのでパフォーマンスは無視します。
指値注文はhandle_signals関数内のorderの部分で以下のような書き方をします。
order(amount, comment, order_type = maron.OrderType.LIMIT , limit_price , comment = "指値注文")
順に見ていきます
外側のorderは以下のリンクを参照にしてください
https://factory.quantx.io/handbook/ja/api.html#Security
実装は非常にシンプルでorder_type = maron.OrderType.LIMIT
と記述すれば指値注文が可能です。
そのあとカンマで希望の約定価格をlimit_priceに記述します。
##指値注文
まず、シグナルが出た日の終値の価格で指値注文をしてみます。
アルゴリズムはコチラ
handle_signal以下のオーダー方法を以下のようにします(利確5%,損切り−3%で設定)
# 約定(買い)
buy = market_sig[market_sig > 0.0]
for (sym, val) in buy.items():
if sym in done_syms:
continue
sec = ctx.getSecurity(sym)
sec.order(sec.unit() * 1, orderType=maron.OrderType.LIMIT,limit_price = (current["close_price"][sym]), comment="SIGNAL BUY")
#ctx.logger.debug("BUY: %s, %f" % (sec.code(), val))
pass
# 約定(売り)
sell = market_sig[market_sig < 0.0]
for (sym, val) in sell.items():
if sym in done_syms:
continue
sec = ctx.getSecurity(sym)
sec.order(sec.unit() * -1,orderType=ot,limit_price = (current["close_price"][sym]), comment="SIGNAL SELL")
#ctx.logger.debug("SELL: %s, %f" % (sec.code(), val))
pass
作成したアルゴリズムのファーストリテイリング社の取引状況をみてみましょう。
6月27日の終値の価格(50,580円)で注文を出し、翌日その価格で約定されていることがわかります。
###ファーストリテイリングの株価
日付 | 始値 | 高値 | 安値 | 終値 | 前日比 | 前日比% | 売買高(株) |
---|---|---|---|---|---|---|---|
18/06/29 | 51,160 | 51,450 | 50,640 | 50,910 | -30 | -0.1 | 605,600 |
18/06/28 | 50,670 | 50,980 | 49,690 | 50,940 | +360 | +0.7 | 647,200 |
18/06/27 | 49,990 | 50,690 | 49,880 | 50,580 | +370 | +0.7 | 551,400 |
18/06/26 | 50,960 | 51,030 | 50,190 | 50,210 | -1,430 | -2.8 | 695,400 |
##前場寄成
同様の条件で、シグナルが出た日の始値の価格で成行注文をしてみます。
アルゴリズムはコチラ
handle_signal以下のオーダー方法を以下のようにします(利確5%,損切り−3%で設定)
# 約定(買い)
buy = market_sig[market_sig > 0.0]
for (sym, val) in buy.items():
if sym in done_syms:
continue
sec = ctx.getSecurity(sym)
sec.order(sec.unit() * 1, orderType=maron.OrderType.MARKET_OPEN, comment="SIGNAL BUY")
#ctx.logger.debug("BUY: %s, %f" % (sec.code(), val))
pass
# 約定(売り)
sell = market_sig[market_sig < 0.0]
for (sym, val) in sell.items():
if sym in done_syms:
continue
sec = ctx.getSecurity(sym)
sec.order(sec.unit() * -1,orderType=maron.OrderType.MARKET_OPEN, comment="SIGNAL SELL")
#ctx.logger.debug("SELL: %s, %f" % (sec.code(), val))
pass
翌日のマーケットの始値の値で約定すると以下のように成ります。
6月28日の始値(50,670)で約定されていることがわかります。
ここで気づくかもしれませんが、成行注文では6月7日に買いの約定が執行されていますが指値では執行されていません。
以下の表に6月6日(買いシグナルが出た日)と6月7日(約定が執行された日)のファーストリテイリングの株価情報を載せます。
日付 | 始値 | 高値 | 安値 | 終値 | 前日比 | 前日比% | 売買高(株) |
---|---|---|---|---|---|---|---|
18/06/07 | 48,550 | 49,490 | 48,550 | 49,190 | +880 | +1.8 | 793,500 |
18/06/06 | 47,490 | 48,500 | 47,220 | 48,310 | +1,170 | +2.5 | 608,700 |
指値注文では買いシグナルが出た終値(48,310円)で注文を出します。
しかし、翌日は始値(48,550円)、安値(48,550円)と始値の値を安値が切ることがありませんでした。
よって希望の約定価格になることがなく取引しなかったということになります。
##少し指値をいじってみる
先ほどの指値注文の条件を少し変えてみます。
シグナルが出た日の終値-10
を指値としてみます.
アルゴリズムはコチラ
変更した部分
sec.order(sec.unit() * 1, orderType=maron.OrderType.LIMIT,limit_price = (current["close_price"][sym]-10), comment="SIGNAL BUY")
先ほど50580円で約定されていたものが50570円で約定されました。
同タイミングで売りを出せば10×100=1000円の利益の違いが出ますね。
#まとめ
希望価格を自由に設定できるというのが利点だと思います。
シグナルが出た日の高値、安値でとってパラメータ調整すると面白いかもしれませんね。
ただ、成行注文と違ってキャッシュがあったとしても約定しないケースもあるので注意が必要ですね。
#宣伝
####勉強会やってます!
日時:毎週金曜日19時〜
場所:神田 千代田共同ビル4階 SmartTrade社オフィス
内容:初心者(プログラミングってものを知らなくてもOK)向けに初心者(私とか)がこんな内容をハンズオン(一緒にやる事)で解説しています
備考:猛者の方も是非御鞭撻にいらして下さい、そして開発・伝導者になりましょう!
####もくもく会もやってます!
日時:毎週水曜日18時〜
場所:神田 千代田共同ビル4階 SmartTrade社オフィス
内容:基本黙々と自習しながら猛者の方に質問して強くなっていく会
備考:お菓子と終わりにお酒を飲みながら参加者と歓談できます!
####詳細はこちらです
週によっては開催されない週もあります。
また勉強会参加、もくもく会参加には基本的に事前に参加登録をしてください!
Pythonアルゴリズム勉強会HP:https://python-algo.connpass.com/
(connpassって言うイベントサイトに飛びます)
####ストアもあります
システムトレードの開発者が作ったアルゴリズムがQuantX Storeで販売されています!
詳細は以下のリンクから
https://quantx.io/
#免責注意事項
このコードや購入したアルゴリズム及び知識を使った実際の取引で生じた損益に関しては一切の責任を負いかねますので御了承下さい