假设您有了一个交易策略,接下来怎么做?实盘交易测试策略的有效性?不,在使用资金进行冒险前,应该先对策略进行回溯检验,在历史数据上测试策略是否有效。
什么是回溯检验?
回溯检验(backtest):在历史数据上测试策略的有效性。通过模拟进场,平仓和资金管理,然后计算夏普比率和最大回撤等业绩指标,获取策略表现的相关信息。
回溯检验并不是完美地复制过去,有很多因素导致无法精确建模,例如无法准确估计滑点和自有订单对市场的冲击等,研究员也可能因为经验不足而犯下一些错误,例如前瞻性偏差和过度拟合,最终导致策略的表现比真实好得多。
向量化回测 vs 事件驱动回测
回溯检验有两种方式:向量化(vectorized)和事件驱动(event-driven)。
事件驱动回测涉及到模拟市场价格和策略信号的交互,例如在新的tick或K线形成时计算指标和信号,然后模拟订单成交。这种方式更逼近现实,但会花费更多时间。
相反向量化回测只需要收集与策略相关的数据,并将它们组织成向量和矩阵,然后通过简单的线性代数进行处理,模拟过去的表现。因为只需要进行简单的矩阵计算,向量化回溯比事件驱动回测要快得多,但它缺乏灵活性,无法模拟订单成交等细节。
向量化回测用于探索性策略分析,事件驱动回测适用于深入分析。当您有一个初步想法时,可以先进行向量化回测,快速评估模型是否盈利,只有探索分析的结果令人满意,才值得花时间深入研究。
对数收益率
在开始写代码前,还需要明白一个概念:对数收益率(log-return),我们会使用对数收益率计算策略收益。
对数收益率计算公式为:
假设3个交易日的对数收益率分别为 r 1 , r 2 , r 3 r_1, r_2, r_3 r1,r2,r3,那么第三个交易日的累计收益率是多少?只需要把3天的对数收益率相加即可,推导如下:
1. 准备数据
从蜂鸟数据下载黄金的日图历史价格。大家可以到蜂鸟官网注册,获取API密钥,免费获取金融数据。
import os
import requests
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import talib
%matplotlib inline
plt.style.use("ggplot")
params = {
"symbol": "XAUUSD", # 现货黄金ID
"start_date": "2003-01-01",
"end_date": "2020-08-05",
"apikey": os.getenv("TROCHIL_API") # 使用您的API密钥
}
resp = requests.get("https://api.trochil.cn/v1/forex/history", params)
data = pd.DataFrame.from_records(resp.json(