bkvec_dt_min.py 文件源码

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

项目:pyktrader2 作者: harveywwu 项目源码 文件源码
def dual_thrust_sim( mdf, config):
    close_daily = config['close_daily']
    offset = config['offset']
    k = config['param'][0]
    win = config['param'][1]
    proc_func = config['proc_func']
    proc_args = config['proc_args']
    chan_func = config['chan_func']
    chan_high = eval(chan_func['high']['func'])
    chan_low  = eval(chan_func['low']['func'])
    tcost = config['trans_cost']
    min_rng = config['min_range']
    chan = config['chan']
    xdf = proc_func(mdf, **proc_args)
    tr= pd.concat([pd.rolling_max(xdf.high, win) - pd.rolling_min(xdf.close, win), 
                   pd.rolling_max(xdf.close, win) - pd.rolling_min(xdf.low, win)], 
                   join='outer', axis=1).max(axis=1)
    xdf['tr'] = tr
    xdf['chan_h'] = chan_high(xdf, chan, **chan_func['high']['args'])
    xdf['chan_l'] = chan_low(xdf, chan, **chan_func['low']['args'])
    #sar_param = config['sar_param']
    #sar = dh.SAR(xdf, **sar_param)
    #sar_signal = pd.Series(0, index = sar.index)
    #sar_signal[(sar < xdf['close'])] = 1
    #sar_signal[(sar > xdf['close'])] = -1
    #xdf['atr'] = dh.ATR(xdf, chan)
    xdata = pd.concat([xdf['tr'].shift(1), xdf['chan_h'].shift(1), xdf['chan_l'].shift(1),
                       xdf['open']], axis=1, keys=['tr','chan_h', 'chan_l', 'xopen'])
    mdf = mdf.join(xdata, how = 'left').fillna(method='ffill')
    rng = pd.DataFrame([min_rng * mdf['xopen'], k * mdf['tr']]).max()
    long_signal = pd.Series(np.nan, index = mdf.index)
    long_signal[(mdf['high'] >= mdf['xopen'] + rng) & (mdf['high'] >= mdf['chan_h']) ] = 1
    long_signal[(mdf['low'] <= mdf['xopen'] - rng) | (mdf['low'] <= mdf['chan_l'])] = 0
    if close_daily:
        long_signal[(mdf['min_id']>=config['exit_min'])] = 0
    long_signal = long_signal.shift(1)
    long_signal = long_signal.fillna(method='ffill').fillna(0)
    short_signal = pd.Series(np.nan, index = mdf.index)
    short_signal[(mdf['low'] <= mdf['xopen'] - rng) & (mdf['low'] <= mdf['chan_l']) ] = -1
    short_signal[(mdf['high'] >= mdf['xopen'] + rng) | (mdf['high'] >= mdf['chan_h'])] = 0
    if close_daily:
        short_signal[(mdf['min_id']>=config['exit_min'])] = 0
    short_signal = short_signal.shift(1)
    short_signal = short_signal.fillna(method='ffill').fillna(0)
    if len(mdf[(long_signal>0)&(short_signal<0)]) > 0:
        print "Warning: long and short signal happen at the same time"
    mdf['pos'] = long_signal + short_signal
    mdf.ix[-3:, 'pos'] = 0
    mdf['cost'] = abs(mdf['pos'] - mdf['pos'].shift(1)) * (offset + mdf['open'] * tcost)
    mdf['cost'] = mdf['cost'].fillna(0.0)
    mdf['traded_price'] = mdf.open + (mdf['pos'] - mdf['pos'].shift(1)) * offset
    closed_trades = backtest.simdf_to_trades1(mdf, slippage = offset )
    return (mdf, closed_trades)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号