1. 从一场分享会聊起:为什么量化调研报告值得反复咀嚼
第一次看到“似然分享会”这个名头,我以为是某个统计学兴趣小组在讲极大似然估计。后来才反应过来,“似然”在这里更像是一种态度——对市场保持“似然”的判断,不追求绝对确定,只寻找概率上占优的路径。量化金融调研报告(二),说明前面已经有过一期,而这一期显然是把话题往更深处推了一层。
我自己做量化研究有些年头了,从最早用Excel拉数据算均线,到后来写Python回测框架,再到接触因子模型和风险平价,踩过的坑比跑过的策略还多。所以看到“量化金融调研报告”这几个字,我第一反应不是“又来了一个讲Alpha的”,而是想知道:这份报告到底调研了什么?是策略层面的,还是数据层面的,还是整个投研流程的?可惜项目正文和关键词都是空的,只有标题和摘要描述。这种情况下,我只能基于标题本身,结合我自己的从业经验,把“量化金融调研报告”这个主题拆开来讲。
这篇文章适合谁看?如果你是刚入行的量化研究员,或者是对量化投资感兴趣但还没找到门道的开发者,又或者是做了几年主观交易想转量化的朋友,那接下来的内容应该能帮你省下不少试错时间。我不会给你推荐具体标的,也不会承诺任何收益,只聊方法论、工具链和那些文档里不会写的实操细节。
量化金融这个领域,表面上看是数学和代码的堆砌,实际上核心在于对市场行为的理解和对风险的敬畏。一份好的调研报告,不是把回测曲线画得漂亮就完事,而是要回答三个问题:这个策略赚的是什么钱?这个钱为什么现在能赚?这个钱以后还能不能赚?这三个问题,贯穿了我后面要讲的每一个环节。
2. 量化调研报告到底在调研什么:拆解核心模块
2.1 策略逻辑的源头:从市场异象到可执行信号
很多人做量化,第一步就错了。他们打开聚宽或者米筐,看到什么“小市值轮动”“双均线突破”,直接拿过来跑回测,曲线好看就上实盘。这种做法,本质上是在赌博,因为你根本不知道这个策略赚的是什么钱。
一份合格的量化调研报告,首先要讲清楚策略的逻辑源头。这个逻辑可以来自学术论文,比如Fama-French三因子模型;可以来自市场观察,比如你发现每年年报季前后,高送转预期的股票会有超额收益;也可以来自交易行为的统计,比如你注意到尾盘拉升的股票次日开盘往往有溢价。不管来源是什么,关键是要把这个逻辑用可验证的语言描述出来。
我举个例子。假设你调研的是“基于换手率的反转策略”。这个策略的逻辑是:短期内换手率异常放大的股票,往往是因为情绪驱动导致过度交易,后续大概率会反转。那么调研报告里就要写清楚:换手率怎么定义?是日换手率还是周换手率?异常放大的阈值是多少?是取历史分位数还是固定倍数?反转的持有期是几天?这些细节不写清楚,策略就是空中楼阁。
注意:策略逻辑的表述必须避免模糊词汇。不要说“换手率较高时”,要说“换手率处于过去20个交易日90%分位以上”。量化世界里,模糊就是原罪。
2.2 数据源的甄别:免费数据到底能不能用
做量化调研,数据是绕不开的坎。我见过太多人,策略逻辑很漂亮,结果死在数据质量上。一份调研报告,必须对数据源做详细说明。
先说说常见的数据类型。行情数据是最基础的,包括开盘价、最高价、最低价、收盘价、成交量、成交额。这类数据,免费源比如Yahoo Finance、Tushare的基础版、AKShare都能拿到。但免费数据有几个坑:一是复权处理不统一,前复权、后复权、不复权混着用,回测结果能差出天际;二是停牌期间的数据处理,有的源直接跳过,有的源用前收盘价填充,这会影响波动率计算;三是分红送股的处理,如果没做复权,价格会出现跳空缺口。
财务数据就更麻烦了。利润表、资产负债表、现金流量表,免费源往往有缺失,而且更新不及时。更关键的是,财务数据有“前视偏差”的问题。比如年报是次年4月底才披露,但很多免费数据源会把年报数据标注在12月31日,你回测时如果用12月31日的数据,就等于提前知道了未来信息,回测收益会虚高。
我的建议是,调研阶段可以用免费数据做初步验证,但一定要做数据清洗和偏差校正。具体操作上,可以用Tushare Pro或者Wind的试用账号交叉验证,至少确认关键字段的一致性。如果策略逻辑依赖高频数据,那免费源基本不够用,需要考虑付费数据或者自己爬取。
| 数据类型 | 免费源常见问题 | 处理建议 |
|---|---|---|
| 行情数据 | 复权方式不统一、停牌处理不一致 | 统一使用后复权,停牌日剔除或填充前收盘价 |
| 财务数据 | 披露日期错位、字段缺失 | 按实际披露日对齐,缺失字段用行业均值填充 |
| 另类数据 | 覆盖度低、更新慢 | 调研阶段可忽略,实盘前必须验证 |
2.3 回测框架的选择:自己写还是用现成的
回测框架的选择,直接决定了调研效率。我试过自己用Pandas写回测,也用过Backtrader、Zipline、VectorBT这些现成框架。各有优劣,关键看你的需求。
自己写回测的好处是灵活,想怎么改就怎么改,而且能深入理解每一个计算细节。坏处是容易出错,尤其是涉及到滑点、手续费、仓位管理这些细节时,一不小心就写出未来函数。我早期自己写回测时,就犯过一个低级错误:用当天的收盘价计算信号,然后用当天的收盘价成交。这在实际交易中是不可能的,因为收盘价出来的时候,市场已经关门了。正确的做法是,用当天收盘价计算信号,次日开盘价成交。
现成框架的好处是省事,很多细节已经帮你处理好了。比如Backtrader内置了多种订单类型和滑点模型,VectorBT支持向量化回测,速度极快。但现成框架也有坑:一是学习成本,每个框架的API都不一样;二是黑盒问题,有些框架的默认设置你不清楚,比如默认手续费率是多少,默认滑点怎么算;三是扩展性,当你需要自定义一些复杂逻辑时,可能会发现框架不支持。
我的建议是,调研阶段用VectorBT做快速验证,因为它的向量化计算真的快,几行代码就能跑完一个策略。等到策略逻辑确认了,再用Backtrader或者自己写的框架做精细回测,把滑点、手续费、仓位管理这些细节加进去。
# VectorBT快速回测示例 import vectorbt as vbt import pandas as pd # 假设已有价格数据 price = pd.Series([...]) # 收盘价序列 # 计算双均线信号 fast_ma = vbt.MA.run(price, 10) slow_ma = vbt.MA.run(price, 30) entries = fast_ma.ma_crossed_above(slow_ma) exits = fast_ma.ma_crossed_below(slow_ma) # 运行回测 pf = vbt.Portfolio.from_signals(price, entries, exits, fees=0.001, slippage=0.001) print(pf.stats())2.4 绩效评估的陷阱:夏普比率高就一定是好策略吗
绩效评估是调研报告的重头戏,但也是最容易自欺欺人的地方。很多人只看夏普比率和年化收益,觉得夏普大于2就是好策略。这种想法很危险。
夏普比率高,可能只是因为策略的波动率低,而波动率低可能是因为策略在大部分时间里空仓。比如一个策略一年只交易了5次,每次赚1%,其他时间都空仓,那它的波动率会很低,夏普比率会很高,但这样的策略资金利用率极低,实际收益有限。
除了夏普比率,还要看最大回撤、卡玛比率、胜率、盈亏比、换手率、持仓集中度。最大回撤决定了你在实盘时能不能扛住心理压力。卡玛比率是年化收益除以最大回撤,衡量的是单位回撤带来的收益。胜率和盈亏比要结合起来看,高胜率低盈亏比的策略,一旦遇到连续亏损,回撤会很大。
还有一个容易被忽略的指标:策略容量。有些策略在小资金时表现很好,但资金规模一大,冲击成本就会吃掉大部分收益。调研报告里应该估算策略容量,比如根据日均成交额和换手率,估算在不显著影响市场价格的前提下,策略能容纳多少资金。
提示:绩效评估时,一定要做样本外测试。把数据分成样本内和样本外,样本内用来调参,样本外用来验证。如果样本外表现和样本内差距很大,说明策略过拟合了。
3. 从调研到落地的关键跨越:那些报告里不会写的细节
3.1 交易成本的真实估算:滑点比你想象的大
交易成本是量化策略的隐形杀手。很多调研报告里,手续费按万分之二算,滑点按千分之一算,然后得出一个漂亮的净值曲线。但实盘时,你会发现滑点远不止千分之一。
滑点的大小取决于多个因素:标的的流动性、下单方式、市场波动率。对于流动性好的大盘股,滑点可能只有万分之几;对于小盘股或者冷门股,滑点可能达到百分之一甚至更高。而且,滑点不是线性的,资金量越大,滑点越高。
我在实际操作中,会用历史Tick数据或者分钟数据来估算滑点。具体做法是:假设你在某个时间点下单,用下一分钟的成交均价减去你的目标价格,得到的差值就是滑点。如果拿不到Tick数据,可以用日内的最高价和最低价来粗略估算,但误差会比较大。
还有一个容易被忽略的成本:冲击成本。当你下单量较大时,你的买单会推高价格,卖单会压低价格,这部分损失就是冲击成本。冲击成本的估算可以用Almgren-Chriss模型,但参数比较复杂。简化做法是,假设你的下单量占日均成交量的比例为x,冲击成本约为x的平方根乘以一个系数。
| 成本类型 | 估算方法 | 常见取值范围 |
|---|---|---|
| 手续费 | 券商费率 | 万分之1到万分之3 |
| 滑点 | 下一分钟成交均价与目标价之差 | 万分之5到千分之2 |
| 冲击成本 | 下单量占日均成交量比例的平方根 | 万分之1到万分之5 |
| 印花税 | 卖出时收取 | 千分之1(仅A股) |
3.2 过拟合的识别与规避:为什么你的策略一上实盘就亏
过拟合是量化策略的头号敌人。我见过太多策略,回测曲线完美,一上实盘就亏钱。过拟合的本质是,策略在历史数据上过度优化,把噪声当成了信号。
识别过拟合的方法有几个。一是看参数敏感性。如果策略在参数微调后表现差异巨大,说明过拟合了。比如双均线策略,你把10日和30日改成11日和29日,收益直接腰斩,那这个策略大概率是拟合了历史数据的特定模式。二是看样本外表现。如果样本外收益远低于样本内,说明过拟合。三是看策略逻辑。如果策略逻辑无法用经济学或行为金融学解释,只是数据挖掘出来的,那过拟合的概率很高。
规避过拟合的方法,首先是简化策略。参数越少越好,逻辑越清晰越好。其次是使用滚动窗口优化。不要用全部历史数据优化一组参数,而是用滚动窗口,每段时间优化一次,看策略在不同参数下的表现是否稳定。最后是交叉验证。把数据分成多份,轮流做样本内和样本外,看策略的平均表现。
我自己的经验是,一个策略如果参数超过5个,我就会非常警惕。每增加一个参数,过拟合的风险就指数级上升。而且,我倾向于选择那些逻辑简单、参数鲁棒的策略,哪怕回测收益低一点,但实盘更可靠。
3.3 实盘执行的心理陷阱:纪律比模型更重要
从调研到实盘,最大的挑战不是技术,而是心理。回测时,你看到的是平滑的净值曲线,但实盘时,你会经历连续亏损、大幅回撤、策略失效等各种情况。如果没有纪律,很容易在错误的时间做出错误的决策。
我见过很多量化交易者,策略本身没问题,但因为受不了回撤,在最低点手动干预,结果错过了后面的反弹。或者因为连续盈利,自信心膨胀,加大杠杆,结果遇到黑天鹅,一夜回到解放前。
实盘执行的关键是:提前制定规则,然后严格执行。规则包括:单笔交易的最大亏损比例、策略的最大回撤容忍度、什么情况下暂停策略、什么情况下调整参数。这些规则要在实盘前就写好,实盘时只执行,不决策。
还有一个心理陷阱是“近期偏差”。人们倾向于过度重视近期发生的事情。如果策略最近表现好,就觉得它会一直好下去;如果最近表现差,就觉得它失效了。实际上,策略的表现有周期性,短期波动很正常。我的做法是,至少观察策略3到6个月的表现,再做判断。
注意:实盘时,建议先用小资金跑一段时间,确认策略的执行逻辑和回测一致,再逐步加大资金。不要一上来就全仓,那是赌博。
4. 量化调研的进阶方向:从单策略到多策略组合
4.1 因子正交化:让多个因子真正互补
当你有了多个策略或因子后,下一步就是组合。但简单地把多个策略等权组合,效果往往不好,因为策略之间可能高度相关。比如你有一个动量策略和一个趋势策略,两者在趋势行情中都会赚钱,在震荡行情中都会亏钱,组合起来并没有分散风险。
因子正交化的目的是,让多个因子之间的相关性降低,从而实现真正的分散。具体做法是,对因子进行线性回归,取残差作为新的因子。比如你有因子A和因子B,你用A对B做回归,取残差作为因子B',这样B'就和A不相关了。
正交化的好处是,组合后的策略波动率更低,夏普比率更高。但坏处是,正交化后的因子可能失去经济含义,解释起来比较困难。而且,正交化是有顺序的,先正交化哪个因子,后正交化哪个因子,结果会不一样。
我的建议是,优先选择逻辑上互补的因子。比如价值因子和动量因子,一个买便宜的,一个买强势的,逻辑上就是互补的。如果逻辑上不互补,再考虑数学上的正交化。
4.2 风险平价:让每个策略贡献相同的风险
风险平价是一种资金分配方法,核心思想是让每个策略对组合的风险贡献相同。传统的等权配置,是每个策略分配相同的资金,但不同策略的波动率不同,导致高风险策略对组合的风险贡献更大。
风险平价的计算方法是:先计算每个策略的波动率,然后根据波动率的倒数来分配资金。比如策略A的波动率是10%,策略B的波动率是20%,那么策略A分配的资金是策略B的两倍。这样,两个策略对组合的风险贡献就相同了。
风险平价的优点是,组合的波动率更稳定,回撤更小。缺点是,低波动策略会占用更多资金,如果低波动策略的收益也低,那组合的整体收益会被拉低。而且,风险平价假设策略之间的相关性稳定,但实际中相关性会变化。
我在实际操作中,会用风险平价作为基础配置,然后根据策略的夏普比率做微调。夏普比率高的策略,适当增加权重;夏普比率低的策略,适当减少权重。这样既控制了风险,又保留了收益弹性。
4.3 策略失效的监测与应对:什么时候该放弃一个策略
策略失效是量化交易中不可避免的问题。市场结构在变,参与者在变,任何策略都有生命周期。关键是要及时发现策略失效,并做出应对。
监测策略失效的指标有几个。一是滚动夏普比率。如果策略的滚动夏普比率持续下降,说明策略的表现正在变差。二是回撤持续时间。如果策略的回撤时间超过了历史最大回撤时间,说明策略可能失效了。三是策略与基准的相关性。如果策略的收益越来越依赖于市场整体涨跌,说明策略的Alpha在消失。
应对策略失效的方法,首先是降低仓位。不要一下子把策略停掉,而是逐步减仓,观察后续表现。其次是分析失效原因。是市场环境变了,还是策略逻辑本身有问题?如果是市场环境变了,可以尝试调整参数或加入新的过滤条件。如果是策略逻辑有问题,那就果断放弃。
我的经验是,一个策略如果连续6个月跑输基准,或者回撤超过历史最大回撤的1.5倍,我就会考虑暂停它。但暂停不等于放弃,我会把它放在观察池里,定期检查,如果表现恢复,再重新启用。
5. 工具链与效率提升:让调研报告从想法到落地更快一步
5.1 数据管道的搭建:从数据获取到清洗的自动化
量化调研的效率,很大程度上取决于数据管道的顺畅程度。如果每次调研都要手动下载数据、清洗数据,那时间都浪费在重复劳动上了。搭建一个自动化的数据管道,能让你把精力集中在策略逻辑上。
数据管道的基本流程是:数据获取、数据清洗、数据存储、数据更新。数据获取可以用API,比如Tushare、AKShare、Yahoo Finance。数据清洗包括处理缺失值、复权、对齐时间戳。数据存储可以用本地数据库,比如SQLite、PostgreSQL,也可以用云存储。数据更新可以设置定时任务,每天自动拉取最新数据。
我自己的做法是,用Python写一个数据管理模块,封装数据获取和清洗的逻辑。每次调研新策略时,直接调用这个模块,几行代码就能拿到干净的数据。这样不仅效率高,而且能保证数据的一致性,避免不同策略用不同版本的数据。
# 数据管道示例 import akshare as ak import pandas as pd from sqlalchemy import create_engine def fetch_and_clean(symbol, start_date, end_date): # 获取数据 df = ak.stock_zh_a_hist(symbol=symbol, period="daily", start_date=start_date, end_date=end_date) # 清洗数据 df = df.rename(columns={'日期': 'date', '开盘': 'open', '收盘': 'close', '最高': 'high', '最低': 'low', '成交量': 'volume'}) df['date'] = pd.to_datetime(df['date']) df = df.set_index('date').sort_index() # 处理缺失值 df = df.fillna(method='ffill') return df # 存储到数据库 engine = create_engine('sqlite:///quant_data.db') df = fetch_and_clean('000001', '20200101', '20231231') df.to_sql('stock_000001', engine, if_exists='replace')5.2 回测与实盘的一致性:避免“回测很美,实盘很惨”
回测和实盘不一致,是量化交易中最常见的问题之一。原因有很多:数据不一致、执行逻辑不一致、交易成本估算不准、市场冲击等。要解决这个问题,关键是让回测和实盘共用同一套代码逻辑。
我的做法是,把策略逻辑封装成一个类,回测和实盘都调用这个类。回测时,用历史数据喂给这个类;实盘时,用实时数据喂给这个类。这样,策略逻辑只有一份,避免了回测和实盘逻辑不一致的问题。
另外,回测时要尽量模拟实盘环境。比如,实盘时你用的是限价单,回测时就不要用市价单。实盘时你有资金限制,回测时就要考虑资金约束。实盘时你可能会因为网络延迟错过交易,回测时就要加入随机延迟。
还有一个细节是,回测时要记录每一笔交易的详细信息,包括下单时间、成交时间、成交价格、滑点等。实盘时也记录同样的信息。然后对比回测和实盘的交易记录,找出差异,分析原因。
5.3 调研报告的模板化:让每次调研都有章可循
最后聊聊调研报告本身。很多人做调研,每次都是从零开始,想到哪写到哪,结果报告质量参差不齐。其实,调研报告可以模板化,把固定的部分做成模板,每次调研只需要填充策略相关的部分。
一个完整的量化调研报告,应该包括:策略逻辑、数据说明、回测设置、绩效评估、风险分析、实盘计划。策略逻辑部分,写清楚策略赚的是什么钱,逻辑来源是什么。数据说明部分,写清楚数据来源、时间范围、清洗方法。回测设置部分,写清楚回测框架、手续费、滑点、仓位管理。绩效评估部分,写清楚各项指标的计算方法和结果。风险分析部分,写清楚策略的最大回撤、失效条件、应对措施。实盘计划部分,写清楚资金分配、交易频率、监控指标。
模板化的好处是,每次调研都有章可循,不会遗漏重要内容。而且,模板可以不断迭代,把每次调研中发现的新的注意事项加进去,让模板越来越完善。
我自己的调研报告模板,已经迭代了十几版。每次踩坑后,我都会把教训写进模板里。比如,有一次我忘了考虑停牌股票的处理,导致回测收益虚高。后来我就在模板里加了一条:必须检查停牌股票的处理方式。这样,下次调研时就不会再犯同样的错误。
提示:调研报告写完后,建议放一两天再回头看。隔一段时间再看,往往能发现当时没注意到的问题。而且,把报告给同事或朋友看,让他们挑毛病,也能发现盲点。
量化金融调研这件事,说到底是一个不断迭代、不断学习的过程。没有一劳永逸的策略,也没有永远有效的因子。保持敬畏,保持好奇,持续学习,才能在这个市场里活得久一点。我在实际操作中的体会是,慢就是快,少就是多。把基础打牢,把细节做扎实,收益自然会来。