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
评论列表
文章目录