356 字
2 分钟
vectorbt学习_05TradingSessions
此demo主要是演示如何对数据进行按日切分的,如果进行日内策略可参考,类似,也可以实现数据按照自然月或季度回测的目标。
生成原始随机series序列
# Generate sample priceprice_idx = pd.date_range('2018-01-01 12:00:00', periods=48, freq='H')np.random.seed(42)price = pd.Series(np.random.uniform(size=price_idx.shape), index=price_idx)print(price)print(price.shape)
2018-01-03 02:00:00 0.6842332018-01-03 03:00:00 0.4401522018-01-03 04:00:00 0.1220382018-01-03 05:00:00 0.4951772018-01-03 06:00:00 0.0343892018-01-03 07:00:00 0.9093202018-01-03 08:00:00 0.2587802018-01-03 09:00:00 0.6625222018-01-03 10:00:00 0.3117112018-01-03 11:00:00 0.520068Freq: H, dtype: float64(48,)数据补齐
# Sessions must be equal - fill missing dates# Fill on first date before 12:00 and on last date after 11:00first_date = price.index[0].date()last_date = price.index[-1].date()+timedelta(days=1)filled_idx = pd.date_range(first_date, last_date, freq='H')filled_price = price.reindex(filled_idx) #等于在原数据基础上扩展新增了部分数据print(filled_price)
2018-01-01 00:00:00 NaN2018-01-01 01:00:00 NaN2018-01-01 02:00:00 NaN2018-01-01 03:00:00 NaN2018-01-01 04:00:00 NaN ..2018-01-03 20:00:00 NaN2018-01-03 21:00:00 NaN2018-01-03 22:00:00 NaN2018-01-03 23:00:00 NaN2018-01-04 00:00:00 NaNFreq: H, Length: 73, dtype: float64 #数据长度从48变成73筛选交易时间内行情
# Remove dates that are outside of trading sessionssession_price_idx = filled_price.between_time('9:00', '17:00', include_end=False).indexsession_price = filled_price.loc[session_price_idx]print(session_price)筛选出start_idxs,end_idxs,基于此切分session
# Select first and last ticks of each trading session and split price into ranges between those ticksstart_idxs = session_price.index[session_price.index.hour == 9]end_idxs = session_price.index[session_price.index.hour == 16]price_per_session, _ = session_price.vbt(freq='1H').range_split(start_idxs=start_idxs, end_idxs=end_idxs)print(price_per_session)
split_idx 0 1 20 NaN 0.139494 0.6625221 NaN 0.292145 0.3117112 NaN 0.366362 0.5200683 0.374540 0.456070 NaN4 0.950714 0.785176 NaN5 0.731994 0.199674 NaN6 0.598658 0.514234 NaN7 0.156019 0.592415 NaN可视化效果
session_price.vbt(freq='1H').range_split(start_idxs=start_idxs, end_idxs=end_idxs,plot=True)
用于运行策略
# Run your strategy (here using random signals)entries, exits = pd.DataFrame.vbt.signals.generate_random_both(price_per_session.shape, n=2, seed=42)pf = vbt.Portfolio.from_signals(price_per_session, entries, exits, freq='1H')print(pf.total_return())部分信息可能已经过时