假设您有了一个交易策略,接下来怎么做?实盘交易测试策略的有效性?不,在使用资金进行冒险前,应该先对策略进行回溯检验,在历史数据上测试策略是否有效。

什么是回溯检验?

回溯检验(backtest):在历史数据上测试策略的有效性。通过模拟进场,平仓和资金管理,然后计算夏普比率和最大回撤等业绩指标,获取策略表现的相关信息。

回溯检验并不是完美地复制过去,有很多因素导致无法精确建模,例如无法准确估计滑点和自有订单对市场的冲击等,研究员也可能因为经验不足而犯下一些错误,例如前瞻性偏差和过度拟合,最终导致策略的表现比真实好得多。

向量化回测 vs 事件驱动回测

回溯检验有两种方式:向量化(vectorized)和事件驱动(event-driven)。

事件驱动回测涉及到模拟市场价格和策略信号的交互,例如在新的tick或K线形成时计算指标和信号,然后模拟订单成交。这种方式更逼近现实,但会花费更多时间。

相反向量化回测只需要收集与策略相关的数据,并将它们组织成向量和矩阵,然后通过简单的线性代数进行处理,模拟过去的表现。因为只需要进行简单的矩阵计算,向量化回溯比事件驱动回测要快得多,但它缺乏灵活性,无法模拟订单成交等细节。

向量化回测用于探索性策略分析,事件驱动回测适用于深入分析。当您有一个初步想法时,可以先进行向量化回测,快速评估模型是否盈利,只有探索分析的结果令人满意,才值得花时间深入研究。

对数收益率

在开始写代码前,还需要明白一个概念:对数收益率(log-return),我们会使用对数收益率计算策略收益。

对数收益率计算公式为:

假设3个交易日的对数收益率分别为r1,r2,r3r_1, r_2, r_3r1​,r2​,r3​,那么第三个交易日的累计收益率是多少?只需要把3天的对数收益率相加即可,推导如下:

1. 准备数据

从蜂鸟数据下载黄金的日图历史价格。大家可以到蜂鸟官网注册,获取API密钥,免费获取金融数据。

import osimport requests
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import talib%matplotlib inlineplt.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()["data"])
data["datetime"] = pd.to_datetime(data["datetime"])
data.set_index("datetime", inplace=True)data.tail()
open high low close symbol
datetime
2020-07-31 1957.475 1986.002 1956.322 1977.152 xauusd
2020-08-02 1980.562 1992.102 1977.412 1982.452 xauusd
2020-08-03 1982.422 1982.592 1960.882 1975.715 xauusd
2020-08-04 1975.665 2031.445 1967.262 2031.445 xauusd
2020-08-05 2031.302 2056.102 2009.842 2036.905 xauusd

2. 利用talib和pandas实现

准备好数据后开始实现回测,整个过程不到20行代码

首先提出一个简单的趋势跟随策略:

  1. 计算收盘价的快速均线和慢速均线。
  2. 计算快速均线偏离慢速均线的百分比。
  3. 当偏离百分比超过阈值,做多。
  4. 当偏离百分比低于阈值,做空。
# 模型参数
fast_period = 50  # 快速均线回溯期
slow_period = 200  # 慢速均线回溯期
threshold = 1.0  # 进场阈值,单位是百分比# 计算指标
data["fast_ema"] = talib.EMA(data.close, fast_period)
data["slow_ema"] = talib.EMA(data.close, slow_period)
data["pct_diff"] = (data["fast_ema"] / data["slow_ema"] - 1) * 100# 生成信号,1表示做多,-1表示做空,0表示空仓
data["signal"] = np.where(data["pct_diff"] > threshold, 1, 0)
data["signal"] = np.where(data["pct_diff"] < -threshold, -1, data["signal"])# 计算策略收益率
# 1. 计算收盘价的对数收益率
# 2. 把signal向前移动1天,然后乘以收益率,向前移动因为我们根据前一个交易日的数据构建头寸,获得今天的收益率
data["returns"] = np.log(data["close"] / data["close"].shift(1))
data["strategy"] = data["signal"].shift(1) * data["returns"]
data
open high low close symbol fast_ema slow_ema pct_diff signal returns strategy
datetime
2003-05-06 341.946 344.618 340.696 343.836 xauusd NaN NaN NaN 0 NaN NaN
2003-05-07 343.859 344.595 339.442 341.632 xauusd NaN NaN NaN 0 -0.006431 -0.000000
2003-05-08 341.834 348.535 340.484 347.936 xauusd NaN NaN NaN 0 0.018284 0.000000
2003-05-09 347.839 348.987 346.366 348.434 xauusd NaN NaN NaN 0 0.001430 0.000000
2003-05-12 348.673 351.986 348.094 351.202 xauusd NaN NaN NaN 0 0.007913 0.000000
... ... ... ... ... ... ... ... ... ... ... ...
2020-07-31 1957.475 1986.002 1956.322 1977.152 xauusd 1817.786921 1680.568670 8.164989 1 0.010007 0.010007
2020-08-02 1980.562 1992.102 1977.412 1982.452 xauusd 1824.244375 1683.572484 8.355559 1 0.002677 0.002677
2020-08-03 1982.422 1982.592 1960.882 1975.715 xauusd 1830.184400 1686.479375 8.521007 1 -0.003404 -0.003404
2020-08-04 1975.665 2031.445 1967.262 2031.445 xauusd 1838.076972 1689.911868 8.767623 1 0.027817 0.027817
2020-08-05 2031.302 2056.102 2009.842 2036.905 xauusd 1845.874150 1693.364536 9.006307 1 0.002684 0.002684

5374 rows × 11 columns

可视化指标,持仓(信号)以及策略收益率。

fig, ax = plt.subplots(nrows=3, ncols=1, figsize=(12, 15), sharex=True)ax[0].plot(data.index, data["close"])
ax[0].plot(data.index, data["fast_ema"])
ax[0].plot(data.index, data["slow_ema"])
ax[0].set_title("Price and Indicators")ax[1].plot(data.index, data["signal"])
ax[1].set_title("Strategy Position")data[["returns", "strategy"]].cumsum().plot(ax=ax[2], title="Strategy Return")

3. 参数优化

回溯检验的一个重要课题是参数优化,合理的优化能够显著提升策略表现。对于初学者而言,很容易陷入过度拟合的陷阱,这里我们提出一个科学的理论:迭代式优化。先确定策略的核心参数,通常3-5个已经足够,然后每次优化一个参数(其它参数保持不变),试图寻找“稳健”的参数区间,所谓“稳健”即策略表现(最好使用风险调整后收益率,为简单起见,这里仍然采用累计收益率)不会随着参数的微小变化而显著波动。

对于这个简单的趋势跟随策略,fast_period可能是最关键的。选择扫描区间(5, 100, 5), 其它参数保持不变,记录每次回测的累计收益率。

def backtest_trend_strategy(ohlc: pd.DataFrame,fast_period: int = 50,slow_period: int = 200,threshold: float = 1.0) -> pd.DataFrame:"""封装向量化回测的逻辑"""# 计算指标ohlc["fast_ema"] = talib.EMA(ohlc.close, fast_period)ohlc["slow_ema"] = talib.EMA(ohlc.close, slow_period)ohlc["pct_diff"] = (ohlc["fast_ema"] / ohlc["slow_ema"] - 1) * 100# 生成信号,1表示做多,-1表示做空,0表示空仓ohlc["signal"] = np.where(ohlc["pct_diff"] > threshold, 1, 0)ohlc["signal"] = np.where(ohlc["pct_diff"] < -threshold, -1, ohlc["signal"])# 计算策略收益率ohlc["returns"] = np.log(ohlc["close"] / ohlc["close"].shift(1))ohlc["strategy"] = ohlc["signal"].shift(1) * ohlc["returns"]ohlc["strategy_returns"] = ohlc["strategy"].cumsum()return ohlc# 选择核心参数和扫描区间,其它参数保持不变
fast_period_rng = np.arange(5, 101, 5)total_return = []
for fast_period in fast_period_rng:ohlc = data.filter(["open", "high", "low", "close"])res = backtest_trend_strategy(ohlc, fast_period, 200, 1.0)total_return.append(res["strategy_returns"].iloc[-1])# 散点图:策略收益率 vs 快速均线回溯期
fig, ax = plt.subplots(figsize=(12, 7))
ax.plot(fast_period_rng, total_return, "r-o", markersize=10)
ax.set_title("Strategy Return vs Fast period")
ax.set_xlabel("fast_period")
ax.set_ylabel("return(%)")

从结果来看,当快速均线回溯期在50-70之间,策略收益率稳定在95%-115%,可以认为这是稳定的参数区间。

4. 结论

本文介绍了如何用少量代码实现向向量化回溯检验,我们提出了一个简单的趋势跟随策略,它虽然能盈利,但并没有跑赢同期黄金的表现(预期之中),而且不要忘记,回测时没有考虑交易成本,真实的表现要比回测结果更糟糕。

如果向量化回测无法给出准确的结果,为什么要学习这个技能?有两个原因:

  1. 即便是最复杂的回测软件,也无法精确复制历史,所有回测都只是对历史表现的有偏估计。
  2. 向量化回测能够大致模拟策略的表现,只需要用非常少的时间就能完成。

只有探索策略分析的结果令人满意,才值得花时间进行更复杂和贴近现实的研究。

最后我们总结一下向量化回测的步骤:

  1. 获取历史数据
  2. 计算指标(建议用talib完成)
  3. 根据策略规则生成信号,分为做多(1),做空(-1),空仓(0)
  4. 计算策略收益率
  5. 计算业绩指标和结果可视化

如果喜欢我们的文章,记得点赞和收藏哦,我们每天都会为大家带来Python,数据科学和量化交易的精品内容。

【关于我们】

蜂鸟数据:国内领先的金融数据API提供商。

蜂鸟数据团队由业界顶尖的数据工程师,数据科学家和宽客组成,我们正努力构建一个强大的金融数据库,并提供API接口,目标是令金融数据开源化和平民化。

浏览并测试我们接口吧,目前覆盖股票,外汇,商品期货,数字货币和宏观经济领域,包括实时报价(tick)和历史数据(分钟),提供REST API和Websocket两种接入方式,能够满足金融分析师,量化交易和理财app的需求。

需要金融数据?利用蜂鸟API将数据整合到您的应用

如果您准备好了,请登录蜂鸟官网,注册免费获取API密钥,然后开始探索我们的金融数据库吧。

Python量化交易:如何用不到20行代码实现回溯检验相关推荐

  1. 你应该知道的21大Python量化交易工具

    技术可用性的快速增长使个人交易者也能够进行系统和算法交易.下面为大家分享2022年 Python 量化交易使用最广泛的21大交易平台和框架.经纪自营商.数据提供商和其他有用的交易库等,这些交易库适用于 ...

  2. python量化交易策略实例_Python进阶量化交易场外篇3——最大回撤评价策略风险...

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  3. 【python量化交易学习】pandas获取mysql数据,使用pyecharts画K线图,ma移动均线。

    将pyecharts官方提供的数据源,替换成已经存在mysql中的数据.画出专业的k线图(k线+ma移动均线+交易额柱状图(单位是千)) 参考: [python量化交易学习]pandas获取tusha ...

  4. 【python量化交易学习】从tushare获取股票交易数据,存入后再从mysql或excel读取数据,筛选股票,用pyecharts画出K线图。

    选定日期,筛选涨幅达到10%的股票,并画出K线图.观察涨停后股票走势. 由于创业板涨停板为20%,科创板20%,北交所30%.因此筛选出的涨停股票不完全准确.考虑到目前市场打板主要集中在10%的主板股 ...

  5. Python量化交易04——基于机器学习的交易策略

    参考书目:深入浅出Python量化交易实战 学量化肯定要用的上机器学习这种强大的预测技术.本次使用机器学习构建一些简单的预测进行量化交易,使用Python进行回测. 获取数据 import panda ...

  6. 使用python量化交易接口有哪些分析指标和策略?

    量化交易有哪些指标可以用于分析呢?主要有技术面和基本面可以用于分析! 来看一下技术面和基本面有什么区别? 技术面更关注具体的价格,比如每天的开盘价.收盘价.以及和开盘价/收盘价/最低价/最高价相关的K ...

  7. yyds!Python 量化交易教科书面世,赠送 3 本

    大家好,我是俊欣 前不久,收到清华大学出版社赠送的 <深入浅出Python量化交易实战> 一书,也答应了出版社要写一些读书笔记,今天就来交作业了. 当然老规矩,俊欣会在本篇赠送共3本书,规 ...

  8. Python量化交易之预测茅台股票涨跌(文末赠书福利)

    本文摘自清华大学出版<深入浅出Python量化交易实战>一书的读书笔记,这里把作者用KNN模式做的交易策略,换成了逻辑回归模型,试试看策略的业绩会有怎样的变化. 二话不说,上梯子,导库拉数 ...

  9. Python 量化交易系列教程

    Python 量化交易 例如:第一章 Python 基础知识 Python 基本操作练习 Python 量化交易 Python 基本操作练习 一.基础运算子练习 二.条件判断练习 三.循环练习 四.函 ...

最新文章

  1. c# 获取本机 MAC地址\序列号\硬盘序列号
  2. PhpStrom 常用的插件
  3. gitlab服务器邮箱配置
  4. Linux命令参数详细解析 mv
  5. 工具 转_好用的语音转文字工具,总有一款适合你!
  6. 蓝桥练习 之 单词个数统计
  7. 云桌面计算机被锁定如何解决,桌面布局已锁定怎么解除?电脑桌面便签布局锁定后怎么解除?...
  8. Tomcat6 如何彻底卸载,才干净?
  9. 基于FPGA的VGA显示,简单的历程和注释(DE2-115)
  10. pdf打印去掉页眉页脚(兼容ie)
  11. 2016英语三级分数计算机,公共英语三级考试分数权重计算方法
  12. 论文笔记——News Recommendation with Topic-Enriched Knowledge Graphs
  13. java 二嗨租车项目_Java第二季租车系统参考
  14. 怎么查看html页面,网页浏览记录如何查看_怎样查历史网页浏览记录-win7之家
  15. 博客的写作魅力——如何写出非专业人士和科学家能读懂的博客?
  16. winform实时获取网卡网速全部源码,获取电脑上传下载速
  17. 免费好用的win10录屏软件-Captura
  18. mac上的ssh连接工具
  19. 推荐一个不错的学术资源论坛
  20. 服务器压力测试工具1——压力端模块设计

热门文章

  1. html 各内核ua示例,浏览器UA和windows内核归类
  2. Twincat3搭建
  3. 如何将文件夹打包成jar包
  4. 右上3慢性根尖周炎急性发作伴发眶下间隙感染治疗病例展示
  5. react路由引入报错xxx is not exported from ‘react-router-dom‘
  6. 多媒体计算机技术论文,多媒体技术的计算机关键性技术论文
  7. 2017.10.16离线赛总结
  8. 基于80x86汇编的英文填字游戏程序
  9. 拳王虚拟项目公社:虚拟资源平台的虚拟产品大全整理副业系列
  10. 专业CPU信息检测工具:CPU-Z