bktest_split_dt.py 文件源码

python
阅读 26 收藏 0 点赞 0 评论 0

项目:pyktrader2 作者: harveywwu 项目源码 文件源码
def run_vec_sim(self):
        xdf = self.proc_func(self.df, **self.proc_args)
        if self.win == -1:
            tr= pd.concat([xdf.high - xdf.low, abs(xdf.close - xdf.close.shift(1))], 
                          join='outer', axis=1).max(axis=1)
        elif self.win == 0:
            tr = pd.concat([(pd.rolling_max(xdf.high, 2) - pd.rolling_min(xdf.close, 2)) * self.multiplier, 
                            (pd.rolling_max(xdf.close, 2) - pd.rolling_min(xdf.low, 2)) * self.multiplier,
                            xdf.high - xdf.close, 
                            xdf.close - xdf.low], 
                            join='outer', axis=1).max(axis=1)
        else:
            tr= pd.concat([pd.rolling_max(xdf.high, self.win) - pd.rolling_min(xdf.close, self.win), 
                            pd.rolling_max(xdf.close, self.win) - pd.rolling_min(xdf.low, self.win)], 
                            join='outer', axis=1).max(axis=1)
        xdf['tr'] = tr
        xdf['chan_h'] = self.chan_high(xdf, self.chan, **self.chan_func['high']['args'])
        xdf['chan_l'] = self.chan_low(xdf, self.chan, **self.chan_func['low']['args'])
        xdf['atr'] = dh.ATR(xdf, self.machan)
        xdf['ma'] = pd.rolling_mean(xdf.close, self.machan)
        xdf['rng'] = pd.DataFrame([self.min_rng * xdf['open'], self.k * xdf['tr'].shift(1)]).max()
        xdf['upper'] = xdf['open'] + xdf['rng'] * (1 + (xdf['open'] < xdf['ma'].shift(1))*self.f)
        xdf['lower'] = xdf['open'] - xdf['rng'] * (1 + (xdf['open'] > xdf['ma'].shift(1))*self.f)
        xdata = pd.concat([xdf['upper'], xdf['lower'],
                           xdf['chan_h'].shift(1), xdf['chan_l'].shift(1),
                           xdf['open']], axis=1, keys=['upper','lower', 'chan_h', 'chan_l', 'xopen']).fillna(0)
        mdf = self.df.join(xdata, how = 'left').fillna(method='ffill')
        mdf['dt_signal'] = np.nan
        if self.price_mode == "HL":
            up_price = mdf['high']
            dn_price = mdf['low']
        elif self.price_mode == "TP":
            up_price = (mdf['high'] + mdf['low'] + mdf['close'])/3.0
            dn_price = up_price
        elif self.price_mode == "CL":
            up_price = mdf['close']
            dn_price = mdf['close']
        else:
            print "unsupported price mode"
        mdf.ix[up_price >= mdf['upper'], 'dt_signal'] = 1
        mdf.ix[dn_price <= mdf['lower'], 'dt_signal'] = -1
        if self.close_daily:
            mdf.ix[ mdf['min_id'] >= self.exit_min, 'dt_signal'] = 0
        addon_signal = copy.deepcopy(mdf['dt_signal'])
        mdf['dt_signal'] = mdf['dt_signal'].fillna(method='ffill').fillna(0)
        mdf['chan_sig'] = np.nan
        if combo_signal:
            mdf.ix[(up_price >= mdf['chan_h']) & (addon_signal > 0), 'chan_sig'] = 1
            mdf.ix[(dn_price <= mdf['chan_l']) & (addon_signal < 0), 'chan_sig'] = -1
        else:
            mdf.ix[(mdf['high'] >= mdf['chan_h']), 'chan_sig'] = 1
            mdf.ix[(mdf['low'] <= mdf['chan_l']), 'chan_sig'] = -1
        mdf['chan_sig'] = mdf['chan_sig'].fillna(method='ffill').fillna(0)
        pos =  mdf['dt_signal'] * (self.unit[0] + (mdf['chan_sig'] * mdf['dt_signal'] > 0) * self.unit[1])
        mdf['pos'] = pos.shift(1).fillna(0)
        mdf.ix[-3:, 'pos'] = 0
        mdf['cost'] = abs(mdf['pos'] - mdf['pos'].shift(1)) * (self.offset + mdf['open'] * self.tcost)
        mdf['cost'] = mdf['cost'].fillna(0.0)
        mdf['traded_price'] = mdf['open']
        self.closed_trades = backtest.simdf_to_trades1(mdf, slippage = self.offset )
        return mdf, self.closed_trades
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号