def total(self, dfs, kt): #uid = self.uidKey % ( '_'.join(self.codes), self.klineType[:-1]) df0, df1 = dfs[self.mCodes[0]], dfs[self.mCodes[1]] df0 = df0.dropna(axis=0) df1 = df1.dropna(axis=0) if len(df0) != len(df1): #print('------------------change', kt, len(df0), len(df1)) if kt[-1] == 'm': if len(df0) > len(df1): df0 = df0[df0.index.isin(df1.index)] df1 = df1[df1.index.isin(df0.index)] else: df1 = df1[df1.index.isin(df0.index)] df0 = df0[df0.index.isin(df1.index)] elif len(df0) > len(df1): df0 = df0[df1.index[0]:] else: df1 = df1[df0.index[0]:] print(len(df0), len(df1)) c0, c1 = df0['close'], df1['close'] # 交易量差距 volrate = df0['volume'].mean() / df1['volume'].mean() # 涨跌一致性 diff0 = c0.diff().apply(lambda x: 1 if x > 0 else -1 if x<0 else 0) diff1 = c1.diff().apply(lambda x: 1 if x > 0 else -1 if x<0 else 0) df0 = df0.dropna(axis=0) df1 = df1.dropna(axis=0) ss = ((diff0+diff1)).apply(lambda x: 1 if x!=0 else 0) delta = ss.sum() / len(ss) # 波动比 s0 = ta.MA(c0,timeperiod=15).mean() sd0 = ta.STDDEV(c0, timeperiod=15, nbdev=1).mean() s1 = ta.MA(c1, timeperiod=15).mean() sd1 = ta.STDDEV(c1, timeperiod=15, nbdev=1).mean() std = sd0 * s1 / s0 / sd1 # # 跌涨标准差 dd0 = ta.STDDEV(c0.diff(), timeperiod=15, nbdev=1).mean() dd1 = ta.STDDEV(c1.diff(), timeperiod=15, nbdev=1).mean() diffstd = dd0 * s1 / s0 / dd1 # 协整 coint = sm.tsa.stattools.coint(c0, c1) # x相关性 relative = per(c0, c1) doc = { "code": self.codes[0], "code1": self.codes[1], "kline": self.klineType, "relative": relative, "samecount": len(df0), "samerate": delta, "diffstd": diffstd, "coint_1": 0 if np.isnan(coint[0]) else coint[0], "coint": 0 if np.isnan(coint[1]) else coint[1], "std": std, "vol": volrate, "type": "future" } print(doc) # 按时间截取并调整 print('kline load:', kt, self.codes, len(df0), len(df1)) return doc
def total(self, dfs, dfs2=None, scale=1, period=60): uid = self.uidKey % ("_".join(self.codes), str(period), str(scale), self.klineType[:-1], str(self.shiftScale)) df0, df1 = dfs[self.mCodes[0]], dfs[self.mCodes[1]] df0["rel_price"] = close = df0["close"] / df1["close"] df0["datetime"] = df0.index # 模拟滑点 num = len(df0) s0, s1 = self.shift[0], self.shift[1] p_l = df0["p_l"] = (df0["close"] + s0) / (df1["close"] - s1) p_h = df0["p_h"] = (df0["close"] - s0) / (df1["close"] + s1) close2 = dfs2[self.mCodes[0]]["close"] / dfs2[self.mCodes[1]]["close"] #ma = ta.MA(close, timeperiod=period) #df0["rel_std"] = sd = ta.STDDEV(close, timeperiod=period, nbdev=1) df0['ma'] = ma = df0.apply(lambda row: self.k_ma( row['datetime'], row['rel_price'], close2, period, 0), axis=1) df0['rel_std'] = sd = df0.apply(lambda row: self.k_ma( row['datetime'], row['rel_price'], close2, period, 1), axis=1) # 上下柜 top, lower = ma + scale * sd, ma - scale * sd # bullWidth df0["bullwidth"] = width = (4 * sd / ma * 100).fillna(0) # 近三分钟width变动 df0["widthDelta"] = ta.MA(width - width.shift(1), timeperiod=3).fillna(0) df0["delta"] = (p_l - p_h) / sd # 其他参数计算 min, max = ta.MINMAX(close, timeperiod=period) df0["atr"] = ta.WMA((max.dropna() - min.dropna()), timeperiod=period / 2) # 协整 result = sm.tsa.stattools.coint(df0["close"], df1["close"]) df0.fillna(0, inplace=True) isOpen, preDate, prePrice = 0, None, 0 doc, doc1, docs = {}, {}, [] for i in range(num): isRun = False if i < period and np.isnan(ma[i]): continue # 开仓 if isOpen == 0: # 大于上线轨迹 if p_h[i] >= top[i]: isOpen = -1 isRun = True elif p_l[i] <= lower[i]: isOpen = 1 isRun = True # 平仓 else: # 回归ma则平仓 或 超过24分钟 或到收盘时间 强制平仓 if (isOpen * ((p_h[i] if isOpen == 1 else p_l[i]) - ma[i])) >= 0: isOpen = 0 isRun = True # 止损 if isRun: doc, doc1 = self.order(df0.iloc[i], df1.iloc[i], isOpen, uid) if doc1 is not None: docs.append(doc) docs.append(doc1) res = pd.DataFrame(docs) #res.fillna(0,inplace=True) if len(res) > 0: if self.saveDetail: print(self.Train.tablename, len(res), 'save') self.Train.insertAll(docs) return { "scale": scale, "code": self.codes[0], "code1": self.codes[1], "period": period, "count": int(len(docs) / 4), "amount": (doc["price"] * doc["vol"] + doc1["price"] * doc1["vol"]) if doc is not None else 0, "price": doc["price"] / doc1["price"], "income": res["income"].sum(), "uid": uid, "relative": per(df0["close"], df1["close"]), "std": res['rel_std'].mean(), "shift": (p_l - p_h).mean(), "delta": res['delta'].mean(), "coint": 0 if np.isnan(result[1]) else result[1], "createdate": public.getDatetime() } else: return None
def total(self, dfs, dfs2=None, period=60): # 计算参数 df0, df1 = dfs[self.mCodes[0]], dfs[self.mCodes[1]] df0["rel_price"] = close = df0["close"] / df1["close"] df0["datetime"] = df0.index s0, s1 = self.shift[0], self.shift[1] p_l = df0["p_l"] = (df0["close"] + s0) / (df1["close"] - s1) p_h = df0["p_h"] = (df0["close"] - s0) / (df1["close"] + s1) if self.isSimTickUse: # 调用复合apply函数计算混合参数 close2 = dfs2[self.mCodes[0]]["close"] / dfs2[self.mCodes[1]]["close"] df0_1 = df0.apply(lambda row: self.k_ma(row['datetime'], row['rel_price'], close2, period), axis=1) df0 = pd.concat([df0, df0_1], axis=1) else: df0["ma"] = ma = ta.MA(close, timeperiod=period) df0["std"] = std = ta.STDDEV(close, timeperiod=period, nbdev=1) # 上下柜 # bullWidth df0["bullwidth"] = width = (4 * std / ma * 100).fillna(0) # 近三分钟width变动 df0["widthDelta"] = wd1 = ta.MA(width - width.shift(1), timeperiod=3).fillna(0) df0["widthDelta2"] = wd2 = wd1 - wd1.shift(1) df0["wd2m"] = wd2 * wd2.shift(1) # 相对波动 df0['delta'] = (p_l - p_h) / df0['std'] # 协整 coint = sm.tsa.stattools.coint(df0["close"], df1["close"]) # x相关性 relative = per(df0["close"], df1["close"]) # 循环 scale docs = [] for scale in self.scaleList: for conds in self.iterCond(): uid = self.uidKey % ( '_'.join(self.codes), str(period), str(scale), self.klineType[:-1], conds) self.stopTimeDiff = self.stopTimeLine * period * int(self.klineType[:-1]) # 计算高低线值 df0["top"], df0["lower"] = df0['ma'] + (scale-self.scaleDiff) * df0['std'], df0['ma'] - (scale+self.scaleDiff) * df0['std'] # df0.fillna(0, inplace=True) tot = self.detect(df0, df1, period=period, uid=uid) if tot is not None and tot['amount'] != 0: tot.update( { "scale": scale, "code": self.codes[0], "code1": self.codes[1], "period": period, "uid": uid, "relative": relative, "shift": (p_l - p_h).mean(), "coint": 0 if np.isnan(coint[1]) else coint[1], "createdate": public.getDatetime() } ) docs.append(tot) return docs
def total(self, df0, df1=None, scale=1, period=60): uid = self.uid df0["rel_price"] = close = df0["close"] / df1["close"] df0["datetime"] = df0.index s0, s1 = self.shift[0], self.shift[1] p_l = df0["p_l"] = (df0["close"] + s0) / (df1["close"] - s1) p_h = df0["p_h"] = (df0["close"] - s0) / (df1["close"] + s1) num = len(df0) ma = ta.MA(close[0:num], timeperiod=period) df0["std"] = std = ta.STDDEV(close, timeperiod=period, nbdev=1) # 上下柜 top, lower = ma + scale * std, ma - scale * std # bullWidth df0["bullwidth"] = width = (4 * std / ma * 100).fillna(0) # 近三分钟width变动 df0["widthDelta"] = wd1 = ta.MA(width - width.shift(1), timeperiod=3).fillna(0) df0["delta"] = (p_l - p_h) / std wd2 = wd1 - wd1.shift(1) wd2m = wd2 * wd2.shift(1) # 其他参数计算 min, max = ta.MINMAX(close, timeperiod=period) df0["atr"] = ta.WMA((max.dropna() - min.dropna()), timeperiod=period / 2) # 协整 result = sm.tsa.stattools.coint(df0["close"], df1["close"]) df0.fillna(0, inplace=True) isOpen, preDate, prePrice = 0, None, 0 doc, doc1, docs = {}, {}, [] sline, wline = self.stopTimeDiff, self.widthDeltaLine for i in range(period, num): isRun, isstop = False, 0 # 开仓2 if isOpen == 0: cond1, cond2 = True, False if wline > 0: # 布林宽带变化率 cond1 = not ((wd1[i] > wline) or (wd2[i] > (wline / 2))) # 最大值 cond2 = wd2m[i] < 0 # 突变状态开始 # 大于上线轨迹 if p_h[i] >= top[i] and not cond1: isOpen = -1 isRun = True elif p_l[i] <= lower[i] and not cond1: isOpen = 1 isRun = True elif p_h[i] >= top[i] and cond1 and cond2: isOpen = -2 isRun = True elif p_l[i] <= lower[i] and cond1 and cond2: isOpen = 2 isRun = True # 平仓 else: # 回归ma则平仓 或 超过24分钟 或到收盘时间 强制平仓 if (isOpen * ((p_h[i] if isOpen == 1 else p_l[i]) - ma[i])) >= 0: isOpen = 0 isRun = True # 止损 elif sline > 0 and self.preNode and len(self.preNode) == 2: timediff = public.timeDiff( df0['datetime'].values, self.preNode[0]['createdate']) / 60 if timediff > sline: isOpen, isstop = 0, 1 isRun = True if isRun: doc, doc1 = self.order(df0.iloc[i], df1.iloc[i], isOpen, uid, isstop=isstop) if doc1 is not None: docs.append(doc) docs.append(doc1) res = pd.DataFrame(docs).fillna(0).replace(np.inf, 0).replace(-np.inf, 0) if self.saveDetail: self.Train.insertAll(res.to_dict(orient='records')) if len(res) > 0: return { "scale": scale, "code": self.codes[0], "code1": self.codes[1], "period": period, "count": int(len(docs) / 4), "amount": (doc["price"] * doc["vol"] + doc1["price"] * doc1["vol"]) if doc is not None else 0, "price": doc["price"] / doc1["price"], "income": res["income"].sum(), "uid": uid, "relative": per(df0["close"], df1["close"]), "std": std.mean(), "shift": (p_l - p_h).mean(), "delta": (p_l - p_h).mean() / std.mean(), "coint": 0 if np.isnan(result[1]) else result[1], "createdate": public.getDatetime() } else: return None