Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
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