04 · 可行性结论与个人落地路径¶
⚠️ 免责声明:本研究为量化/短期交易方法与可行性的探讨。所有回测均为历史模拟,不代表未来收益,不构成任何投资建议。真实交易受流动性、冲击成本、税费、心理与执行误差影响,结果通常更差。量化与短期交易可致重大本金亏损。读者需自行承担一切决策后果。
数据来源:A股 akshare(新浪后端) / 美股 yfinance,限流时降级腾讯行情;全部缓存于
data/*.csv,每个数字均可在本 notebook 单元复现。
把 01–03 的硬数据汇总,回答最初的问题:对一个能写代码、但非金融科班的个人投资者,做短期/量化到底值不值得? 给出分情景结论 + 「真要做第一周干什么」 + 「何时该止损放弃」。
import numpy as np, pandas as pd, matplotlib.pyplot as plt
import qr_data as q, qr_bt as bt
bt.setup_chinese_font(); np.random.seed(42)
data=q.load_all(verbose=False)
1. 硬数据汇总:主动择时 vs 被动持有/定投¶
把每个标的的「买入持有」与三类主动策略(含真实成本)并列,统计主动跑赢被动的比例。
strats={'双均线':lambda p:bt.sma_cross_signal(p,20,60),
'动量':lambda p:bt.momentum_signal(p,120,20),
'RSI均值回归':lambda p:bt.rsi_meanrev_signal(p,14,30,70)}
assets={'SPY':'US','QQQ':'US','AAPL':'US','MSFT':'US','600519':'A','600036':'A','000858':'A','000333':'A'}
wins=0; tot=0; recs=[]
for ak,mkt in assets.items():
px=data[ak]['close']; cost=bt.COST_A if mkt=='A' else bt.COST_US
bh=bt.perf_stats(px.pct_change());
for sn,fn in strats.items():
b=bt.backtest(px,fn(px),cost); st=bt.perf_stats(b['strat_ret'])
beat=st['年化收益']>bh['年化收益']; wins+=beat; tot+=1
recs.append(dict(标的=ak,策略=sn,主动年化=st['年化收益'],持有年化=bh['年化收益'],跑赢=beat))
summ=pd.DataFrame(recs)
print(f'主动(含成本)跑赢买入持有的比例: {wins}/{tot} = {wins/tot:.0%}')
print('主动年化 - 持有年化 的中位数: %.2f 个百分点'%((summ['主动年化']-summ['持有年化']).median()*100))
summ['主动年化']=(summ['主动年化']*100).round(1); summ['持有年化']=(summ['持有年化']*100).round(1)
summ
主动(含成本)跑赢买入持有的比例: 0/24 = 0% 主动年化 - 持有年化 的中位数: -9.42 个百分点
| 标的 | 策略 | 主动年化 | 持有年化 | 跑赢 | |
|---|---|---|---|---|---|
| 0 | SPY | 双均线 | 5.8 | 11.2 | False |
| 1 | SPY | 动量 | 6.0 | 11.2 | False |
| 2 | SPY | RSI均值回归 | 6.5 | 11.2 | False |
| 3 | QQQ | 双均线 | 5.9 | 18.6 | False |
| 4 | QQQ | 动量 | 13.9 | 18.6 | False |
| 5 | QQQ | RSI均值回归 | 9.5 | 18.6 | False |
| 6 | AAPL | 双均线 | 18.5 | 27.7 | False |
| 7 | AAPL | 动量 | 18.3 | 27.7 | False |
| 8 | AAPL | RSI均值回归 | 11.2 | 27.7 | False |
| 9 | MSFT | 双均线 | 13.4 | 26.9 | False |
| 10 | MSFT | 动量 | 19.6 | 26.9 | False |
| 11 | MSFT | RSI均值回归 | 8.7 | 26.9 | False |
| 12 | 600519 | 双均线 | 19.1 | 31.4 | False |
| 13 | 600519 | 动量 | 17.5 | 31.4 | False |
| 14 | 600519 | RSI均值回归 | 11.9 | 31.4 | False |
| 15 | 600036 | 双均线 | 11.2 | 17.8 | False |
| 16 | 600036 | 动量 | 7.9 | 17.8 | False |
| 17 | 600036 | RSI均值回归 | 4.6 | 17.8 | False |
| 18 | 000858 | 双均线 | 24.9 | 26.5 | False |
| 19 | 000858 | 动量 | 17.0 | 26.5 | False |
| 20 | 000858 | RSI均值回归 | 4.5 | 26.5 | False |
| 21 | 000333 | 双均线 | 18.0 | 22.5 | False |
| 22 | 000333 | 动量 | 18.0 | 22.5 | False |
| 23 | 000333 | RSI均值回归 | 6.6 | 22.5 | False |
解读:在精心挑选的长牛标的上、用乐观成本,主动择时跑赢买入持有的比例仍是少数,且超额收益中位数为负。这是过去十年最有利于多头持有的样本——主动量化连这关都过不去。
2. 替代方案基准:指数定投(DCA)¶
个人最该比较的不是「别的策略」,而是无脑定投指数这个几乎零成本、零时间的基准。
def dca(px, monthly=1.0):
m=px.resample('ME').last(); units=(monthly/m).cumsum(); val=units*m
invested=pd.Series(np.arange(1,len(m)+1)*monthly,index=m.index)
return val, invested
fig,ax=plt.subplots(1,2,figsize=(13,4.5))
for i,(idx,nm) in enumerate([('CSI300','沪深300'),('SPY','标普500')]):
val,inv=dca(data[idx]['close'])
ax[i].plot(val.index,val,label='定投市值',color='green')
ax[i].plot(inv.index,inv,label='累计本金',color='gray',ls='--')
tot_ret=val.iloc[-1]/inv.iloc[-1]-1; yrs=len(val)/12
irr=(val.iloc[-1]/inv.iloc[-1])**(1/yrs)-1
ax[i].set_title(f'{nm}月定投: 总回报{tot_ret:.0%} 近似年化{irr:.1%}'); ax[i].legend()
plt.tight_layout(); plt.show()
解读:定投沪深300十年回报平平(A股是出名的牛短熊长),但定投标普500表现稳健。重点不是收益数字,而是:定投花的时间≈每月5分钟、成本≈0、不需要任何编程或择时能力。任何主动策略要证明自己「值得做」,必须先稳定地、扣除时间成本后打败这条懒人基准——这非常难。
3. 盈亏平衡所需的「超额能力」¶
换个角度量化门槛:给定年换手,光是抵消成本就需要多少年化超额(alpha)?
rt_A=2*(bt.COST_A['commission']+bt.COST_A['slippage']+bt.COST_A['transfer'])+bt.COST_A['stamp_sell']
rt_US=2*(bt.COST_US['commission']+bt.COST_US['slippage']+bt.COST_US['transfer'])+bt.COST_US['stamp_sell']
turns=[2,5,12,50,250] # 年换手次数: 低频->日内
freq=['周/月级','双周级','月内多次','每周','准日内']
rows=[]
for t,fq in zip(turns,freq):
rows.append(dict(年换手=t,频率档=fq,A股需年化alpha=f'{t*rt_A:.1%}',美股需年化alpha=f'{t*rt_US:.1%}'))
pd.DataFrame(rows)
| 年换手 | 频率档 | A股需年化alpha | 美股需年化alpha | |
|---|---|---|---|---|
| 0 | 2 | 周/月级 | 0.4% | 0.1% |
| 1 | 5 | 双周级 | 1.0% | 0.2% |
| 2 | 12 | 月内多次 | 2.4% | 0.5% |
| 3 | 50 | 每周 | 10.1% | 2.0% |
| 4 | 250 | 准日内 | 50.5% | 10.0% |
解读:这张表是「短线难」的定量核心。年换手250次(准日内)的策略,光成本就要求 A股每年~50%、美股~10% 的超额收益才不亏——这还没算税和你的时间。顶级量化机构的长期年化也就20-40%且波动巨大;指望个人靠日内稳定跑出这个数,在统计上接近不可能。高频/日内对个人 = No,这是算出来的,不是态度。
4. 分情景结论矩阵¶
按「资金量级 × 可投入时间」给建议。
scen=pd.DataFrame(
[['指数定投+规则化再平衡\n(别碰主动量化)','指数定投为主, 小仓位练手\n当学费不当收入','低频因子/趋势可一试\n仍以被动为底仓'],
['同上, 主动量化是负EV','可做低频系统化\n严控换手与成本','可搭半专业化流程\n仍难稳定超额'],
['同上','低频量化+另类数据\n值得认真投入','唯一相对可行档:\n全职+资金+工程, 但仍九死一生']],
index=['业余(<5h/周)','认真(5-15h/周)','全职(>30h/周)'],
columns=['<50万','50万-300万','>300万'])
fig,ax=plt.subplots(figsize=(12,4)); ax.axis('off')
t=ax.table(cellText=scen.values,rowLabels=scen.index,colLabels=scen.columns,cellLoc='center',loc='center')
t.auto_set_font_size(False); t.set_fontsize(9); t.scale(1,3.2)
colors=[['#f8d0d0','#f8e3d0','#f3f3c0'],['#f8d0d0','#f3f3c0','#f3f3c0'],['#f8d0d0','#d6f0d0','#d6f0d0']]
for i in range(3):
for j in range(3): t[(i+1,j)].set_facecolor(colors[i][j])
ax.set_title('个人投资者 短期/量化 可行性矩阵 (红=不值得 黄=谨慎 绿=相对可行)',pad=20)
plt.tight_layout(); plt.show()
解读:绿区(相对可行)只有一格——全职 + >300万资金 + 工程能力,且仍是「九死一生、低频为主」。绝大多数个人(业余 + 中小资金)落在红/黄区:主动量化对你大概率是负期望值游戏,最优解是被动定投 + 规则化再平衡。这不是劝退,是把概率摆给你看。
5. 如果你仍想做:第一周最小起步清单¶
落在黄/绿区、且认了「这是高风险技能投资」的人,第一周别写策略,先搭地基:
- Day 1-2 环境:装好 Python + 本研究这套(akshare/yfinance + backtrader/向量化),把 00-03 notebook 自己跑通一遍,确认每个数字能复现。
- Day 3 基准:先用真钱开一个指数定投账户。这是你日后所有策略的及格线。
- Day 4-5 一个策略, 全流程:只做一个最简单的策略(如双均线),强制含成本、留样本外、固定seed,写出 01-03 的六条检查清单逐项自查。
- Day 6 纸上模拟:接券商模拟盘(IBKR/Alpaca paper, 或 QMT/Ptrade模拟),让策略在真实行情下空跑,记录与回测的偏差(滑点/成交)。
- Day 7 复盘:算一笔账——你这周花的时间,按时薪折现是多少?策略的预期年收益覆盖得了吗?
核心纪律:先用最小资金验证「流程」,而不是用大资金验证「信仰」。
6. 何时该止损放弃(量化的 KILL 判据)¶
技能投资也要有止损线。满足任一条,就该停掉主动量化、回到被动方案:
| 判据 | 阈值 |
|---|---|
| 样本外失效 | 策略上实盘/模拟3-6个月,夏普 < 回测的一半 |
| 跑不赢懒人基准 | 连续12个月,扣时间成本后跑不赢指数定投 |
| 时薪为负 | 投入时间×合理时薪 > 策略年化超额收益的金额 |
| 回撤越线 | 实盘最大回撤超过回测的1.5倍或你的心理承受线 |
| 换手成本黑洞 | 实际成本/滑点显著高于回测假设,吃掉>50%毛收益 |
把这些写进策略文档, 开始前就定好。 没有预设的止损线 = 用亏损慢慢说服自己「再等等」。
7. 诚实的最终判断¶
- 短期/高频交易对个人:基本是 No。 成本×换手的数学(第3节)直接判了死刑。
- 中低频系统化/因子量化对个人:可学不可幻想。 是一项高风险技能投资,预期不是「躺赚」,而是「大概率跑不赢指数定投,但能让你彻底看懂市场、不再被割」。
- 对绝大多数读者(业余+中小资金):最优解是被动定投 + 资产配置 + 规则化再平衡,把省下的时间投到你的主业/高时薪技能上——那才是个人最大的、确定性的 alpha。
- 「能写代码」是入场券, 不是胜券。 它让你看懂陷阱、避免被割,但不构成可持续超额收益的来源。
一句话:做量化最大的收益, 往往是让你下决心不做主动量化。 这就是本研究最值钱的结论。