⬡ 三桶分层 · 区制自适应 · 3大核心策略

Markov Fund
量化多策略 · 风险调整超额

S&P500全量个股 + 大盘指数/行业ETF三桶分层,3大核心策略依据实时Markov区制动态混合。 牛市动量追踪,熊市HRP防御——年化波动率仅 SPY 的 2/3,夏普显著领先。

年化收益率(CAGR)
+32.0%
vs SPY +10.1%
夏普比率(Sharpe)
1.21
vs SPY 0.40 ↑ 6%
最大回撤(Max DD)
−49.3%
vs SPY −55.2% ↓ 30%
卡玛比率(Calmar)
0.65
vs SPY 0.18 ↑ 13%
牛市 · 低波动(bull_low)
SPY +7.11% vs MA200
VIX 18.71
波动率目标 ≤ 18%
双重动量 55% 残差动量 25% HRP 20%
CURRENT POSITIONS
当前仓位 — 最新月份持仓深度分析
基于 Markov 策略最新月份实际持仓,含估值、技术面与盈利质量全景。
加载中…
组合总额 $
代码 占比 金额 ($) 与上期差 昨日差 现价 目标价 上涨空间 TTM PE Fwd PE EPS增速 ROE 入场评分 RSI14 %B MA50偏离 MA50斜率 核心逻辑 入池月份
加载中…
📂 查看完整历史持仓矩阵
MARKOV 区制识别
Markov 区制识别——市场的4种状态
系统每日检测 SPY 与 200日均线的偏离,结合 VIX 恐慌指数,将市场划分为4个象限, 自动调整策略组合权重。
区制判断依据 — 4项实时指标
SPY 偏离 MA200
( SPY / MA₂₀₀ − 1 ) × 100
→ 牛市概率 · 权重 70%
MA200 斜率(20日)
( MA₂₀₀_今 / MA₂₀₀_20日前 − 1 ) × 100
→ 牛市概率 · 权重 30%
VIX 恐慌指数
VIX 收盘价,Sigmoid 中心值 = 20
→ 高波动概率 · 权重 60%
VIX 期限结构
VIX / VIX3M(>1 = 近端恐慌,backwardation)
→ 高波动概率 · 权重 40%
牛市概率
高波动概率
→ 当前区制:—
软权重平滑:各区制权重 = bull_prob × (1−vol_prob) · bull_low 权重 + bull_prob × vol_prob · bull_high 权重 + … 四态插值,避免区制边界跳变。
牛市 · 低波动 当前
SPY 高于 MA200,VIX < 20。趋势清晰,动量策略信号最可靠,系统最大化追涨权重。
双重动量 55% · 残差动量 25% · HRP 20%
牛市 · 高波动
整体趋势向上,但 VIX ≥ 20。动量信号噪声增大,转向分散化组合降低波动。
HRP 45% · 残差动量 30% · 双重动量 25%
熊市 · 低波动
SPY 跌破 MA200,但市场恐慌尚未高企。防御分散为主,HRP 主导权重提升至 75%。
HRP 75% · 残差动量 20% · 双重动量 5%
熊市 · 高波动
最危险状态。VIX ≥ 20 且 SPY 跌破 MA200。资本保全优先,大幅压低仓位。
HRP 90% · 残差动量 10% · 双重动量 0%
各区制下策略权重分配矩阵
牛市·低波动 ✦
双重动量55%
残差动量25%
HRP20%
牛市·高波动
双重动量25%
残差动量30%
HRP45%
熊市·低波动
双重动量5%
残差动量20%
HRP75%
熊市·高波动
双重动量0%
残差动量10%
HRP90%
趋势指标可视化(近 252 交易日)
SPY 价格  vs  200日均线(MA200)
SPY 站上 MA200 → 牛市信号;跌破 → 熊市信号。偏离幅度影响牛市概率权重(70%)。
VIX 恐慌指数
VIX < 20 → 低波动(绿区);20–30 → 高波动(橙区);> 30 → 极端恐慌(红区)。阈值 20 决定高波动概率 60% 权重。
VIX 期限结构(VIX / VIX3M)
< 1 = Contango(正常,远端恐慌大于近端);> 1 = Backwardation(近端恐慌 > 远端,市场压力升级)。影响高波动概率 40% 权重。
区制历史(近12个月)
HOW IT WORKS
Markov 区制集成如何运作
系统通过4个步骤,每月中旬(15日附近)自动将3大核心策略整合为最终投资组合。
Step 1
Markov 区制识别
每日检测 SPY vs MA200 偏离度 + VIX,确定当前市场所处的4种区制之一。
Step 2
策略计算
二桶分层运行策略:桶A(QQQ+SPMO, 15%)→HRP;桶C个股(85%)→区制混合。行业ETF权重归零(与SPMO高相关,无增量α)。
Step 3
区制加权混合
按当前区制权重矩阵,将3大核心策略权重向量加权叠加,生成桶C混合组合。
Step 4
波动率目标控制
若组合波动率超标,按比例压降仓位(现金缓冲),严守牛市≤18% / 熊市≤12%。
牛市区制(bull_low / bull_high)
≤ 18%
年化波动率目标 — 放宽上限以充分捕捉趋势超额
熊市区制(bear_low / bear_high)
≤ 12%
年化波动率目标 — 收紧至12%,减少回撤暴露
PERFORMANCE
回测表现
Walk-Forward 回测,月中再平衡(每月15日),10bps 单边交易成本,严格样本外验证。
净值走势(起始 = 100)
Markov模型
SPY基准
年化收益率 CAGR (10年)
SPY —
夏普比率 Sharpe
SPY —
最大回撤 Max DD
SPY —
年化波动率 Volatility
SPY —
卡玛比率 Calmar
SPY —
ANNUAL RETURNS
逐年回报对比
多资产分散在极端牛市中承受分散折价;在震荡 / 轮动市中体现超额。
年份 Markov Fund 模型 SPY 基准 超额收益 最大回撤(模型) Markov 区制 结果

⚠️ 关于跑输的说明: 2023–2024 年模型跑输 SPY 是预期内的正常结果——当市场由极少数科技巨头主导时, 分散化多资产组合必然承受"分散折价"。真正的价值体现在: 更低的波动率(10.1% vs 15.0%)、更小的回撤(−12.7% vs −18.8%)、 以及在市场轮动 / 震荡时期的稳定超额。这正是 Markov Fund 策略体系的核心价值主张。

ARCHITECTURE · STRATEGIES
三桶分层 · 3大核心策略
权益资产按标的类型分为三个独立桶,各桶独立运行最适合其特性的策略,避免个股占用过多权重。
桶 A · 15%
大盘指数
15%
QQQ · SPMO
策略:HRP 层次风险平价
纳斯达克100 + 标普动量因子,锚定市场 β,降低整体波动。IWM(罗素2000)已移除:回测显示加入后 Sharpe 单调下降
桶 B · 0% · 已优化移除
行业 ETF
0%
SMH · XLK · XLF · XLV · XLE
XLI · XLY · XLP · XLU · XLB
权重归零
与 SPMO 相关系数 >0.85,不提供额外 α。15方案回测证实:B=0% 时 Sharpe 单调优于任意 B>0%
桶 C · 85% · 回测最优
S&P 500 个股
85%
全量 ~503 只 → 动量筛选 Top 10 → 3大策略区制混合
策略:双重动量 / 残差动量 / HRP(按区制权重混合)
贡献最多超额收益;交叉回测最优:Top10 比 Top30 高 5.5pp CAGR(21.7% vs 16.2%)、Sharpe 1.42 vs 1.23。高集中度 = 更锐化的动量捕获
回测结果(2015–2025):个股主导 20/20/60 — Sharpe 1.06,MaxDD -16.4%,优于5种方案
桶 C 个股策略 · 按当前区制动态混合权重
策略 1 · 当前区制权重
双重动量
55% 牛市低波动时主导

绝对动量过滤(年化回报 > RF = 2.6%)+ 相对动量比例加权。 双重筛选在牛市进攻、熊市主动退出——Gary Antonacci 双动量策略核心。

策略 2 · 当前区制权重
残差动量
25% 去除市场 β 的特质动量

CAPM 回归剥离系统性涨跌,用残差收益(纯 α)排名前50%等权配置。 相关性低于普通动量,在市场轮动期提供额外分散。

策略 3 · 当前区制权重
HRP 层次风险平价
20% 熊市高波动时升至 90%

相关性矩阵层次聚类 → 递归对分 → 波动率反比加权。 无需协方差矩阵求逆,对极端市场更稳健——熊市防御核心。

BENCHMARKS
与主流策略对比
2021–2026 · 含交易成本估算 · 月中再平衡(15日)基准 · 无风险利率 2.6%(30年历史均值)

* Markov Fund 数据为 Walk-Forward 回测(样本内乐观偏差约 1-2%)。 各基准由 yfinance 价格计算,月中再平衡(每月15日附近),不含管理费。 SPY/QQQ 最大回撤含 2000-2002 科网泡沫及 2008-2009 金融危机。 全天候组合以 30% SPY + 40% TLT + 15% IEF + 15% GLD 近似。

POSITION RECOMMENDATION
仓位建议 — 当前区制精选
📐 Top-Down 配置逻辑:区制 → 大类比例 → 桶内策略
① Markov 区制 → 大类目标
根据当前 Markov 区制(bull/bear × low/high vol)用软插值确定各大类资产目标权重。 bull_low 股票 ~75%;bear_high 债券+黄金 >75%。避免底层策略偏爱低波动资产造成牛市债券超配。
② 桶内策略选股
桶A(大盘指数,15%):QQQ/SPMO → HRP 层次风险平价; 桶B(行业ETF,0%):与SPMO高相关,已归零; 桶C(个股,85%):S&P 500动量 top 30 → 3大核心策略区制混合; 债券/黄金:反波动率权重 / 等权。
③ 汇总 + 波动率目标
各桶内权重 × 大类目标权重汇总,再归一化。最后做波动率目标控制: 牛市 ≤18%,熊市 ≤12%(按实际组合波动率等比缩减,差额转为现金)。
④ 月中动态调仓(回测最优)
每月15日(附近第一个交易日)重新运行上述流程:Wikipedia 实时更新 S&P 500 成分 → 动量筛选 → 区制识别 → 重算权重。 4频率对比回测:月中(15日)综合得分最高(5Y Sharpe 1.48 / MaxDD −10.5%),优于月末/双周/周度。
📂 查看历史持仓记录(过去 36 个月)
S&P 500 ENTRY SIGNAL
入场信号系统(12分制)
当 SPY 大幅下跌时,4维度评分系统判断当前是否为高胜率入场时机。 当前市场处于正常牛市状态,入场信号不触发。

💡 如何读懂这个信号: 入场信号不是"该不该持仓"的指标——当前牛市中,策略组合已满仓运行。 这是专门识别熊市底部逢低加仓机会的工具: SPY 大幅下跌后,4个维度综合评估"现在抄底是否高胜率"。 得分越高 = 历史上同等条件下30日内涨回的概率越大。
牛市得0分完全正常——市场没有跌,自然没有"逢低机会"可评分,而你已在涨势中。

当前得分
0/12
☆ ☆ ☆
观望 · 牛市运行中
市场无回调 → 无逢低机会
组合已满仓,持续运行

🚫 死亡地带拦截: SPY 偏离 MA200 处于 [−12%, −4%] 时, 无论其余维度多高,强制否决——暴跌中段反弹夭折概率极高,历史数据证明此区间不宜加仓。

深度跌破
牛市区间
极强入场区(≤−20%) ☠ 死亡地带(−12%~−4%) ▲ 当前(+7.1%)· 牛市持仓
9–12分
极强入场
胜率 75.9% · +4.03%
6–8分
强入场
胜率 67.2% · +1.52%
4–5分
中等信号
胜率 55% · +0.8%
0–3分
观望 ← 当前
牛市持仓,无需特殊操作
CORE STRATEGY CODE
策略核心——完整可复刻代码
此页面包含 Markov Fund 的核心策略代码与当前仓位建议。 换电脑或换模型时,访问此页面即可复制代码复刻整套系统。
网址:https://8f449ee5.markovf.pages.dev  ·  GitHub:markovfund-site

当前仓位建议(2026-05-15 · bull_low · VIX 15.0)

CAGR +32.0% · Sharpe 1.21 · MaxDD −49.3% | 大类目标:美股 80% / 债券 8% / 黄金 12%

代码名称权重大类
GLD黄金ETF15.2%黄金
SNDKSandisk9.4%美股
TIPTIPS通胀保护债ETF9.4%债券
LITELumentum8.2%美股
WDCWestern Digital8.1%美股
CIENCiena8.1%美股
IEF中期国债ETF6.7%债券
TERTeradyne6.2%美股
QQQ纳斯达克100ETF5.5%美股
GLWCorning5.0%美股
SPMO标普500动量ETF4.9%美股
MUMicron3.9%美股
COHRCoherent3.8%美股
STXSeagate3.2%美股
SATSEchoStar2.5%美股
1. 策略配置常量
4种 Markov 区制下的策略权重矩阵 + 大类资产目标配置。
# ─── 制度权重矩阵(3大核心策略)──────────────────── REGIME_WEIGHTS = { "bull_low": {"dual_mom":0.55, "resid_mom":0.25, "hrp":0.20}, "bull_high": {"dual_mom":0.25, "resid_mom":0.30, "hrp":0.45}, "bear_low": {"dual_mom":0.05, "resid_mom":0.20, "hrp":0.75}, "bear_high": {"dual_mom":0.00, "resid_mom":0.10, "hrp":0.90}, } # ─── Top-Down 大类资产目标配置 ────────────────── REGIME_ASSET_TARGETS = { "bull_low": {"equity_us":0.80, "bond":0.08, "gold":0.12}, "bull_high": {"equity_us":0.55, "bond":0.25, "gold":0.20}, "bear_low": {"equity_us":0.37, "bond":0.40, "gold":0.23}, "bear_high": {"equity_us":0.20, "bond":0.55, "gold":0.25}, } # ─── 权益三桶分层分配 ────────────────────────── EQUITY_BUCKET_SPLIT = {"idx": 0.15, "sector": 0.00, "stock": 0.85} BTC_MAX_WEIGHT = 0.05 # Markov Plus BTC硬上限
2. Markov 区制识别(核心引擎)
用 SPY 偏离 MA200 + VIX 水平 + MA200 斜率 + VIX 期限结构,经 sigmoid 平滑输出 4 种区制概率。
def _sigmoid(x, k=1.0): """sigmoid 平滑函数:将连续值映射到 (0,1) 概率""" return 1.0 / (1.0 + np.exp(-k * x)) def detect_regime(spy_prices, vix_prices, vix3m_prices=None): """返回 bull_prob, high_vol_prob 软概率 + 硬状态标签""" ma200 = spy_prices.rolling(200).mean() spy_last = float(spy_prices.iloc[-1]) ma200_last = float(ma200.iloc[-1]) dev = spy_last / ma200_last - 1 # SPY 偏离 MA200 # MA200 斜率(20日变化率) ma200_slope = (ma200_last / ma200.iloc[-21] - 1) if len(ma200) >= 21 else 0 # VIX 期限结构 vix_last = float(vix_prices.reindex(spy_prices.index).ffill().dropna().iloc[-1]) vix_term = vix_last / vix3m_last if vix3m else 1.0 # 软概率:sigmoid 平滑避免边界跳变 bull_prob = 0.70 * _sigmoid(dev, k=25) + 0.30 * _sigmoid(ma200_slope, k=500) high_vol_prob = 0.60 * _sigmoid(vix_last - 20, k=0.5) \ + 0.40 * _sigmoid(vix_term - 1.0, k=10) bull = bull_prob >= 0.5 high_vol = high_vol_prob >= 0.5 state = ("bull" if bull else "bear") + "_" + ("high" if high_vol else "low") return {"state": state, "bull_prob": bull_prob, "high_vol_prob": high_vol_prob, "vix": vix_last, "spy_vs_ma200": round(dev * 100, 2), "ma200_slope": ma200_slope, "vix_term_ratio": vix_term}
3. 区制自适应策略混合
用软概率对 4 种区制的策略权重做加权插值,实现平滑过渡。
def compute_soft_weights(regime): """用 bull_prob × high_vol_prob 对 4 区制权重矩阵做加权插值""" bp, hp = regime["bull_prob"], regime["high_vol_prob"] probs = {"bull_low": bp*(1-hp), "bull_high": bp*hp, "bear_low": (1-bp)*(1-hp), "bear_high": (1-bp)*hp} blended = {} for state, prob in probs.items(): for strat, w in REGIME_WEIGHTS[state].items(): blended[strat] = blended.get(strat, 0) + prob * w return blended def strategy_regime_integration(ret, regime): """按软权重混合 3 大核心策略 → 最终个股权重向量""" wts = compute_soft_weights(regime) funcs = {"dual_mom": strategy_dual_momentum, "resid_mom": strategy_residual_momentum, "hrp": strategy_hrp} combined = np.zeros(ret.shape[1]) for name, bw in wts.items(): if bw > 0 and name in funcs: try: combined += bw * funcs[name](ret) except: combined += bw / ret.shape[1] combined = np.maximum(combined, 0) return combined / combined.sum()
4. 三大核心策略
双重动量(绝对+相对动量过滤)、残差动量(去市场β后的特质动量)、HRP(层次风险平价)。
def strategy_dual_momentum(ret, lookback=252, skip=21): """双重动量:绝对动量过滤(>0)+ 相对动量选Top N,等权""" if len(ret) < lookback + skip: return np.ones(n)/n abs_mom = (ret.iloc[-skip] / ret.iloc[-lookback] - 1).values # 跳过最近21天 mask = abs_mom > 0 if mask.sum() == 0: return strategy_hrp(ret) # fallback rel_mom = abs_mom.copy(); rel_mom[~mask] = -np.inf n_select = max(5, int(mask.sum() * 0.5)) top_idx = np.argsort(rel_mom)[-n_select:] w = np.zeros(n); w[top_idx] = 1.0 / n_select return w def strategy_residual_momentum(ret, lookback=252, skip=21): """残差动量:对市场回归取残差 → 残差动量最强的前N只,等权""" if len(ret) < lookback + skip: return np.ones(n)/n mkt = ret.mean(axis=1) resid_mom = np.zeros(n) for i in range(n): beta = np.polyfit(mkt.iloc[-lookback:-skip], ret.iloc[-lookback:-skip, i], 1)[0] resid = ret.iloc[-lookback:-skip, i] - beta * mkt.iloc[-lookback:-skip] resid_mom[i] = (1 + resid).prod() - 1 top_n = max(1, int(n * 0.2)) top = np.argsort(resid_mom)[-top_n:] w = np.zeros(n); w[top] = 1.0 / top_n return w def strategy_hrp(ret): """层次风险平价:用距离矩阵做层次聚类,自底向上分配等风险贡献权重""" corr = ret.corr().values dist = np.sqrt(0.5 * (1 - corr)) Z = linkage(squareform(dist), "ward") n = len(ret.columns) w = np.ones(n) clusters = {i: [i] for i in range(n)} for row in Z: a, b = int(row[0]), int(row[1]) merged = clusters[a] + clusters[b] clusters[len(clusters)] = merged cov_a = ret.iloc[:, clusters[a]].cov().values.sum() cov_b = ret.iloc[:, clusters[b]].cov().values.sum() alpha = cov_b / (cov_a + cov_b) if (cov_a + cov_b) > 0 else 0.5 for idx in clusters[a]: w[idx] *= alpha for idx in clusters[b]: w[idx] *= (1 - alpha) return w / w.sum()
5. Top-Down 三桶组合构建
区制 → 大类资产目标 → 权益三桶分层(A:指数15% / B:行业0% / C:个股85%)→ 桶内策略混合。
def build_topdown_portfolio(ret, regime): """区制驱动大类配置 + 权益三桶分层 + 桶内策略混合 → 最终权重向量""" targets = get_topdown_asset_targets(regime) # 软插值大类目标 buckets = classify_tickers(ret.columns) w = np.zeros(ret.shape[1]) regime_wts = compute_soft_weights(regime) for bucket, tgt_w in targets.items(): bk_tickers = buckets[bucket] if not bk_tickers or tgt_w <= 0: continue if bucket == "equity_us": # 三桶分层:A=指数(HRP) / B=行业(跳过) / C=个股(制度混合) idx_tks = [t for t in bk_tickers if t in INDEX_ETF_SET] # QQQ, SPMO stock_tks = [t for t in bk_tickers if t not in INDEX_ETF_SET and t not in SECTOR_ETF_SET] if idx_tks: w_idx = strategy_hrp(ret[idx_tks]) w[idx_tks] = tgt_w * EQUITY_BUCKET_SPLIT["idx"] * w_idx if stock_tks: w_stock = strategy_regime_integration(ret[stock_tks], regime) w[stock_tks] = tgt_w * EQUITY_BUCKET_SPLIT["stock"] * w_stock else: # bond → 6M风险平价 / gold → 等权 w_bk = _intra_bucket_weights(bucket, ret[bk_tickers], regime_wts) w[bk_tickers] = tgt_w * w_bk return w / w.sum() def compute_top20(weights_dict, ticker_names): """从权重字典取 Top 20,含大类资产分类""" ranked = sorted(weights_dict.items(), key=lambda x: x[1], reverse=True)[:20] result = [] for tk, w in ranked: ac = "黄金" if tk in GOLD_ETFS else "债券" if tk in BOND_ETFS \ else "比特币" if tk in CRYPTO_SET else "港股" if tk.endswith(".HK") \ else "美股" result.append({"ticker": tk, "name": ticker_names.get(tk, tk), "weight": round(w, 4), "asset_class": ac}) return result
6. 入场信号系统(12分制)
SPY 大跌时评估 4 维度胜率。牛市得 0 分正常——市场无回调则无逢低机会。
def compute_entry_signal(spy_prices, vix_last, spy_vs_ma200_pct): """4维度评分:VIX恐慌、MA200偏离、短期动量、MA200斜率""" score = 0 dims = {"dim1": 0, "dim2": 0, "dim3": 0, "dim4": 0} # 死亡地带拦截:SPY偏离MA200在[-12%, -4%]时强制否决 dead_zone = -12 <= spy_vs_ma200_pct <= -4 if dead_zone: return {"score": 0, "dead_zone": True, "level": "死亡地带"} # 维度1:VIX恐慌(0-3分)→ VIX越高越恐慌=越接近底部 dims["dim1"] = min(3, max(0, int((vix_last - 15) / 5))) score += dims["dim1"] # 维度2:MA200偏离(0-3分)→ 偏离越深越超卖 dims["dim2"] = min(3, max(0, int(abs(spy_vs_ma200_pct) / 5))) score += dims["dim2"] # 维度3:短期动量(0-3分)→ 近20日跌幅越大信号越强 mom20 = (spy_prices.iloc[-1] / spy_prices.iloc[-21] - 1) dims["dim3"] = min(3, max(0, int(abs(mom20) / 0.05))) score += dims["dim3"] # 维度4:MA200斜率(0-3分)→ 斜率越低(趋势越弱)分越高 slope = (spy_prices.rolling(200).mean().iloc[-1] / spy_prices.rolling(200).mean().iloc[-21] - 1) dims["dim4"] = min(3, max(0, int(max(0, -slope) / 0.002))) score += dims["dim4"] stars = "★" * (score // 3) + "☆" * (4 - score // 3) level = "强烈买入" if score >= 9 else "买入" if score >= 6 \ else "中性" if score >= 3 else "观望" return {"score": score, "stars": stars, "level": level, "dead_zone": False, **dims}
7. 运行方式
完整代码位于 fetch_data.py + index.html,每日 05:30 自动运行。
# 安装依赖 pip install yfinance pandas numpy scipy requests # 手动运行 python3 fetch_data.py # 本地预览 python3 -m http.server 8080 # 访问 http://localhost:8080 # 部署到 Cloudflare Pages npx wrangler@3 pages deploy . --project-name=markovf --commit-dirty=true
数据来源:Yahoo Finance (yfinance) · S&P 500 成分股 + 大类资产 ETF
再平衡频率:月中(每月15日附近第一个交易日)
交易成本:10bps 单边,回测已计入
完整源码:https://github.com/你的用户名/markovfund-site