量化投资回测教学之掌握矢量化回测
1. 什么是回测?
回测用于模拟交易策略的过去表现。
回测的核心概念是通过回溯时间来模拟给定的交易策略,并像过去一样执行交易。产生的利润通常通过一些指标(例如最大回撤、夏普比率、年化回报等)与基准表现进行比较。根据策略的性质,应该使用不同的基准和指标,但这本身就是一个完整的主题,所以我不会在这里详细介绍。
回测用于模拟交易策略的过去表现。回测的核心概念是通过回溯时间来模拟给定的交易策略,并像过去一样执行交易。产生的利润通常通过一些指标(例如最大回撤、夏普比率、年化回报等)与基准表现进行比较。根据策略的性质,应该使用不同的基准和指标,但这本身就是一个完整的主题,所以我不会在这里详细介绍。
回测不是过去表现的准确指标,不应该用作研究工具,尤其是在没有经验的手中。有趣的是,回测并不是一个很好的指标,如果你能回到过去,你今天会有多富有。抛开时间旅行不谈,几乎不可能准确地复制过去的表现,因为有许多因素过于复杂而无法准确建模(滑点、交易的市场影响等)。
2. 回测不是什么
回测不是过去表现的准确指标,不应该用作研究工具,尤其是在没有经验的手中。
有趣的是,回测并不是一个很好的指标,如果你能回到过去,你今天会有多富有。抛开时间旅行不谈,几乎不可能准确地复制过去的表现,因为有许多因素过于复杂而无法准确建模(滑点、交易的市场影响等)。此外,在没有经验的人中,回测可能充满偏差(例如,前瞻偏差、幸存者偏差等),这会使策略看起来比实际情况好得多(参见第 5.3 节)。 最后,回测不是研究工具。不要仅仅因为在回测中看起来更好就随意更改您的策略参数。您应该将市场的历史表现视为随机变量的许多可能实现之一。在没有合理经济逻辑的情况下将您的参数拟合到回测将不可避免地导致过度拟合。
3. 事件驱动与向量化回测
矢量化回测比事件驱动回测快得多,应该用于策略研究的探索阶段。 回测策略有两种主要方法: (i)事件驱动
事件驱动的回测通常涉及使用随时间迭代的循环,模拟根据市场信号发送订单的代理。这种基于循环的方法非常灵活,允许您模拟订单执行中的潜在延迟、滑点成本等。
(ii)矢量化。
相反,矢量化回测收集策略相关数据并将它们组织成向量和矩阵,然后通过线性代数方法(您的计算机非常擅长的东西)进行处理,以模拟过去的表现。由于线性代数的表达能力,向量化回测比事件驱动回测快得多,尽管它缺乏灵活性。通常,矢量化回测更适合初始探索性策略分析,而事件驱动回测适合更深入的分析。
Pandas 回测交易策略 — 矢量化回测
1-读取股票数据
df = pd.read_csv('000001.csv',index_col=0)
计算日收益率
计算交易信号 和 收益率
w1=22
w2=55
df['close'] = df['收盘']
df['SMA1'] = df['收盘'].rolling(w1).mean()
df['SMA2'] = df['收盘'].rolling(w2).mean()
这里我们使用收益率
w1=22
w2=55
df['return'] = df['收盘'].pct_change()
df['asset_return'] = df['收盘'].pct_change()
df['SMA1'] = df['收盘'].rolling(w1).mean()
df['SMA2'] = df['收盘'].rolling(w2).mean()
df['asset_return'] = df['asset_return'].fillna(value=0)
计算持仓
df['position'] = np.where(df['SMA1'] > df['SMA2'], 1, 0)
关于前瞻偏差的快速说明
在上面的例子中,位置向量/矩阵总是移动 1 个时间步长。这样做是为了避免前瞻性偏差,这会使策略看起来比现实好得多。这个想法是:在时间t,您有一个包含直到并包括t信息的信号,但您只能在t+1时实际交易该信号(例如,如果您的信号包含周一晚上发布的公司的收益信息,那么您只能在周二早上交易该信息)。
如下所示,前瞻性偏差会使策略看起来比现实更有希望(尤其是对于“动量”策略)。
这里我们获取到了净值曲线
模拟手续费
rate = 0.00025 # 万一手续费
有无手续费的对比
评估延迟的稳健性
使用矢量化回测,更容易评估策略对延迟的鲁棒性(即在信号后 T 个时间步长打开您的交易)。然而,这是一种在高频交易级别更有用的分析,其中延迟会严重影响性能。
StudyQuant介绍
StudyQuant - 站在巨人的肩膀学习,项目制的在线量化投资学院。本学院基于新颖技术和人工智能,打造量化交易体系和多元化量化投资策略,并在多个交易市场进行自营交易。我们旨在帮助零基础的学员,通过几个月的时间,系统掌握量化投资的专业技能,助力拿到高薪Offer。
谢谢大家收看免费进量化群 V: studyquant88
|