{
  "generated_at": "2026-04-02T09:13:28+08:00",
  "project": "QuantWhisper",
  "strategy": {
    "strategy": "EXP0004_upgraded",
    "lambda_risk": 0.0,
    "periods": 22,
    "annual_return": 0.49220493153624845,
    "annual_benchmark_return": 0.3317320703977973,
    "annual_excess_return": 0.12429638346116767,
    "max_drawdown": -0.10339178227086843,
    "sharpe": 1.9080841360807779,
    "information_ratio": 2.556229232183461,
    "avg_turnover": 0.7143568391034354
  },
  "comparison_metrics": [
    {
      "strategy": "EXP0003_like_baseline",
      "lambda_risk": "0.0",
      "periods": "22",
      "annual_return": "0.48829623349680973",
      "annual_benchmark_return": "0.3317320703977973",
      "annual_excess_return": "0.12042456906470855",
      "max_drawdown": "-0.102655498664324",
      "sharpe": "1.9183037320771033",
      "information_ratio": "2.3078537300791124",
      "avg_turnover": "0.6314478438891468"
    },
    {
      "strategy": "EXP0004_upgraded",
      "lambda_risk": "0.0",
      "periods": "22",
      "annual_return": "0.49220493153624845",
      "annual_benchmark_return": "0.3317320703977973",
      "annual_excess_return": "0.12429638346116767",
      "max_drawdown": "-0.10339178227086843",
      "sharpe": "1.9080841360807779",
      "information_ratio": "2.556229232183461",
      "avg_turnover": "0.7143568391034354"
    },
    {
      "strategy": "EXP0004_upgraded",
      "lambda_risk": "0.25",
      "periods": "22",
      "annual_return": "0.3593349538938826",
      "annual_benchmark_return": "0.3317320703977973",
      "annual_excess_return": "0.018902264153712656",
      "max_drawdown": "-0.10900709234582395",
      "sharpe": "1.5841155700099914",
      "information_ratio": "0.5481505153984505",
      "avg_turnover": "0.6447069769035536"
    },
    {
      "strategy": "EXP0004_upgraded",
      "lambda_risk": "0.5",
      "periods": "22",
      "annual_return": "0.3570440833690087",
      "annual_benchmark_return": "0.3317320703977973",
      "annual_excess_return": "0.017113601496998365",
      "max_drawdown": "-0.1095175598685244",
      "sharpe": "1.5770347157595683",
      "information_ratio": "0.5019648672120249",
      "avg_turnover": "0.6434600903209073"
    },
    {
      "strategy": "EXP0004_upgraded",
      "lambda_risk": "1.0",
      "periods": "22",
      "annual_return": "0.3571935801952044",
      "annual_benchmark_return": "0.3317320703977973",
      "annual_excess_return": "0.017247129285405505",
      "max_drawdown": "-0.10962247509147904",
      "sharpe": "1.577023485608052",
      "information_ratio": "0.505149821884142",
      "avg_turnover": "0.6433782898177476"
    }
  ],
  "monthly_points": 22,
  "nav_points": 254,
  "latest_holdings": {
    "date": "2025-12-01",
    "top_n": 20,
    "count": 1031,
    "holdings": [
      {
        "stkcd": "1330",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2024",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2200",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2217",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2419",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2535",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2547",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2786",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "2800",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "3007",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300061",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300096",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300135",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300159",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300212",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300266",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300279",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300466",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300713",
        "weight": 0.004864416083512101
      },
      {
        "stkcd": "300903",
        "weight": 0.004864416083512101
      }
    ]
  },
  "market_snapshot": {
    "generated_at": "2026-04-02T09:13:19+08:00",
    "provider": "akshare",
    "fallback_used": false,
    "errors": [
      "spot_em_failed: HTTPSConnectionPool(host='82.push2.eastmoney.com', port=443): Max retries exceeded with url: /api/qt/clist/get?pn=1&pz=100&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f12&fs=m%3A0+t%3A6%2Cm%3A0+t%3A80%2Cm%3A1+t%3A2%2Cm%3A1+t%3A23%2Cm%3A0+t%3A81+s%3A2048&fields=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6%2Cf7%2Cf8%2Cf9%2Cf10%2Cf12%2Cf13%2Cf14%2Cf15%2Cf16%2Cf17%2Cf18%2Cf20%2Cf21%2Cf23%2Cf24%2Cf25%2Cf22%2Cf11%2Cf62%2Cf128%2Cf136%2Cf115%2Cf152 (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))",
      "001330: HTTPSConnectionPool(host='push2his.eastmoney.com', port=443): Max retries exceeded with url: /api/qt/stock/kline/get?fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf116&ut=7eea3edcaed734bea9cbfc24409ed989&klt=101&fqt=1&secid=0.001330&beg=20260214&end=20260331 (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))",
      "300279: HTTPSConnectionPool(host='push2his.eastmoney.com', port=443): Max retries exceeded with url: /api/qt/stock/kline/get?fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf116&ut=7eea3edcaed734bea9cbfc24409ed989&klt=101&fqt=1&secid=0.300279&beg=20260214&end=20260331 (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))",
      "300713: HTTPSConnectionPool(host='push2his.eastmoney.com', port=443): Max retries exceeded with url: /api/qt/stock/kline/get?fields1=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf116&ut=7eea3edcaed734bea9cbfc24409ed989&klt=101&fqt=1&secid=0.300713&beg=20260214&end=20260331 (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))"
    ],
    "count": 18,
    "benchmark": {
      "symbol": "000001",
      "name": "上证指数",
      "last": 11.08,
      "pct_chg": 0.82,
      "trade_date": "2026-03-31",
      "source": "akshare"
    },
    "rows": [
      {
        "symbol": "002024",
        "name": "002024",
        "last": 1.43,
        "prev_close": null,
        "pct_chg": -2.72,
        "open": 1.41,
        "high": 1.45,
        "low": 1.4,
        "volume": 866740.0,
        "amount": 123142810.31,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "002200",
        "name": "002200",
        "last": 7.27,
        "prev_close": null,
        "pct_chg": -2.28,
        "open": 7.47,
        "high": 7.53,
        "low": 7.22,
        "volume": 26428.0,
        "amount": 19390569.16,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "002217",
        "name": "002217",
        "last": 2.36,
        "prev_close": null,
        "pct_chg": -2.07,
        "open": 2.4,
        "high": 2.43,
        "low": 2.36,
        "volume": 1287527.0,
        "amount": 308333042.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "002419",
        "name": "002419",
        "last": 5.72,
        "prev_close": null,
        "pct_chg": -0.52,
        "open": 5.75,
        "high": 5.8,
        "low": 5.7,
        "volume": 203260.0,
        "amount": 116895887.19,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "002535",
        "name": "002535",
        "last": 3.69,
        "prev_close": null,
        "pct_chg": 1.37,
        "open": 3.64,
        "high": 3.82,
        "low": 3.63,
        "volume": 203799.0,
        "amount": 75868265.51,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "002547",
        "name": "002547",
        "last": 3.35,
        "prev_close": null,
        "pct_chg": -1.76,
        "open": 3.41,
        "high": 3.45,
        "low": 3.35,
        "volume": 175005.0,
        "amount": 59464368.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "002786",
        "name": "002786",
        "last": 7.47,
        "prev_close": null,
        "pct_chg": -1.06,
        "open": 7.55,
        "high": 7.63,
        "low": 7.45,
        "volume": 43011.0,
        "amount": 32369998.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "002800",
        "name": "002800",
        "last": 22.91,
        "prev_close": null,
        "pct_chg": 9.99,
        "open": 21.23,
        "high": 22.91,
        "low": 21.14,
        "volume": 106074.0,
        "amount": 238065680.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "003007",
        "name": "003007",
        "last": 40.63,
        "prev_close": null,
        "pct_chg": -2.38,
        "open": 41.79,
        "high": 42.24,
        "low": 40.61,
        "volume": 16608.0,
        "amount": 68626601.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300061",
        "name": "300061",
        "last": 8.1,
        "prev_close": null,
        "pct_chg": -2.41,
        "open": 8.27,
        "high": 8.39,
        "low": 8.09,
        "volume": 90642.0,
        "amount": 74411508.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300096",
        "name": "300096",
        "last": 7.87,
        "prev_close": null,
        "pct_chg": 0.38,
        "open": 7.87,
        "high": 8.04,
        "low": 7.84,
        "volume": 33966.0,
        "amount": 26947203.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300135",
        "name": "300135",
        "last": 3.87,
        "prev_close": null,
        "pct_chg": -3.01,
        "open": 3.98,
        "high": 4.01,
        "low": 3.87,
        "volume": 262147.0,
        "amount": 103039821.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300159",
        "name": "300159",
        "last": 3.09,
        "prev_close": null,
        "pct_chg": -0.32,
        "open": 3.12,
        "high": 3.15,
        "low": 3.07,
        "volume": 174123.0,
        "amount": 54065028.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300212",
        "name": "300212",
        "last": 11.43,
        "prev_close": null,
        "pct_chg": -5.22,
        "open": 11.84,
        "high": 12.27,
        "low": 11.37,
        "volume": 396577.0,
        "amount": 465745480.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300266",
        "name": "300266",
        "last": 2.61,
        "prev_close": null,
        "pct_chg": -3.69,
        "open": 2.71,
        "high": 2.72,
        "low": 2.59,
        "volume": 275650.0,
        "amount": 73059137.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300466",
        "name": "300466",
        "last": 8.5,
        "prev_close": null,
        "pct_chg": -1.62,
        "open": 8.64,
        "high": 8.75,
        "low": 8.46,
        "volume": 46688.0,
        "amount": 40212582.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "300903",
        "name": "300903",
        "last": 31.97,
        "prev_close": null,
        "pct_chg": -2.41,
        "open": 32.9,
        "high": 33.77,
        "low": 31.88,
        "volume": 167555.0,
        "amount": 545419038.0,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      },
      {
        "symbol": "000001",
        "name": "000001",
        "last": 11.08,
        "prev_close": null,
        "pct_chg": 0.82,
        "open": 11.0,
        "high": 11.18,
        "low": 10.99,
        "volume": 1164565.0,
        "amount": 1294675716.15,
        "trade_date": "2026-03-31",
        "source": "akshare_hist_fallback"
      }
    ]
  },
  "latest_trade_rebalance": [
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "603826",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "17.76",
      "trade_volume": "5441800.0",
      "trade_amount": "96455996.6",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "273.8973019995552"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "300903",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "20.28",
      "trade_volume": "40478149.0",
      "trade_amount": "796448222.37",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "239.8627260114448"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "605218",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "19.89",
      "trade_volume": "1943600.0",
      "trade_amount": "38578531.0",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "244.56591671755157"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "301121",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "45.36",
      "trade_volume": "4811096.0",
      "trade_amount": "216141545.0",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "107.24021348130735"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "002024",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "1.71",
      "trade_volume": "20904401.0",
      "trade_amount": "35787509.71",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "2844.687768135732"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "001330",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "7.11",
      "trade_volume": "110268108.0",
      "trade_amount": "804719829.56",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "684.1654125896063"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "300061",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "11.11",
      "trade_volume": "6643270.0",
      "trade_amount": "73617036.9",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "437.84123163925307"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "301299",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "56.99",
      "trade_volume": "763500.0",
      "trade_amount": "43341233.0",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "85.35560771209161"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "301012",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "25.48",
      "trade_volume": "7550421.0",
      "trade_amount": "192853896.61",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "190.91114927441527"
    },
    {
      "rebalance_date": "2025-12-01",
      "action": "BUY",
      "stkcd": "603970",
      "weight_change": "0.004864416083512101",
      "new_weight": "0.004864416083512101",
      "old_weight": "0.0",
      "close_price": "13.11",
      "trade_volume": "2385025.0",
      "trade_amount": "31351717.0",
      "ref_trade_notional": "4864.416083512101",
      "ref_trade_shares": "371.0462306263998"
    }
  ],
  "trade_ledger_rows": 35181,
  "automation": {
    "pages_url": "https://lzq1206.github.io/QuantWhisper/",
    "repo_url": "https://github.com/lzq1206/QuantWhisper",
    "mode": "static snapshot + scheduled rebuild hook"
  },
  "notes": [
    "GitHub Pages dashboard for the EXP-0004 virtual portfolio.",
    "Data are copied from project/reports/EXP-0004.",
    "If QUANTWHISPER_SOURCE_DIR is set locally, sync_source_snapshot.py can refresh the snapshot before build.",
    "Latest行情会优先从 AkShare 抓取，失败时自动降级到 Baostock。"
  ]
}