前提・実現したいこと
QuantXで金融危機時にだけ、エラーが出てしまって、バックテストができません。
QuantX環境でしか動かないと思います。
たぶん、talibのエラーだと思ってます。
https://factory.quantx.io/developer/0dff7264342c4f4188e231a6d26774cd
発生している問題・エラーメッセージ
ERROR14:33:54Exception inputs are all NaN ERROR14:33:54/opt/work/user.py in _MACD(data) 65 for (sym, val) in cp.items(): 66 ---> 67 bas[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=12) 68 rel[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=26) 69 MACD = bas - rel
該当のソースコード
python
1############################################################################ 2############################################################################ 3# macd 4import numpy as np 5import pandas as pd 6import talib as ta 7 8 9def initialize(ctx): 10 # 設定 11 ctx.logger.debug("initialize() called") 12 ctx.configure( 13 channels={ # 利用チャンネル 14 "jp.stock": { 15 "symbols": [ 16 "jp.stock.2914", # 17 "jp.stock.8766", # 18 "jp.stock.8031", # 19 "jp.stock.8411", # 20 "jp.stock.8316", # 21 "jp.stock.9437", # 22 "jp.stock.4502", # 23 "jp.stock.8058", # 24 "jp.stock.9432", # 25 "jp.stock.8306", # 26 "jp.stock.9433", # 27 "jp.stock.7267", # 28 "jp.stock.7974", # 29 "jp.stock.4503", # 30 "jp.stock.4063", # 31 "jp.stock.3382", # 32 "jp.stock.6981", # 33 "jp.stock.4452", # 34 "jp.stock.9020", # 35 "jp.stock.8802", # 36 "jp.stock.6098", # 37 "jp.stock.6758", # 38 "jp.stock.9022", # 39 "jp.stock.9984", # 40 "jp.stock.6501", # 41 "jp.stock.6752", # 42 "jp.stock.6861", # 43 "jp.stock.6954", # 44 "jp.stock.7203", # 45 "jp.stock.7751", # 46 ], 47 "columns": [ 48 #"open_price_adj", # 始値(株式分割調整後) 49 "high_price_adj", # 高値(株式分割調整後) 50 "low_price_adj", # 安値(株式分割調整後) 51 #"volume_adj", # 出来高 52 #"txn_volume", # 売買代金 53 "close_price", # 終値 54 "close_price_adj", # 終値(株式分割調整後) 55 ] 56 } 57 }) 58 59 def _MACD(data): 60 cp = data["close_price_adj"].fillna(method="ffill") 61 bas = pd.DataFrame(data=0, columns=[], index=cp.index) 62 rel = pd.DataFrame(data=0, columns=[], index=cp.index) 63 signal = pd.DataFrame(data=0, columns=[], index=cp.index) 64 65 for (sym, val) in cp.items(): 66 67 bas[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=12) 68 rel[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=26) 69 MACD = bas - rel 70 signal = MACD.fillna(method='ffill').rolling( 71 window=9, center=False).mean() 72 73 buy_sig = ((MACD > signal) & (MACD.shift(1) < signal.shift(1)) & 74 (MACD > 0)) 75 sell_sig = ((MACD < signal) & (MACD.shift(1) > signal.shift(1)) & 76 (MACD < 0)) 77 return { 78 "basic line": bas, 79 "relative line": rel, 80 "MACD:g2": MACD, 81 "signal:g2": signal, 82 "buy:sig": buy_sig, 83 "sell:sig": sell_sig, 84 } 85 86 # シグナル登録 87 ctx.regist_signal("_MACD", _MACD) 88 89 90def handle_signals(ctx, date, current): 91 92 buy = current["buy:sig"].dropna() 93 for (sym, val) in buy.items(): 94 95 sec = ctx.getSecurity(sym) 96 sec.order(sec.unit() * 1, comment="SIGNAL BUY") 97 ctx.logger.debug("BUY: %s, %f" % (sec.code(), val)) 98 pass 99 100 sell = current["sell:sig"].dropna() 101 for (sym, val) in sell.items(): 102 103 sec = ctx.getSecurity(sym) 104 sec.order(sec.unit() * -1, comment="SIGNAL SELL") 105 ctx.logger.debug("SELL: %s, %f" % (sec.code(), val)) 106 pass 107
試したこと
最近のバックテスト(過去3年、上昇相場など)だとうまくいきます。
古いデータの時だけうまくいきません。
データが空の時だけうまくいきません。
補足情報(FW/ツールのバージョンなど)
QuantX環境
あなたの回答
tips
プレビュー