向量化回测

本文介绍了向量化回测在金融领域,特别是人工智能交易策略中的应用。通过特斯拉CEO Elon Musk对未来自动驾驶的展望引入,讨论了在股市中利用向量化回测技术评估交易策略的重要性。文章通过实例展示了如何使用Python进行向量化回测,包括基于简单移动平均线(SMA)策略和深度学习(DNN)策略的回测。在回测过程中,考虑了交易成本对策略收益的影响,并通过对比不同交易策略的样本内外表现,揭示了交易成本在决定策略经济价值中的关键作用。最后,文章指出,虽然DNN策略在样本内和样本外表现出色,但在实际交易成本下,其经济可行性受到挑战,特别是在日内交易中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特斯拉(Tesla)首席执行官、连续创业的科技公司创始人 Elon Musk 表示,在未 来两年内,特斯拉汽车在美国各地能被车主自己召唤并自动驾驶接送车主。 ——Samuel Gibbs,2016 年 在股市中,只要在重大变动中站在正确的一边,就能赚大钱。 ——Martin Zweig 术语向量化回测指的是对算法交易策略[比如基于“密集神经网络”(DNN)进行市场预 测策略]进行回测的技术方法。Hilpisch(2018,第 15 章;2020,第 4 章)涵盖了基于一 些具体向量化回测的例子。在这种情况下,量化是指一种编程范式,它在很大程度上甚至 完全依赖于向量化代码(在 Python 中没有任何循环的代码)。向量化代码通常对于 Numpy 或 pandas 这样的包是一种很好的实践,在前面的章节中已进行了广泛的应用。向量化代码 的好处是代码更简洁且易于阅读,而且在许多重要场景中执行更快。不过,在回测交易策 略方面,它可能没有第 11 章中介绍和使用的基于事件的反向测试灵活。 拥有一个比简单的基准预测工具更好的人工智能预测器很重要,但通常不足以产生 alpha 收益(高于市场收益率,可能经过了风险调整)。例如,对基于预测的交易策略来说,正 确预测大的市场波动很重要,而不仅仅是正确预测大多数(可能相当小的)市场波动。向 量化回测是一种简单而快速地指出交易策略经济价值潜力的方式。 与自动驾驶汽车相比,向量化回测就像在虚拟环境中测试自动驾驶汽车的人工智能,只是 为了看看它在无风险环境中“总体”表现如何。然而,对自动驾驶汽车的人工智能来说, 虽然平均表现良好很重要,但最重要的是看它如何掌控危急甚至极端的情况。这种人工智 能应该平均造成“零伤亡”,而不是存在 0.1 或 0.5 的“伤亡”概率。对金融领域的人工智 能来说,虽然与自动驾驶汽车的人工智能不完全相同,但也是类似的,重要的是正确把握 图灵社区会员 cxc_3612(17665373813) 专享 尊重版权232 | 第 10 章 大的市场波动。本章关注的是金融人工智能体(交易机器人)的纯性能,而第 11 章更深 入地探讨了风险评估和标准风控措施的回测。 10.1 节介绍了向量化回测的一个简单示例,该示例使用简单移动平均值作为技术指标和日 终数据。这让你在开始的时候就有了一个深刻的可视化且更容易理解的方法。10.2 节利用 日终数据对 DNN 进行了训练,并基于预测的策略对其经济绩效进行了回测。10.3 节则对 日内数据进行了相同的操作。在所有的例子中,按比例的交易成本都以假定的买卖价差的 形式包括在内。 10.1 基于SMA策略的回测 本节介绍了使用简单移动平均线(SMA)作为技术指标的经典交易策略的向量化回测。以 下代码实现了必要的导入和配置,并检索了欧元 / 美元货币对的日终数据。 In [1]: import os import math import numpy as np import pandas as pd from pylab import plt, mpl plt.style.use('seaborn') mpl.rcParams['savefig.dpi'] = 300 mpl.rcParams['font.family'] = 'serif' pd.set_option('mode.chained_assignment', None) pd.set_option('display.float_format', '{:.4f}'.format) np.set_printoptions(suppress=True, precision=4) os.environ['PYTHONHASHSEED'] = '0' In [2]: url = 'http://hilpisch.com/aiif_eikon_eod_data.csv' ➊ In [3]: symbol = 'EUR=' ➊ In [4]: data = pd.DataFrame(pd.read_csv(url, index_col=0, parse_dates=True).dropna()[symbol]) ➊ In [5]: data.info() ➊ DatetimeIndex: 2516 entries, 2010-01-04 to 2019-12-31 Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 EUR= 2516 non-null float64 dtypes: float64(1) memory usage: 39.3 KB ➊ 检索欧元 / 美元的日终数据。 该策略的理念如下:计算一个较短的 SMA1(如 42 天)和一个较长的 SMA2(如 258 天)。当 SMA1 高于 SMA2 时,就做多该金融工具。当 SMA1 低于 SMA2 时,就做空该金融工具。因为这 个例子是以欧元 / 美元为基础的,所以做多或做空都很容易完成。 下面的 Python 代码以向量化的方式计算 SMA 值,并将得到的时间序列与原始时间序列一向量化回测 | 233 起进行可视化(参见图 10-1)。 In [6]: data['SMA1'] = data[symbol].rolling(42).mean() ➊ In [7]: data['SMA2'] = data[symbol].rolling(258).mean() ➋ In [8]: data.plot(figsize=(10, 6)); ➌ ➊ 计算较短的 SMA1。 ➋ 计算较长的 SMA2。 ➌ 可视化 3 个时间序列。 EUR= 时间 2010年 2011年 2012年 2013年 2014年 2015年 2016年 2017年 2018年 2019年 2020年 图 10-1:欧元 / 美元及其 SMA 的时间序列数据 利用 SMA 时间序列数据,可以再次以向量化方式导出最终头寸。注意,由此产生的最终 头寸值的时间序列要移动一天,以避免数据中的预测偏差。这种移动是必要的,因为 SMA 的计算包括当天的收盘值。因此,从某一天的 SMA 值得到的头寸对应着整个时间序列的 第二天。 图 10-2 会将最终头寸可视化为对其他时间序列的叠加。 In [9]: data.dropna(inplace=True) ➊ In [10]: data['p'] = np.where(data['SMA1'] > data['SMA2'], 1, -1) ➋ In [11]: data['p'] = data['p'].shift(1) ➌ In [12]: data.dropna(inplace=True) ➊ In [13]: data.plot(figsize=(10, 6), secondary_y='p'); ➍ ➊ 删除包含 NaN 值的行。234 | 第 10 章 ➋ 基于当天 SMA 值导出头寸值。 ➌ 将头寸值移动一天以避免预测偏差。 ➍ 可视化从 SMA 导出的位置值。 EUR= 时间 2012年 2013年 2014年 2015年 2016年 2017年 2018年 2019年 2020年 2011年 图 10-2:欧元 / 美元、SMA 和最终头寸的时间序列数据 这里缺失了一个关键步骤,即将头寸与金融工具的收益率结合起来。由于可以很方便地用 a+1 表示多头头寸,用 a-1 表示空头头寸,因此这一步可将 DataFrame 对象的两列以向量化 的方式相乘。如图 10-3 所展示的,基于 SMA 的交易策略的表现远远好于被动基准投资。 In [14]: data['

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值