04 · 可行性结论与个人落地路径¶

⚠️ 免责声明:本研究为量化/短期交易方法与可行性的探讨。所有回测均为历史模拟,不代表未来收益,不构成任何投资建议。真实交易受流动性、冲击成本、税费、心理与执行误差影响,结果通常更差。量化与短期交易可致重大本金亏损。读者需自行承担一切决策后果。

数据来源:A股 akshare(新浪后端) / 美股 yfinance,限流时降级腾讯行情;全部缓存于 data/*.csv,每个数字均可在本 notebook 单元复现。


把 01–03 的硬数据汇总,回答最初的问题:对一个能写代码、但非金融科班的个人投资者,做短期/量化到底值不值得? 给出分情景结论 + 「真要做第一周干什么」 + 「何时该止损放弃」。

In [1]:
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 被动持有/定投¶

把每个标的的「买入持有」与三类主动策略(含真实成本)并列,统计主动跑赢被动的比例。

In [2]:
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 个百分点
Out[2]:
标的 策略 主动年化 持有年化 跑赢
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)¶

个人最该比较的不是「别的策略」,而是无脑定投指数这个几乎零成本、零时间的基准。

In [3]:
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()
No description has been provided for this image

解读:定投沪深300十年回报平平(A股是出名的牛短熊长),但定投标普500表现稳健。重点不是收益数字,而是:定投花的时间≈每月5分钟、成本≈0、不需要任何编程或择时能力。任何主动策略要证明自己「值得做」,必须先稳定地、扣除时间成本后打败这条懒人基准——这非常难。

3. 盈亏平衡所需的「超额能力」¶

换个角度量化门槛:给定年换手,光是抵消成本就需要多少年化超额(alpha)?

In [4]:
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)
Out[4]:
年换手 频率档 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. 分情景结论矩阵¶

按「资金量级 × 可投入时间」给建议。

In [5]:
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()
No description has been provided for this image

解读:绿区(相对可行)只有一格——全职 + >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。
  • 「能写代码」是入场券, 不是胜券。 它让你看懂陷阱、避免被割,但不构成可持续超额收益的来源。

一句话:做量化最大的收益, 往往是让你下决心不做主动量化。 这就是本研究最值钱的结论。