Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
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'])
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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