1.Backtrader 简概
2.量化交易Python实用功能函数(6)
3.干货 | 用python从零实现基于事件驱动的回测回测量化回测(Backtest)系统(一)
4.Python之路 11 双均线策略的3种回测方法
5.手把手教你动量指标的Python量化回测
6.如何评价vnpy量化回测?
Backtrader 简概
Backtrader,这个年开源的源码Python量化回测框架,因其功能全面、代码灵活性高而备受青睐。回测回测它以Python为开发基础,源码利用pandas的代码查询网源码 php高效矢量运算,提供了快速处理金融数据的回测回测能力。内置的源码Ta-lib金融指标库,使得策略分析更为精确。代码此外,回测回测Backtrader还支持可视化展示,源码拥有活跃的代码社区支持和详尽的文档资源,显著节省策略开发时间。回测回测
官方文档深入介绍了各个模块,源码便于用户理解和使用,代码可以从[1]链接获取详细信息。源码开源,开发者可以根据需求自由修改,地址在[2]。通过这个强大的工具,你可以逐步探索和掌握回测的奥秘,Backtrader堪称回测领域的神器。
如果你对Backtrader感兴趣,可以按照文档的模块划分进行学习,逐步掌握其使用方法。如果你正在寻找一个既强大又灵活的量化工具,Backtrader无疑是一个值得考虑的选择。
发布于年9月日::
mdnice发布
量化交易Python实用功能函数(6)
量化交易的一大功能是“回测”,通过回测可以直观检验策略的有效性及存在问题。
上篇文章《大牛量化:量化双均线策略回测效果如何?》对双均线策略的回测分析,总结经验,量化交易不再迷茫,将不确定行情转化为可操作交易。
已介绍的代码功能包括:
获取股票上市时间(get_open_date())
判断回测模式(ContextInfo.do_back_test)
设置回测基准(ContextInfo.benchmark)
设定回测系统日志显示级别(ContextInfo.data_info_level)
获取特定记录(get_result_records())
接下来,将分享QMT量化平台的行情函数:
(一) 设置定时器(ContextInfo.run_time(funcName,period,startTime))
实现:设置定时器执行指定函数
参数:funcName回调函数名称,period执行周期,startTime开始时间
示例:ContextInfo.run_time('funcName', '1min', '--')
(二) 创建板块(create_sector(parent_node,sector_name,overwrite))
实现:在指定节点下创建板块
参数:parent_node根节点,sector_name板块名称,overwrite覆盖已有板块
示例:create_sector('root', 'my_sector', True)
(三) 创建板块目录节点(create_sector_folder(parent_node,folder_name,overwrite))
实现:在指定目录下创建节点
参数:parent_node根节点,folder_name节点名称,overwrite覆盖已有节点
示例:create_sector_folder('root_folder', 'my_subfolder', True)
(四) 获取板块目录信息(get_sector_list(node))
实现:获取指定节点下的所有板块信息
参数:node目标节点
示例:get_sector_list('root')
(五) 设置板块成分股(reset_sector_stock_list(sector,stock_list))
实现:更新板块内成分股
参数:sector板块名称,stock_list股票代码列表
示例:reset_sector_stock_list('my_sector', ['AAPL', 'GOOGL'])
干货 | 用python从零实现基于事件驱动的量化回测(Backtest)系统(一)
为何撰写类似文章?最近,我有位朋友问我是否还能编写代码,这如同“廉颇老矣,尚能饭否?”的疑问。我,竞技投注源码作为始终秉持“talk is cheap, show me the code”理念的资深程序员,深感有必要利用业余时间贡献出实现量化回测系统的经验。该系统对于量化交易和AI量化而言,是基础且必要的组成部分。通过回测,虽能取得良好结果,但并不能保证未来收益。然而,反向思考,回测过程显示不佳的策略,就构成了冒险行为。
量化回测系统是什么?量化交易是通过计算机依据特定策略生成交易信号的过程。由于二级市场数据可获取,计算机操作易于实现全面复盘。就好比玩扑克或“杀人游戏”后,逻辑严密的人会回溯游戏过程,分析何处可以做得更好,确保后续策略优化和提高。这就是量化回测系统的价值所在。
量化回测系统几乎无需成本,你可以调整参数或尝试各种创意,系统将告诉你在过去一段时间(比如一年内),若真照此操作,预期的收益率和最大回撤是多少。这样可以避免花费大量真金白银在市场上“买教训”,更重要的是节省时间,几分钟内模拟多个股市周期,穿越牛熊。要经历几个股市周期,则可能需要以十年乃至更长时间维度计算,但对于量化回测引擎,几秒钟即可提供结果,且无实质损失。
对于初学者而言,量化回测系统可能神秘,但其原理并不复杂。本文系列旨在引导大家用Python从零开始实现基于事件驱动的量化回测系统。
为什么选择Python?与其他编程语言如Java/C++,以及数据领域常用的Matlab或R相比,Python具有显著优势。作者认为,在大数据、机器学习、人工智能时代,Python是溯源码监控最好的选择之一。Python增长速度显著,行业实践中通常采用事件驱动(Event-driven)方式。
事件驱动系统通常包含如下组件:数据处理、策略执行、交易执行和风险管理等。本文将展示使用Python实现的量化回测系统架构,包括导入队列、数据处理、策略执行、交易执行和风险管理等关键模块。
关于作者:魏佳斌,互联网产品/技术总监,北京大学光华管理学院(MBA)、特许金融分析师(CFA)。专注于互联网发展趋势、AI金融量化,致力于利用最新的人工智能技术理解和挖掘经济、金融信息。
关注公众号“AI量化实验室”(ailabx),获取AI量化最前沿技术、资讯。
Python之路 双均线策略的3种回测方法
对于每一个交易日,都能计算出前N天的移动平均值,然后将这些平均值连起来,形成一条线,称为N日移动平均线。
在双均线策略中,我们使用两条均线,快均线(例如:5日均线)和慢均线(例如:日均线)。当快均线上升穿过慢均线时,形成金叉,给出买入信号。反之,当快均线下降穿过慢均线时,形成死叉,给出卖出信号。然而,双均线策略并非一个可靠的CTA策略,它只提供买卖信号,没有明确的过滤器和止损,因此稳定性较差。而且因为越来越多的人了解并使用它,策略已经逐渐失效。尽管以前很多前辈能用它赚到很多钱,但现在单纯想靠双均线策略赚钱太难了。系统附源码
由于策略的简单性,它可以作为一个很好的策略回测方法的入门,被称为量化领域的‘Holle World!’
通常,当我们得到一组数据时,第一步是使用简单的向量回测方法来检测它是否有强的自相关性。如果数据在时间序列上表现出趋势,则适合使用CTA类的策略。反之,如果表现出均值回归(即在一定价格区间上下震荡),则使用套利类策略。
第二步,当数据显示很强的自相关性或很弱的自相关性时,需要更精细化的策略回测,Python中可以使用事件驱动引擎来进行事件化回测或基于vn.py框架的策略回测。
以下用上证ETF()为例。
导入包,使用Tushare获取数据,然后用sort_index()改变其时间排序方式,再计算每天的价格变化。
计算两条均线,分别是5日移动均线和日移动均线。使用rolling()函数:滚动窗口的周期是5,不取中间数(FALSE)。
从下图中可以观察到,ma5是从第5个交易日才开始有的(统计的是前4天的收盘价,加上今天的收盘价),而ma是从第个交易日才开始产生的。因此,到2月6日所有数据才完整起来,同时从这天起(个交易日)开始产生交易信号。
清除空值,从2月6日开始统计。
通过交易信号计算持仓情况。如果快均线上穿慢均线,即ma5>ma时,产生买入信号。因为ma5和ma是今天收盘时才刚刚统计出来的,所以其交易信号需要明天开盘时执行。
每天盈亏=当日持仓*当天价格变化。
当仓位发生变化时,如做多变成做空,会产生手续费。手续费=开仓的总数(这里是2万股)*当日收盘价*手续费率(万分之三)。
净盈亏=每天盈亏-手续费。赞助源码下载
最后计算累计盈亏。
绘图。
测试表明双均线策略并不理想。图中显示2.3万的本金,在年全年只能盈利2千左右。
以下为双均线策略的事件化回测。
这里我们需要使用事件驱动引擎。
事件驱动:当一个新的事件来临时候,我们会做一些事情并把某些结构固定下来,在这样一个框架下,你不可能获得未来的数据。只要细节的盈亏计算代码不出现问题,不应该包含任何未来函数。
导入包,因为我使用的是Python2,这里使用一个新的库__future__,即把下一个新版本的特性导入到当前版本。这里是导入Python未来支持的语言特性division(精确除法)。
获取当天价格变化。
定义缓存结构,初始化输入的参数。
定义类(每天盈亏结果),在类中再次初始化参数,然后定义各参数的逻辑关系。
现在开始运行回测。
df.iterrows()生成Python迭代器,enumerate()当传入一个迭代器作为参数时,会返回当前迭代变量的基数情况。在迭代的过程中,dataframe每一行是一个日期外加2个字段(close和change),所以会以table的形式返回每一行。所以在table中,第一个元素就是日期,然后是当日收盘价和差价。然后是遍历下面的内容。
将数组中的老数据平移一格(将当前最新的收盘价插入数组最后位置上,更新到最新的情况)。
如果尚未有个数据点缓存数量,则continue后面的逻辑则不执行。当积累到个信号后,开始正式的计算。
计算双均线策略的交易信号。
回测跑完后,现在要通过累计收益来显示策略结果。
该图和上图用向量回测得到的结果差不多。
以下为双均线策略的基于vn.py框架的回测。
首先,搭建vn.py运行环境。
详细,请看《懒人包:vn.py安装图文详解》(更新至v1.9.0)。
安装好之后开始跑回测。
导入包。
In[1]
获取数据。
In[2]
创建MongoDB连接。在MongoClient传入参数,第一个是MongoDB所在服务器的默认IP(本机地址)和第二个是默认端口。然后返回client下的数据库对象,在数据库中查找vtSymbol。
在MongoDB数据库中可以看见collection已经创建好了。
将数据插入历史数据库。
最后一行:
update_one 保证其唯一性(所谓数据库的唯一性,就是这个键是已知的时候,这个键对应的数值是唯一的,若重复插入时候,要么报错,要么新的值把老的值给覆盖掉),所以在重复插入,新的值把老的值给覆盖掉。
{ '$set':bar.__dict__} flt出现的时候做一个更新。
用upsert=True,意思为当数据已经存在的时候,去覆盖它,upsert=False则是当数据已经存在的时候,不做任何操作。
In[3]
开发策略。
导入策略模板文件中的策略模板对象。
In[4]
下面分别是构造函数,初始化策略,启动策略,停止策略和收到Tick推送。
具体的双均线策略就出现在onBar函数上。
因为是策略回测而不是实盘,所以下面都pass了。
在策略类设置完之后,下面开始加载回测引擎。
In[5]
设置产品相关参数。
让我们看看双均线策略回测结果。
首先是参数输出,盈利是2千多,交易日从2月6号开始,最大回撤达%,这是纯双均线策略的特点,过于钝化,需要结合有效离场指标来降低亏损。
最后是绘图结果。
总盈亏图有些出错,应该是从2月初开始交易的,但是大致的图形都与上两幅符合。
从双均线策略回测效果看来,vn.py的回测并不具有优势,需要导入很多库,而且策略框架写起来很麻烦。但是,vn.py对于自己手写,第一个好处就是杜绝未来函数,而且vn.py设计之初只是用于实盘交易,所以其回测与实盘公用一套代码是第二优点。最后是对于要用到多个技术指标的通道突破策略,或者多策略+多品种回测,在已有框架下写策略显然要比自己手写要轻松。
感谢@Chandler Chan的提醒,由于那时候刚刚学Python没多久,把初始化天数和一些参数搞错了,导致vn.py回测得到的图形和上2种方法的图有相当程度的不同。现已完善得差不多。
手把手教你动量指标的Python量化回测
在投资领域,评估一家公司以及理解市场价格是投资专业的核心技能。本文旨在带领读者以动量指标为例,利用Python进行量化回测,深入探讨动量指标的运用与策略分析。动量指标,作为技术分析的重要组成部分,旨在捕捉股价波动过程中的趋势与反转现象,主要应用于股票市场。
动量指标概述
动量指标,全称为Momentum Indicators,利用动力学原理研究股价波动过程中的趋势与反转。该指标基于价格与供求关系,假定股价涨幅与跌幅随时间逐渐减缓,从而提示行情可能的反转点。常见的动量指标包括ADX、CMO、MACD、RSI、KDJ、动量指数(MOM)和威廉指标等。在Python库TA-Lib中,提供了丰富的动量指标类函数,便于其在量化策略中的应用。
MFI指标分析框架
MFI指标(Money Flow Index)由JWellesWilder's于年提出,结合价格与成交量,类似于成交量的RSI指标。MFI通过计算典型价格(TP)和资金流量(MF),衡量市场资金流向。其计算方法如下:TP为当日最高、最低与收盘价的平均值;MF为TP与N日内成交量的乘积;PMF为MF大于昨日MF的正资金流量,NMF为相反情况的负资金流量。MFI值计算公式为:MFI = - [/(1+PMF/NMF)],参数N通常设为日。在应用中,MFI指标的超买超卖信号是其关键决策依据。
MFI指标 Python应用实例
结合MFI指标的超买超卖法则,本文以上证指数为例,使用Python进行历史回测。通过pandas、numpy、talib和matplotlib等库,实现数据处理与可视化。在策略计算与历史回测中,MFI指标用于识别超买超卖信号,辅助投资者做出交易决策。结果显示,MFI指标在超买值调整后,展现了更好的效果,表明MFI适用于提供中短期买卖信号,但其在长期效果上有所局限。
结语
本文以MFI指标为例,介绍了动量指标的原理及其Python量化运用,通过实际应用展示了指标在量化策略中的价值。技术指标虽不能预测未来走势,但可以衡量当前市场状况,用于确认趋势。在应用中,投资者需谨慎理解指标与股价之间的关系,技术指标提供的是辅助参考,而非决策依据。通过Python金融量化领域的学习与实践,可以进一步提升投资决策的科学性和有效性。
如何评价vnpy量化回测?
vnpy量化框架在体验上表现出色,是值得推荐的开源量化工具。在使用过程中,可能会遇到版本选择上的困惑,确保使用的是VeighNa量化社区的vn.py版本。在搭建个人量化平台时,vn.py的回测功能尤为重要,可以通过其提供的CTABacktester引擎对策略进行回测,并将结果直观地展示在平台上。
在安装vnpy时,下载最新的开源软件包,并按照指示逐步安装,确保与所使用的Python版本兼容。在vnpy的run.py中,插入代码开启CTABacktester,需要在全局配置中输入自己的mongoDB数据库的用户名、密码等链接信息。随后,打开CTA回测界面,确保已将所需的历史行情数据导入数据库,以进行高效回测。
回测数据包含起始资金、结束资金、总收益率、年化收益、最大回撤等多个关键指标,帮助评估策略的有效性。通过修改vn.py代码,可以将回测功能集成至个人量化平台,实现策略的自定义开发与回测。
为了提供更直观的策略展示,可以设计个性化的量化平台Web页面,并定义特定的策略,如EMaStrategy。通过在vnpy中创建策略文件(如“ema_strategy.py”)并集成至CTABackTesting中,实现策略回测。利用plotly解决方案,自定义输出结果和表现形式,生成html格式的可视化图表,以直观展示回测结果。
为了比较不同策略的表现,可以同时进行多策略回测。通过vnpy的回测引擎和plotly的图形化输出,可以便捷地在个人量化平台上进行策略评估与分析,优化投资决策。若有任何问题,欢迎访问adog.net.cn/news获取更多资源或加入“知shi星球(阿岛格)”进行深入讨论。
手把手教你Python实现基于事件驱动的量化回测
本文详细介绍了如何使用Python实现基于事件驱动的量化回测,尤其以均值回归策略为例,展示了其复杂的构建思路和模块构成。虽然这种方法能更接近实际交易环境,但其复杂性、执行速度和潜在错误引入风险也是需要关注的。
事件驱动回测框架的核心在于数据采集、事件管理、策略生成和交易执行。数据采集模块通过tushare接口获取行情数据,形成市场数据事件。策略模块基于基类生成交易信号,触发交易信号事件。交易执行模块处理这些信号,生成委托下单事件,模拟交易行为并更新头寸信息。资产头寸管理是整个框架的重要组成部分。
Python实现时,关键在于使用面向对象技术,如类TickData和回测类的定义,以及每个时间戳数据的处理。然而,回测系统并不全面,仅测试策略的已实现收益,未涉及收益评价指标和交易成本。这表明,尽管有开源框架可用,深入理解回测系统对于个人量化交易者至关重要,但实际交易的复杂性使得完全模拟困难。
总结,基于事件驱动的Python量化回测是一个实践学习的过程,通过理解和实现,可以提升对策略评估的精确性,但同时也要注意其局限性。后续将探讨更多量化回测框架的应用。
参考书籍:Weiming J M, Weiming J M. Mastering Python for Finance[M]. .