owned this note
owned this note
Published
Linked with GitHub
# QuantXに触ってみよう
細かい説明を省き簡単に実装できるところだけ書きました。
細かい説明などは以下のリンクで行なっているので参考にしてください。
https://qiita.com/katakyo/private/c4e0f13247e4d52856a1
## サンプルコード
今日はこちらをメインに使います
https://factory.quantx.io/developer/aa318fa292304975ad45f858ba475a4a
Cloneというボタンを押して自分のプロジェクト一覧に保存して使ってみてください。
### ライブラリーのimport(2~7行目)
サンプルコードの2~7行目はライブラリーのimportをしています。
`import 使用したいライブラリー名`でimportできます。
例として
```python=
import pandas as pd
```
だとpandasというライブラリーをimportしてきて今後pandasはpdと呼ぶことにするという意味になります。
QuantXで使えるライブラリーは以下になります。
| packages | version |
|:--|:--|
| Python | 3.6.7 |
| numpy | 1.16.3 |
| pandas | 0.23.4 |
| statsmodels | 0.9.0 |
| scikit-learn | 0.21.1 |
| scipy | 1.3.0 |
| TA-lib | 0.4.17 |
| cvxopt | 1.2.3 |
| xgboost | 0.90 |
| Keras | 2.2.4 |
| chainer | 6.0.0 |
| tensorflow | 1.13.1 |
## 銘柄、株価データの設定(10~32行目)
アルゴリズムで使用する銘柄、株価を登録します。
証券コード7201,1305,9984,9983の銘柄の始値、終値、高値、安値、出来高、売買代金を使用するときは以下のように記述します。
```python=
# 銘柄、株価データの設定
def initialize(ctx):
# 設定
ctx.logger.debug("initialize() called")
ctx.configure(
channels={ # 利用チャンネル
"jp.stock": {
"symbols": [
"jp.stock.7201",
"jp.stock.1305",
"jp.stock.9984",
"jp.stock.9983",
],
"columns": [
"open_price_adj", # 始値(株式分割調整後)
"close_price_adj", # 終値(株式分割調整後)
"high_price_adj", # 高値(株式分割調整後)
"low_price_adj", # 安値(株式分割調整後)
"volume_adj", # 出来高
"txn_volume", # 売買代金
]
}
}
)
```
enish(3667)のコードを加えたいと思ったらSymbolsの配列に`"jp.stock.3667"`を追加します。
```python=
# 銘柄、株価データの設定
def initialize(ctx):
# 設定
ctx.logger.debug("initialize() called")
ctx.configure(
channels={ # 利用チャンネル
"jp.stock": {
"symbols": [
"jp.stock.7201",
"jp.stock.1305",
"jp.stock.9984",
"jp.stock.9983",
"jp.stock.3667",
],
"columns": [
"open_price_adj", # 始値(株式分割調整後)
"close_price_adj", # 終値(株式分割調整後)
"high_price_adj", # 高値(株式分割調整後)
"low_price_adj", # 安値(株式分割調整後)
"volume_adj", # 出来高
"txn_volume", # 売買代金
]
}
}
)
```
## 売買シグナルの作成(35~70行目)
今回はRSIが30より大きい時に買い、70より大きい時に売るシグナルを書きます。
```python=
# シグナル定義
def _my_signal(data):
# 株価データの取得
cp = data["close_price_adj"].fillna(method='ffill')
# op = data["open_price_adj"].fillna(method='ffill')
# hp = data["high_price_adj"].fillna(method='ffill')
# lp = data["low_price_adj"].fillna(method='ffill')
# vol = data["volume_adj"].fillna(method='ffill')
# txn = data["txn_volume"].fillna(method='ffill')
# テクニカル分析
rsi = pd.DataFrame(data = 0, columns=[], index = cp.index)
for (sym, val) in cp.items():
rsi[sym] = ta.RSI(cp[sym],timeperiod = 14)
# 売買シグナルを定義
buy_sig = rsi < 30
sell_sig = rsi > 70
# 市況シグナルの定義
market_sig = pd.DataFrame(data=0.0, columns=cp.columns, index=cp.index)
# buy_sigがTrueのとき1.0、sell_sigがTrueのとき-1.0とおく
market_sig[buy_sig == True] = 1.0
market_sig[sell_sig == True] = -1.0
market_sig[(buy_sig == True) & (sell_sig == True)] = 0.0
# loggerに関しましては右画面のノートをご覧ください⑦
# ctx.logger.debug(market_sig)
return {
"rsi": rsi,
"market:sig": market_sig,
}
# シグナル登録
ctx.regist_signal("my_signal", _my_signal)
```
長ったらしいコードですが、別の指標を使いたいと思った時に弄るコードは
```python=
# テクニカル分析
rsi = pd.DataFrame(data = 0, columns=[], index = cp.index)
for (sym, val) in cp.items():
rsi[sym] = ta.RSI(cp[sym],timeperiod = 14)
# 売買シグナルを定義
buy_sig = rsi < 30
sell_sig = rsi > 70
```
この部分だけです
ではRSIの計算をMACDの計算に変えてみましょう。
計算にはTA-Libというライブラリーを使います。
https://mrjbq7.github.io/ta-lib/func_groups/momentum_indicators.html
MACDの項目を見ると
```
macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
```
書いてあるのでこれに従ってコードを書き換えます。
MACDでは計算結果がmacd, macdsignal, macdhistと計算結果が3つ出てくるのが注意です。
```python=
# テクニカル分析
macd = pd.DataFrame(data = 0, columns=[], index = cp.index)
macdsignal = pd.DataFrame(data = 0, columns=[], index = cp.index)
macdhist = pd.DataFrame(data = 0, columns=[], index = cp.index)
for (sym, val) in cp.items():
macd[sym], macdsignal[sym], macdhist[sym] = ta.MACD(cp[sym], fastperiod=12, slowperiod=26, signalperiod=9)
# 売買シグナルを定義
buy_sig = (macd > macdsignal) & (macd.shift(1) < macdsignal.shift(1))
sell_sig = (macd < macdsignal) & (macd.shift(1) > macdsignal.shift(1))
```
また計算する指標が変わったので関数の返り値も変えましょう
```python=
return {
"macd": macd,
"macdsignal":macdsignal,
"macdhist":macdhist,
"market:sig": market_sig,
}
```
MACDに差し替えたサンプルコード
https://factory.quantx.io/developer/f3d3a19d92ea48ada7a3c5eb1e6089e7
## 約定の設定(72~111行目)
ここでは損切りや利確の設定や注文の方法を決めます
```python=
def handle_signals(ctx, date, current):
'''
current: pd.DataFrame
'''
market_sig = current["market:sig"]
done_syms = set([])
# 損切り、利確の設定
for (sym, val) in ctx.portfolio.positions.items():
returns = val["returns"]
if returns < -0.03:
# 株の注文方法に関しましては右画面のノートをご覧ください⑨
sec = ctx.getSecurity(sym)
sec.order(-val["amount"], comment="損切り(%f)" % returns)
done_syms.add(sym)
elif returns > 0.05:
sec = ctx.getSecurity(sym)
sec.order(-val["amount"], comment="利益確定売(%f)" % returns)
done_syms.add(sym)
# 買いシグナル
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_percent(0.2, 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_target(0,orderType=maron.OrderType.MARKET_OPEN, comment="SIGNAL SELL")
#ctx.logger.debug("SELL: %s, %f" % (sec.code(), val))
pass
```
### 損切りのパーセンテージを変える時
`if returns < -0.03:` の数値だけ変えましょう。
例えば4%損失が出た時に損切りしたいときは
`if returns < -0.04:`
と記述してください。
### 約定の方法を変えるとき
```
`sec.order_percent(0.2, orderType=maron.OrderType.MARKET_OPEN, comment="SIGNAL BUY") `
```
と記述してある部分の`order_percent`とその数を変えます。
現在ポートフォリオ比率で注文するようになっているので
買いシグナルが出たら一単元株数購入するように変更します。
```
sec.order(sec.unit() * 1, orderType=maron.OrderType.MARKET_OPEN, comment="SIGNAL BUY")
```
6種類のオーダー方法がありますので、詳しくはリファレンスをみてください。
https://factory.quantx.io/handbook/ja/api.html#Security
`
# Q&A
質問等がございましたらSlackにてご質問ください。
# 応用編
Qiitaにたくさん記事があります。
機会学習を使ったりと様々なものがあるのでみ参考にしてください。
https://qiita.com/Miku_F/items/ffa208d373f7d1c4f942