区分真正壁垒与营销谎言,用免费方法接近机构水平
第136页 · 预计40页
本章实战输出:区分真正的机构壁垒与营销谎言,用免费方法接近机构水平,不被“黑科技”因子忽悠。
这个问题,我问过不少在公募、私募工作的朋友。他们的答案出奇一致:没有。
不是说机构不研究因子。他们研究,而且研究得很深。但那种“独家秘方、一旦泄露就失效”的因子,基本不存在。
为什么?
真正有效的因子,逻辑往往是简单的。小市值、低波动、动量、质量……这些因子的核心思想,一篇几百字的文章就能讲清楚。机构不可能在“因子公式”这个层面拥有长期秘密。
机构的优势在哪里?在于如何组合这些因子、如何控制风险、如何执行交易。这些东西不是一两个公式能概括的,而是一整套系统。别人很难复制。
机构确实可能在某些时候拥有信息优势,比如通过卫星图像监控某个港口的库存变化,或者通过爬虫提前获取招聘数据。但这些优势是有时效性的——一旦市场知道了,优势就消失了。
而且,这类信息优势跟“因子”不是一回事。它更像是事件驱动策略,而不是一个稳定的、可以长期使用的Alpha因子。
金融市场有一个残酷的规律:任何被发现的盈利模式,都会被模仿,直到失效。
如果一个机构真的有一个秘密因子,而且它很赚钱,那么会发生什么?首先,这家机构自己的资金会在这个因子上越做越大,直到容量饱和,因子收益下降。其次,其他机构会通过分析它的持仓,反向推导出这个因子,然后开始模仿。最终,这个因子会变成公共知识,失效。
所以,所谓“密不外传”的因子,要么不存在,要么存在但很快就不再是秘密。
很多机构对外宣传“我们有独家因子模型”“AI黑科技”,其实卖的不是因子,而是信任。你买他们的产品,不是因为你相信那个因子有多神奇,而是因为你相信他们有能力持续找到新的Alpha来源。
这种能力,才是真正的秘密。而能力的培养,需要时间、经验、团队,不是花钱买一个因子表达式就能获得的。
既然机构没有秘密因子,普通人是不是没机会了?也不是。
机构的劣势在于:资金量大,交易成本高,调仓不灵活。他们看不上的一些小机会、小因子,普通人可以吃。
比如,有些小市值的股票,机构因为流动性限制不能买,但你可以。有些高换手的因子,机构因为冲击成本太高不能用,但你可以。
所以,不要总想着去抢机构的“秘密”。找那些机构看不上的角落,反而可能找到惊喜。
这一节,我来讲一个真实案例(不点名,对事不对人)。
几年前,市场上有一家私募非常火。他们的产品年化收益30%多,回撤控制得很好。宣传材料里说,他们用了“深度学习+自然语言处理”技术,从海量新闻里提取情绪信号,构建了“新一代智能因子”。
听起来很高大上,对吧?
后来,这个产品净值大幅回撤,有客户质疑。一位业内人士私下告诉我,他们所谓的“深度学习因子”,其实就是标准的新闻情感分析——把新闻分为正面、负面、中性,然后做多正面新闻的股票,做空负面新闻的。这种策略,学术圈十几年前就有了。
那为什么之前业绩那么好?不是因子厉害,而是因为他们选的股票刚好赶上了一波牛市,贝塔(市场收益)贡献了大部分收益。因子本身并没有多少Alpha。
我整理了几种常见的“因子包装术”,你以后遇到可以识别:
| 包装话术 | 实际意思 |
|---|---|
| “AI驱动因子挖掘” | 用遗传规划或随机森林生成了几百个因子,然后筛选了几个 |
| “另类数据因子” | 用了社交媒体、搜索指数等公开数据 |
| “机构级因子模型” | 多因子加权,通常就是等权或IC加权 |
| “量化基本面因子” | 财务指标的组合(比如ROE、毛利率) |
| “高频因子” | 用了Level2数据计算的一些盘口指标 |
不是说这些技术不好,而是它们并没有宣传的那么神奇。大多数都是公开的技术,你自己也能实现,只是需要花时间。
当你看到别人宣传一个“神奇因子”时,问三个问题:
记住一个原则:真正能赚钱的因子,没有人会卖。 如果有人愿意卖给你,要么因子已经失效了,要么它本来就不怎么赚钱,卖给你赚点咨询费更划算。
前面说了,机构的秘密不在于因子,而在于系统。这一节,我讲第一个系统层面的壁垒:组合优化。
你有N个因子,每个因子会给出一组股票的权重。你怎么把这些权重合起来,形成一个最终的组合?
最简单的做法:等权。每个因子给相同的权重,然后加总股票的得分,选得分最高的。
这种做法简单,但不是最优。因为因子之间的相关性不同。如果两个因子高度相关,等权就等于重复给同一类股票加码,风险集中。
机构的做法是用组合优化:设定一个目标(比如最大化预期收益、最小化风险、最大化夏普),在约束条件(比如单只股票权重不超过5%、行业中性、换手率限制)下,求解最优的因子权重和个股权重。
一个经典的组合优化模型是Black-Litterman。它结合了市场均衡收益和投资者的主观观点,输出一个“后验”的预期收益,然后再做均值-方差优化。
代码示例(简化版):
import numpy as np
def black_litterman(cov_matrix, market_weights, tau, P, Q, Omega):
"""
简化版Black-Litterman模型
cov_matrix: 资产协方差矩阵
market_weights: 市场组合权重
tau: 标量,通常取0.01-0.05
P: 观点矩阵(哪些资产的组合)
Q: 观点收益向量
Omega: 观点不确定性矩阵
"""
# 先验收益(市场隐含收益)
pi = tau * cov_matrix @ market_weights
# 计算后验收益
M = np.linalg.inv(np.linalg.inv(tau * cov_matrix) + P.T @ np.linalg.inv(Omega) @ P)
post_return = M @ (np.linalg.inv(tau * cov_matrix) @ pi + P.T @ np.linalg.inv(Omega) @ Q)
return post_return
这个模型的精妙之处:你不需要凭空猜测预期收益,而是从市场均衡出发,然后用你的因子信号(转化为观点)去调整。这样得到的组合,既利用了因子的预测能力,又不会偏离市场太远,风险更可控。
另一个机构常用的方法是风险平价。传统资产配置是按资金权重分配,但风险平价是按风险贡献分配。比如,股票的波动率是债券的三倍,那么在风险平价组合里,股票的权重只有债券的三分之一,使得两者对组合总风险的贡献相等。
在因子层面,风险平价可以用来分配因子权重:让每个因子对组合的风险贡献相同,避免某个因子主导风险。
代码示例(简单实现):
def risk_parity_weights(cov_matrix):
"""计算风险平价权重(简化版,使用数值优化)"""
from scipy.optimize import minimize
n = cov_matrix.shape[0]
def objective(weights):
port_var = weights @ cov_matrix @ weights
marginal_risk = cov_matrix @ weights
risk_contrib = weights * marginal_risk / port_var
return np.sum((risk_contrib - 1/n)**2)
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1)] * n
result = minimize(objective, np.ones(n)/n, method='SLSQP', bounds=bounds, constraints=constraints)
return result.x
这些优化模型听起来很复杂,但好消息是:你不需要完美复现。你可以用简化版:
免费的Python库PyPortfolioOpt提供了多种组合优化方法,包括风险平价、最大夏普、最小波动等,可以直接使用。
pip install PyPortfolioOpt
代码调试指南:
risk_models.exp_cov(指数加权)或者risk_models.shrink_cov(收缩估计)来减少噪声。机构资金量大,买卖股票会对市场造成冲击。冲击成本(slippage)有时候比手续费还高。因此,机构在算法交易上投入了大量资源。
假设你想买入100万股某只股票,当前价格10元。如果你用一个市价单全部买入,会把价格推到10.05元甚至更高,平均成交价可能是10.03元。这多出来的0.03元就是冲击成本(3个基点)。
对于大资金,冲击成本可能占到预期收益的一大部分。所以机构必须用算法来“拆单”,把大单拆成很多小单,慢慢买,减少冲击。
import pandas as pd
import numpy as np
def vwap_order(total_volume, historical_volume_profile, start_time, end_time, freq='1min'):
"""
total_volume: 要买入的总股数
historical_volume_profile: 历史成交量分布(比如过去20天每分钟成交量的平均值)
start_time, end_time: 交易时间段
"""
# 提取该时间段的成交量分布
profile = historical_volume_profile.loc[start_time:end_time]
profile = profile / profile.sum() # 归一化
# 计算每个时间点应下单的量
order_schedule = total_volume * profile
return order_schedule
如果你的资金量不大(比如几百万以下),冲击成本很小,直接用市价单或者限价单就行,不需要复杂的算法。但如果你资金量大了,或者你希望做高频交易,算法交易就很重要。
另外,有些券商提供免费的“智能订单”功能,可以在客户端里选择VWAP、TWAP等策略,不需要自己写代码。
实盘日志:一次因为冲击成本亏钱的教训
有一年,我的策略选出了一只小市值股票,逻辑很看好,决定买20%仓位。当时这只股票日均成交额只有2000万,我的买入量占了当天成交的5%。
我用了一个大单直接买入,结果股价被我硬生生推高了2%。当天收盘,股价又跌了回来,我相当于买在了高点。第二天我卖出(因为因子信号变了),股价又被我砸下去1.5%。一来一回,冲击成本加价差,亏了将近3个百分点,而因子的预期收益只有1.5%。
从那以后,我在回测框架里加入了冲击成本模型,而且对小市值股票设定了仓位上限(比如不超过日均成交额的1%)。现在回想,如果当初用了VWAP拆单,损失会小很多。
另类数据是指非传统的数据源,比如卫星图像、信用卡交易记录、网页爬虫、招聘信息等。机构可以用这些数据获得领先于市场的信号。
你不可能花几百万买卫星数据,但你可以利用公开的、低成本的替代信号:
假设你关注新能源汽车行业。你可以:
这个信号比财报更及时,而且完全免费。很多机构也是这样做的,只是他们可能在数据清洗和模型上做得更精细。
爬取公开数据时,要遵守网站的robots.txt和服务条款。有些网站禁止爬虫,强行爬取可能有法律风险。建议优先使用官方提供的API或开放数据接口。
传统多因子模型的权重是固定的(比如等权、IC加权)。但市场环境在变,因子的有效性也在变。能不能让因子权重也动态调整?
强化学习(Reinforcement Learning, RL)可以做到这一点。它通过试错学习,找到一个策略:在当前市场状态下,应该给每个因子分配多少权重。
import numpy as np
class FactorWeightRL:
def __init__(self, n_factors, n_states, learning_rate=0.1, discount=0.95):
self.q_table = np.zeros((n_states, n_factors)) # 简化为每个因子独立
self.lr = learning_rate
self.discount = discount
def choose_action(self, state, epsilon=0.1):
if np.random.random() < epsilon:
return np.random.randint(len(self.q_table[0]))
else:
return np.argmax(self.q_table[state])
def update(self, state, action, reward, next_state):
best_next = np.max(self.q_table[next_state])
td_target = reward + self.discount * best_next
td_error = td_target - self.q_table[state][action]
self.q_table[state][action] += self.lr * td_error
实盘日志:我用强化学习调权重的失败经历
我试过用PPO算法来动态调整三个因子的权重:小市值、反转、低波动。训练数据是2010-2018年,然后2019-2020年做样本外测试。
样本内表现很好,夏普达到了1.8。但样本外一跑,夏普只有0.4,还不如等权。
仔细分析,发现强化学习模型学会了“过拟合”到训练期的市场风格——那段市场正好是小市值因子表现好的时候,所以模型把大部分权重给了小市值。样本外风格切换了,模型没有适应。
后来我改用滚动窗口训练:每个月用过去36个月的数据重新训练一次模型。这样模型能捕捉到最近的市场风格变化。改进后,样本外夏普提升到了1.0,但还是不如一个简单的“过去3个月IC均值加权”的规则。
结论:强化学习在动态因子权重上效果有限,不如更简单的规则。可能这个问题的状态空间太大,而我的特征设计不够好。如果你对RL感兴趣,可以继续探索,但不要指望它成为你的秘密武器。
问题1:我能不能买到机构的“因子库”或“策略源码”?
市面上有很多卖量化策略的网站,几千到几万不等。我的建议是:不要买。真正赚钱的策略不会卖。那些卖的,要么是失效的,要么是回测过拟合的。你自己花时间学习,搭建自己的系统,比买别人的更可靠。
问题2:组合优化听起来很复杂,有没有简单好用的工具?
PyPortfolioOpt是一个很好的免费库,提供了多种优化方法,文档齐全。另外,聚宽、BigQuant等云平台也内置了组合优化模块,可以图形化操作。
问题3:我的资金量很小,需要关心冲击成本吗?
除非你做高频交易,或者买卖流动性很差的股票,否则冲击成本可以忽略。但建议你在回测中设置一个粗略的冲击成本(比如千分之一),这样更接近实盘。
问题4:另类数据值不值得花时间爬取?
如果你有编程能力,花一两天爬取一个公开数据源是值得的,因为你可以获得别人没有的信号。但不要投入太多时间——很多另类数据并没有想象中那么有效。先快速验证,效果好再深入。
问题5:我如何判断一个机构的宣传是否靠谱?
看他们的历史业绩是否可持续,尤其是在熊市的表现。要求他们提供样本外回测数据和实盘交易记录。如果他们不愿意提供,或者只给“模拟盘”数据,就要小心。
[
\mu_{BL} = \left[(\tau\Sigma)^{-1} + P^T \Omega^{-1} P\right]^{-1} \left[(\tau\Sigma)^{-1}\pi + P^T \Omega^{-1} Q\right]
]
[
w_i \cdot (\Sigma w)_i = w_j \cdot (\Sigma w)_j \quad \forall i,j
]
[
cost = \frac{1}{2} \cdot \text{spread} + \eta \cdot \left(\frac{\text{order_volume}}{\text{avg_daily_volume}}\right)^{0.6}
]
((\eta) 为冲击系数,约0.1)
PyPortfolioOpt或云平台做均值-方差优化。第四章到此结束。
这一章我们揭开了机构的神秘面纱。所谓的“密不外传”的因子,大多是包装;真正的壁垒是系统、流程和纪律,但这些你通过学习和实践也可以逐步建立。
下一章,我们会进入一个更实战的话题:当因子失效时,你该怎么办? 我会教你如何提前识别失效信号、如何止损、如何反制主力的收割,以及2024年初微盘股危机的完整复盘。
(第四章完。后续章节将按同样风格逐一输出。)
⚠️ 风险提示:本书内容仅为量化研究与知识分享,不构成任何投资建议。套利交易存在基差、费率、流动性、平台与极端行情等风险,历史表现不代表未来收益。投资有风险,入市需谨慎,请自主决策、量力而行。
💡 键盘 ←/→ 翻章 · T 键切换目录