LOADING
356 字
2 分钟
vectorbt学习_05TradingSessions

此demo主要是演示如何对数据进行按日切分的,如果进行日内策略可参考,类似,也可以实现数据按照自然月或季度回测的目标。

生成原始随机series序列#

# Generate sample price
price_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.684233
2018-01-03 03:00:00 0.440152
2018-01-03 04:00:00 0.122038
2018-01-03 05:00:00 0.495177
2018-01-03 06:00:00 0.034389
2018-01-03 07:00:00 0.909320
2018-01-03 08:00:00 0.258780
2018-01-03 09:00:00 0.662522
2018-01-03 10:00:00 0.311711
2018-01-03 11:00:00 0.520068
Freq: H, dtype: float64
(48,)

数据补齐#

# Sessions must be equal - fill missing dates
# Fill on first date before 12:00 and on last date after 11:00
first_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 NaN
2018-01-01 01:00:00 NaN
2018-01-01 02:00:00 NaN
2018-01-01 03:00:00 NaN
2018-01-01 04:00:00 NaN
..
2018-01-03 20:00:00 NaN
2018-01-03 21:00:00 NaN
2018-01-03 22:00:00 NaN
2018-01-03 23:00:00 NaN
2018-01-04 00:00:00 NaN
Freq: H, Length: 73, dtype: float64 #数据长度从48变成73

筛选交易时间内行情#

# Remove dates that are outside of trading sessions
session_price_idx = filled_price.between_time('9:00', '17:00', include_end=False).index
session_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 ticks
start_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 2
0 NaN 0.139494 0.662522
1 NaN 0.292145 0.311711
2 NaN 0.366362 0.520068
3 0.374540 0.456070 NaN
4 0.950714 0.785176 NaN
5 0.731994 0.199674 NaN
6 0.598658 0.514234 NaN
7 0.156019 0.592415 NaN

可视化效果

session_price.vbt(freq='1H').range_split(start_idxs=start_idxs, end_idxs=end_idxs,plot=True)

del01

用于运行策略#

# 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())
vectorbt学习_05TradingSessions
/posts/quant/4d9f3c0c/
作者
思想的巨人
发布于
2023-10-20
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时