def order(self, n0, mode, uid, df0, isstop=0): # BS 配置文件,查询ratio 和 每手吨数 b0 = self.BS[self.mCode] if mode != 0: self.batchId = uuid.uuid1() # 交易量 if self.iniVolume != 0: hands = self.iniVolume elif np.isnan(n0['atr']) : hands = int(self.iniAmount/10/n0['close']/b0["contract_multiplier"]) else: hands = int(self.iniAmount * self.stopLine / 2 / n0['atr'] / b0["contract_multiplier"]) v0 = hands * b0["contract_multiplier"] # 费率 fee0 = (hands * b0["ratio"] * 1.1) if b0["ratio"] > 0.5 else ((b0["ratio"] * 1.1) * n0["close"] * v0) ps = n0["close"] amount = v0 * ps * float(b0['margin_rate']) doc = copy.deepcopy(n0.to_dict()) doc.update({ "createdate": n0["datetime"], "code": self.codes[0], "pid": self.mCode, "price": ps, "vol": self.preNode[0]["vol"] if self.preNode else v0, "hands": self.preNode[0]["hands"] if self.preNode else hands, "amount": amount if not self.preNode else self.preNode[0]["amount"], "mode": int(mode) if not self.preNode else -self.preNode[0]["mode"], "isopen": 0 if mode == 0 else 1, "fee": fee0, "income": 0, "isstop": isstop, "options": int(n0['options']) if 'options' in n0 else 0, "atr": n0['atr'] if 'atr' in n0 else 0, "macd": n0['ma'] if 'ma' in n0 else 0, "rel_std": n0["std"] if 'std' in n0 else 0, "delta": n0['diss'] if 'diss' in n0 else 0, "batchid": self.batchId, "diff": 0 if mode != 0 else self.Rice.timeDiff(str(self.preNode[0]['createdate']), str(n0["datetime"])), "uid": uid }) if mode == 0 and self.preNode: p0 = self.preNode[0] doc['income'], doc['highIncome'], doc['lowIncome'] = self.calcIncome(n0, p0, df0) doc["diff"] = int(public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) self.preNode = None else: doc["income"] = -doc["fee"] self.preNode = [doc] return doc
def order(self, n0, n1, mode, uid, df0, isstop=0): # baseInfo 配置文件,查询ratio 和 每手吨数 b0 = self.baseInfo[self.mCodes[0]] if mode != 0: self.batchId = uuid.uuid1() # 交易量 v0 = self.iniVolume * b0["contract_multiplier"] # 费率 fee0 = (self.iniVolume * b0["ratio"]) if b0["ratio"] > 0.5 else ((b0["ratio"]) * n0["close"] * v0) type = mode if not self.preNode else -self.preNode[0]["mode"] doc = { "createdate": n0["datetime"], "code": self.codes[0], "price": n0["close"], "vol": self.preNode[0]["vol"] if self.preNode else v0, "mode": int(type), "isopen": 0 if mode == 0 else 1, "fee": fee0, "income": 0, "isstop": isstop, "rel_price": n0["rel_price"], "rel_std": n0["std"], "atr": n0['atr'] if 'atr' in n0 else 0, "batchid": self.batchId, 'p_l': n0["p_l"], 'p_h': n0["p_h"], #'mastd': n0['pow'], #'macd2d':n0['macd2d'], "method": self.stage, "diff": 0, "uid": uid } if mode == 0: if self.preNode is not None: p0 = self.preNode[0] doc['income'], doc['highIncome'], doc[ 'lowIncome'] = self.calcIncome(n0, p0, df0) doc["diff"] = int( public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) self.preNode = None else: doc["income"] = -doc["fee"] self.preNode = [doc] self.mon_saveTick(n0, doc) self.records.append(doc) return True
def order(self, n0, n1, mode, uid, df0, isstop=0): # baseInfo 配置文件,查询ratio 和 每手吨数 b0 = self.baseInfo[self.mCodes[0]] if mode != 0: self.batchId = uuid.uuid1() # 交易量 v0 = self.iniVolume * b0["contract_multiplier"] # 费率 fee0 = (self.iniVolume * b0["ratio"]) if b0["ratio"] > 0.5 else ((b0["ratio"]) * n0["close"] * v0) doc = { "createdate": n0["datetime"], "code": self.codes[0], "price": n0["close"], "vol": self.preNode[0]["vol"] if self.preNode else v0, "mode": mode if not self.preNode else -self.preNode[0]["mode"], "isopen": 0 if mode == 0 else 1, "fee": fee0, "income": 0, "isstop": isstop, "rel_price": n0["rel_price"], "rel_std": n0["std"], "bullwidth": n0["width"], #"widthDelta": n0["widthDelta"], #"price_diff": n0["widthDelta2"], "shift": n0["slope"], "delta": n0["rsi"], "batchid": self.batchId, 'p_l': n0["p_l"], 'p_h': n0["p_h"], #'macd': n0['macd'], #'mastd': n0['pow'], #'macd2d':n0['macd2d'], "diff": 0, "uid": uid } if mode == 0: if self.preNode is not None: p0 = self.preNode[0] doc['income'], doc['highIncome'], doc[ 'lowIncome'] = self.calcIncome(n0, p0, df0) doc["diff"] = int( public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) self.preNode = None else: doc["income"] = -doc["fee"] self.preNode = [doc] return doc
def order(self, n0, mode, uid): # baseInfo 配置文件,查询ratio 和 每手吨数 b0 = self.baseInfo[self.mCodes[0]] if mode != 0: self.batchId = uuid.uuid1() # 交易量 v0 = self.iniVolume * b0["contract_multiplier"] # 费率 fee0 = (self.iniVolume * b0["ratio"]) if b0["ratio"] > 0.5 else ((b0["ratio"]) * n0["close"] * v0) doc = { "createdate": n0["datetime"], "code": self.codes[0], "price": n0["close"], "vol": self.preNode["vol"] if self.preNode else v0, "mode": mode if not self.preNode else -self.preNode["mode"], "isopen": 0 if mode == 0 else 1, "fee": fee0, "income": 0, "rel_price": n0["rel_price"], "rel_std": n0["std"], "bullwidth": n0["bullwidth"], "widthDelta": n0["widthDelta"], "delta": n0["delta"], "batchid": self.batchId, "atr": n0["atr"], 'p_l': n0["p_l"], 'p_h': n0["p_h"], "diff": 0, "uid": uid } if mode == 0 and self.preNode: p0 = self.preNode doc["income"] = p0["mode"] * ( n0["close"] - p0["price"] - 2 * p0["mode"] * self.shift[0]) * p0["vol"] - p0["fee"] doc["diff"] = int( public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) self.preNode = None else: doc["income"] = -doc["fee"] self.preNode = doc return doc
def closeOrder(self, n0, p0, df0, amount, isstop): doc = copy.deepcopy(p0) doc.update({ "createdate": n0["datetime"], "price": n0['close'], "amount": amount, "mode": -p0['mode'], "isopen": 0, "isstop": isstop }) doc['income'], doc['highIncome'], doc['lowIncome'] = self.calcIncome( n0, p0, df0) doc["diff"] = int( public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) return doc
def order(self, n0, mode, uid, df0, isstop=0, startPrice=None): # BS 配置文件,查询ratio 和 每手吨数 b0 = self.BS[self.mCode] if mode != 0: self.batchId = uuid.uuid1() # 交易量 v0 = self.iniVolume * b0["contract_multiplier"] # 费率 fee0 = (self.iniVolume * b0["ratio"] * 1.1) if b0["ratio"] > 0.5 else ((b0["ratio"] * 1.1) * n0["close"] * v0) ps = startPrice if startPrice is not None else n0["close"] amount = v0 * ps * float(b0['margin_rate']) doc = { "createdate": n0["datetime"], "code": self.codes[0], "price": ps, "vol": self.preNode[0]["vol"] if self.preNode else v0, "hands": self.iniVolume, "amount": amount if not self.preNode else self.preNode[0]["amount"], "mode": int(mode) if not self.preNode else -self.preNode[0]["mode"], "isopen": 0 if mode == 0 else 1, "fee": fee0, "income": 0, "isstop": isstop, "shift": n0['slope'] if 'slope' in n0 else 0, "rel_std": n0["std"] if 'std' in n0 else 0, "delta": n0['diss'] if 'diss' in n0 else 0, "batchid": self.batchId, "diff": 0 if mode != 0 else self.Rice.timeDiff(str(self.preNode[0]['createdate']), str(n0["datetime"])), "uid": uid } if mode == 0 and self.preNode: p0 = self.preNode[0] doc['income'], doc['highIncome'], doc['lowIncome'], doc['atr'], doc['macd'] = self.calcIncome(n0, p0, df0) doc["diff"] = int(public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) self.preNode = None else: doc["income"] = -doc["fee"] self.preNode = [doc] return doc
def setTimeArea(self, nightEnd): # 设置交易对的收盘时间和间隔区间 self.TimeArea, self.TimeDiffArea = [], [] for n in self.iniTimeArea: self.TimeArea.append(n) for n in self.iniTimeDiffArea: self.TimeDiffArea.append(n) date = public.getDate() if ("21:00:00" < nightEnd < "23:59:00") or ("00:00:00" < nightEnd < "05:00:00"): diff = int( public.timeDiff(date + ' ' + '09:00:00', date + ' ' + nightEnd[0:8]) / 60) # 夜盘隔日 if diff < 0: diff = 24 * 60 + diff self.TimeArea.append(("21:00:00", nightEnd[0:8], 720 - diff)) self.TimeDiffArea.append(("07:00:00", diff)) else: self.TimeDiffArea[1] = ('16:00', 18 * 60)
def timeDiff(self, preDate, curDate=None, quick=0): # if curDate is None: curDate = public.getDatetime(style='%Y-%m-%d %H:%M:%S') preDate = str(preDate) if preDate.find('.') > -1: preDate = preDate[:preDate.find(".")] elif len(preDate) == 8: preDate = public.parseTime(preDate, format='%Y%m%d', style='%Y-%m-%d %H:%M:%S') diff = public.timeDiff(str(curDate), preDate) / 60 # 快速比较 if quick > 0 and diff < quick: return 1 # 间隔小于120,为非跨区 if diff < 120: return int(diff) # 间隔周末 if diff > (24 * 60 * 2): diff -= 24 * 60 * 2 # 日内跨区 m0, m1 = (public.parseTime(d, style='%H:%M:%S') for d in [preDate, curDate]) for ta in self.TimeDiffArea[:-1]: if m0 < ta[0] < m1: diff -= ta[1] if diff < 120: return int(diff) # 夜盘隔日 date = public.parseTime(curDate, style='%Y-%m-%d') ta = self.TimeDiffArea[-1] taTime = str(date) + ' ' + ta[0] if preDate < taTime < curDate: diff -= ta[1] return int(diff)
def main(): action = { "kline": 1, "area":0 } if action["kline"] == 1: obj = train_future_jump_sg() obj.Pool() if action["area"] == 1: obj = train_future_jump_sg() Rice = interface_Rice() for t in [1, 2]: lists = obj.getList(t) df = pd.DataFrame(lists) if t==1: df['diff'] = df.apply(lambda r: public.timeDiff(r['enddate'], r['startdate'])//86400, axis=1) else: df['diff'] = df.apply(lambda r: public.dayDiff(r['enddate'], r['startdate']), axis=1) file = Rice.basePath + 'area_%s_sg.csv' % (t) df.to_csv(file, index=0, columns=['code', 'name', 'startdate', 'enddate', 'diff'])
def timeDiff(self, t1, t2): diff = public.timeDiff( t1 + " 00:00:00", str(t2) + " 00:00:00") / 60.0 / 60.0 / 24.0 / 365.0 return 1 if diff == 0 else diff
def order(self, n0, n1, mode, uid, isstop=0): # baseInfo 配置文件,查询ratio 和 每手吨数 b0, b1 = self.baseInfo[self.mCodes[0]], self.baseInfo[self.mCodes[1]] if mode != 0: self.batchId = uuid.uuid1() # 交易量 v0 = self.iniVolume * b0["contract_multiplier"] v1 = int(v0 * n0["close"] / n1["close"] / b1["contract_multiplier"]) * b1["contract_multiplier"] # 费率 fee0 = (self.iniVolume * b0["ratio"]) if b0["ratio"] > 0.5 else ((b0["ratio"]) * n0["close"] * v0) fee1 = (v1 / b1["contract_multiplier"] * b1["ratio"]) if b1["ratio"] > 0.5 else (b1["ratio"] * n1["close"] * v1) doc = { "createdate": n0["datetime"], "code": self.codes[0], "price": n0["close"], "vol": self.preNode[0]["vol"] if self.preNode else v0, "mode": mode if not self.preNode else -self.preNode[0]["mode"], "isopen": 0 if mode == 0 else 1, "fee": fee0, "income": 0, "isstop": isstop, "rel_price": n0["rel_price"], "rel_std": n0["std"], "bullwidth": n0["bullwidth"], "widthDelta": n0["widthDelta"], "delta": n0["delta"], "batchid": self.batchId, 'p_l': n0["p_l"], 'p_h': n0["p_h"], "diff": 0 if mode!=0 else self.Rice.timeDiff(str(self.preNode[0]['createdate']), str(n0["datetime"])), "uid": uid } doc1 = {} doc1.update(doc) doc1.update({ "code": self.codes[1], "price": n1["close"], "vol": self.preNode[1]["vol"] if self.preNode else v1, "mode": -mode if not self.preNode else -self.preNode[1]["mode"], "fee": fee1, }) if mode == 0 and self.preNode: p0, p1 = self.preNode[0], self.preNode[1] sign = p0["mode"] / abs(p0["mode"]) doc["income"] = sign * (n0["close"] - p0["price"] - 2 * sign * self.shift[0]) * p0["vol"] - p0[ "fee"] doc1["income"] = - sign * (n1["close"] - p1["price"] + 2 * sign * self.shift[1]) * p1["vol"] - p1[ "fee"] doc["diff"] = int(public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) self.preNode = None else: doc["income"] = -doc["fee"] doc1["income"] = -doc1["fee"] self.preNode = (doc, doc1) return doc, doc1
def order(self, n0, n1, mode, uid, df0, isstop=0): # baseInfo 配置文件,查询ratio 和 每手吨数 b0 = self.baseInfo[self.mCodes[0]] if mode != 0: self.batchId = uuid.uuid1() dp = n0['td_d'] if mode > 0 else n0['tu_d'] if np.isnan(dp) or dp == n0['close']: dp = n0['close'] * (1 - 0.0025) if self.preNode is not None: iniVolume = self.preNode[0]['hands'] # 交易量 else: iniVolume = int(self.iniAmount * self.stopLine / abs(n0['close'] - dp) / b0["contract_multiplier"]) if iniVolume == 0: iniVolume = 1 v0 = iniVolume * b0["contract_multiplier"] # 费率 fee0 = (iniVolume * b0["ratio"]) if b0["ratio"] > 0.5 else ((b0["ratio"]) * n0["close"] * v0) type = mode if not self.preNode else -self.preNode[0]["mode"] doc = { "createdate": n0["datetime"], "code": self.codes[0], "price": n0["close"], "vol": self.preNode[0]["vol"] if self.preNode else v0, "mode": int(type), "isopen": 0 if mode == 0 else 1, "fee": fee0, "income": 0, "isstop": isstop, "rel_price": n0["rel_price"], "atr": n0['atr'] if 'atr' in n0 else 0, "batchid": self.batchId, 'p_l': n0["p_l"], 'p_h': n0["p_h"], 'hands': iniVolume, 'stop_price': 0 if mode == 0 else n0['td_d'] if mode > 0 else n0['tu_d'], 'method': self.method, "diff": 0, "uid": uid } if mode == 0: if self.preNode is not None: p0 = self.preNode[0] doc['income'], doc['highIncome'], doc[ 'lowIncome'] = self.calcIncome(n0, p0, df0) doc["diff"] = int( public.timeDiff(str(n0['datetime']), str(p0['createdate'])) / 60) self.preNode = None else: doc["income"] = -doc["fee"] self.preNode = [doc] self.records.append(doc) return doc
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