如何从零开始设计一套⌈中性策略回测系统⌋?

最近接到新任务,需要开发一套⌈中性策略回测系统⌋。

首先老实交待,策略方面,更多是投研部的工作,我不太懂。中性策略,平时工作中多多少少有些接触,全名为市场中性策略,我理解,凡是有对冲的策略便是市场中性策略,构建多头和空头头寸,其中空头即为对冲端。之所以被称为中性策略,也是因为与市场相关性低,无论牛市和熊市,只要有基差,即多空两头波动不均衡,便能获利,一度被认为是能穿越牛熊的黄金策略。我司的中性策略,主要是股票多因子Alpha策略,基于量、价及基本面范围的多因子量化策略(基本面因子不算量化范畴?),而对冲端,主要有股指、融券和场外期权三类。

相应地,回测也分两块,即多头回测和空头回测。本次回测系统开发,优先开发对冲端的回测,当前公司有一个在用的多头回测系统,勉强能先用着,对冲端开发完成后,再小改一下,将两边融合起来,最终作为一套完整的中性策略回测系统交付投研部使用。

回测系统,顾名思义,即回溯行情,测试交易。交易基于策略,策略有简单复杂之分,最简单的策略可以简单到一句话,比如每天按MA5(5日移动均线)下单,低买高卖,再比如每天早上10点市价挂单,虽然简单,但都算交易策略。而复杂策略,可以多到成千上万行代码,可以是一个独立且庞大的系统,形形色色,各有千秋。殊途同归的是,反映的都是投研/基金经理等交易者的清奇思路,策略是一种信仰,最终可以赚大钱的信仰。

回测,无非是计算历史区间内策略每日的收益。收益可分为两部分,一是持仓收益,二是交易收益。对于股票:

持仓收益:当日未交易的票,因为行情波动而产生的收益。收益率=收盘价/昨收-1。

交易收益:当时买入的票持有到收盘,或卖出的票从开盘到卖出时点,这个时段内的收益。其中,买入的收益率计算公式为:收盘价/买入价-1,卖出的收益率为:卖出价/昨收价-1。

期货与股票略有差异,股票实行的是逐笔结算制度,浮动盈亏是一买一卖之间累计的,与持仓天数无关。期货实行的是逐日盯市结算制度,即每天的盈亏会在当天结算时结清,盈利的钱会在结算后体现在账户总资金(权益)中,作为第二天的本金,而对于亏损的,需要在收盘后及时补充保证金,否则期货公司会执行强制平仓以降低暴仓可能引发的资不抵债风险。

另外期货交易比股票更为复杂,最明显的是期货允许做空(股票当然也可以,但是融资融券是另外一回事暂且忽略),交易方向又分为开仓、平仓,交易类型分为买和卖,因此有买开、卖平、卖开、买平这四种交易,之所以用这顺序,是因为买开的合约是通过卖平来平仓,卖开的合约则通过买平来平仓,这样结对便于记忆否则容易混淆。

显然,回测系统的核心,是计算每日交易盈亏(后文简称为PNL,即Profit and Loss)。

对于回测系统,若按策略类型划分,有以下两类:

1、择时策略回测:这类涉及到策略定义,按策略的成交规则进行择时交易。

2、择股策略回测:这类回测是无关下单时间的,适用于选股策略,导入股票组合和权重,指定成交价格,比如开盘价、时段twap/vwap等,再指定交易区间(起始/截止日),即可启动回测。

大部分回测系统属于第一类,而中性策略属于选股策略,显然适用第2类回测。

相关推荐
quantdash_cc11 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
量化炼金 (CodeAlchemy)11 小时前
【量化交易】避开四次熔断的标普500择时模型:趋势+波动率+信用利差
量化交易·美股·标普500·市场择时
quantdash_cc17 小时前
ETF 行情数据清洗实战:字段语义拆解、标的池整理与五个校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
benchmark_cc2 天前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
量化炼金 (CodeAlchemy)2 天前
【量化研究】美股历史数据获取:Yahoo Finance 转 Zorro 回测格式
python·量化研究·量化交易
2601_966949653 天前
Python 实战:如何统计五档盘口买卖盘总挂单量?附计算公式与代码
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
2601_966949654 天前
为什么不应该把 QuantDash API Key 直接写进公开代码仓库?从 Git 提交历史理解凭证泄露风险
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
quantdash_cc5 天前
如何检查滚动收益率计算中的窗口长度不足?——从数学定义到 Pandas 实现
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
2601_966949655 天前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
不脱发的程序猿6 天前
红利ETF量化策略
人工智能·python·ai·程序员·量化交易·etf·策略回测