σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academy路线图学习路线
Ctrl K
AO
+1.2k 位学习者
登录加入 ↗
路线图学习路线
AO
+1.2k 位学习者
登录
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academy路线图学习路线
Ctrl K
AO
+1.2k 位学习者
登录加入 ↗
路线图学习路线
AO
+1.2k 位学习者
登录
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
SciPy 学习路线›模块 1 · 拟合与求解›主题 1.6·~50分钟中级

最小二乘与曲线拟合

路线进度模块 1/3 · 主题 6/6
1.6 最小二乘与曲线拟合
—实验得分— / 100总 XP—连续天数—

通过缩小误差来拟合曲线

很多模型是带少数参数的曲线,拟合就是选出使曲线贴近数据的参数。scipy.optimize.least_squares(fun, x0) 做的就是这件事。你写 fun(p),它返回残差向量,每个数据点一个,残差是模型值减去数据值。函数随后最小化代价 12∑ri2\tfrac12\sum r_i^221​∑ri2​。它从你的猜测 x0 出发,借助雅可比矩阵 JJJ(每个参数变化时每个残差如何变化的表)前进。高斯–牛顿的一步解 J⊤J δ=−J⊤rJ^{\top}J\,\delta=-J^{\top}rJ⊤Jδ=−J⊤r,再把参数移动 δ\deltaδ。对参数是线性的模型,一步就能到达答案。bounds=(下界, 上界) 把参数保持在合理范围。curve_fit 是更友好的包装,直接接收模型 f(x,参数)f(x,\text{参数})f(x,参数)。

平方误差会让一个离群点占主导:残差 101010 算作 100100100。稳健损失对大残差增长得更慢。取 loss='soft_l1' 和 f_scale=1,惩罚为 ρ(z)=2(1+z−1)\rho(z)=2(\sqrt{1+z}-1)ρ(z)=2(1+z​−1),其中 zzz 是残差的平方。拟合收益率曲线是经典用法。纳尔逊–西格尔曲线是 y(τ)=β0+β11−e−τ/λτ/λ+β2(1−e−τ/λτ/λ−e−τ/λ)y(\tau)=\beta_0+\beta_1\frac{1-e^{-\tau/\lambda}}{\tau/\lambda}+\beta_2\Big(\frac{1-e^{-\tau/\lambda}}{\tau/\lambda}-e^{-\tau/\lambda}\Big)y(τ)=β0​+β1​τ/λ1−e−τ/λ​+β2​(τ/λ1−e−τ/λ​−e−τ/λ)。它有长期水平 β0\beta_0β0​、斜率 β1\beta_1β1​、驼峰 β2\beta_2β2​ 和以年计的衰减长度 λ\lambdaλ,四个数就能描述整条曲线。拟合之后,噪声水平用 s=SSE/(n−p)s=\sqrt{\mathrm{SSE}/(n-p)}s=SSE/(n−p)​ 估计,其中 nnn 是点数,ppp 是参数个数。

δ=−(J⊤J)−1J⊤r,cost=12∑ri2,ρ(z)=2(1+z−1),s=SSEn−p\delta=-(J^{\top}J)^{-1}J^{\top}r,\qquad \text{cost}=\tfrac12\sum r_i^{2},\qquad \rho(z)=2(\sqrt{1+z}-1),\qquad s=\sqrt{\frac{\mathrm{SSE}}{n-p}}δ=−(J⊤J)−1J⊤r,cost=21​∑ri2​,ρ(z)=2(1+z​−1),s=n−pSSE​​(1)
过原点的直线用 y=a xy=a\,xy=ax 拟合点 (1,2.1)(1,2.1)(1,2.1)、(2,3.9)(2,3.9)(2,3.9)、(3,6.2)(3,6.2)(3,6.2),从 a=1a=1a=1 出发。残差 r=ax−y=(−1.1,−1.9,−3.2)r=ax-y=(-1.1,-1.9,-3.2)r=ax−y=(−1.1,−1.9,−3.2),雅可比 J=x=(1,2,3)J=x=(1,2,3)J=x=(1,2,3)。于是 J⊤r=−14.5J^{\top}r=-14.5J⊤r=−14.5,J⊤J=14J^{\top}J=14J⊤J=14,δ=14.5/14=1.036\delta=14.5/14=1.036δ=14.5/14=1.036,新值 a=2.036a=2.036a=2.036。因为模型对 aaa 是线性的,这就已经是答案了。答案处的残差为 0.0640.0640.064、−0.171-0.171−0.171、0.0930.0930.093,代价为 0.02110.02110.0211。残差 101010 用平方算作 100100100,用 soft_l1 只有 ρ=18.10\rho=18.10ρ=18.10。在真实数据上,用 least_squares 对 2026 年 10 月 9 日十个美债收益率(3 个月到 30 年)拟合纳尔逊–西格尔曲线,水平 5.75%5.75\%5.75%,斜率 −1.52-1.52−1.52(曲线随期限上升),λ=2.7\lambda=2.7λ=2.7 年,与报价收益率平均只差 7.37.37.3 个基点,最差 131313 个基点。用 444 个参数拟合 101010 个点、SSE=0.54\mathrm{SSE}=0.54SSE=0.54,自由度为 n−p=6n-p=6n−p=6,s=0.54/6=0.30s=\sqrt{0.54/6}=0.30s=0.54/6​=0.30。
  • 输入残差,输出参数:fun(p) 返回模型减数据,least_squares 缩小平方和。
  • 用稳健损失对付离群点:soft_l1 防止一个离群点拖偏整条曲线。
  • 四个数描述一条曲线:纳尔逊–西格尔用水平、斜率、驼峰和衰减长度概括收益率曲线。

实验:评分内容

  • 过原点的斜率10 分
  • 高斯–牛顿一步15 分
  • 稳健惩罚15 分
  • 拟合后的噪声水平10 分
  • least_squares 的参数10 分
  • 曲线拟合的流程10 分
  • 为什么用稳健损失30 分
0/ 已答 7 题
任务
1数值作答10 分未作答

对 y=a xy=a\,xy=ax,最优的 aaa 为 ∑xiyi/∑xi2\sum x_iy_i/\sum x_i^{2}∑xi​yi​/∑xi2​。当 x=(1,2,3)x=(1,2,3)x=(1,2,3),y=(2.1,3.9,6.2)y=(2.1,3.9,6.2)y=(2.1,3.9,6.2) 时,aaa 是多少?保留三位小数。

a=a =a=允许误差:± 0.003
2数值作答15 分未作答

从 a=1a=1a=1 出发。残差 r=(−1.1,−1.9,−3.2)r=(-1.1,-1.9,-3.2)r=(−1.1,−1.9,−3.2),J=(1,2,3)J=(1,2,3)J=(1,2,3),J⊤r=−14.5J^{\top}r=-14.5J⊤r=−14.5,J⊤J=14J^{\top}J=14J⊤J=14。步长 δ=−J⊤r/J⊤J\delta=-J^{\top}r/J^{\top}Jδ=−J⊤r/J⊤J 是多少?保留三位小数。

d=d =d=允许误差:± 0.003
3数值作答15 分未作答

残差 101010 的平方为 z=100z=100z=100。取 soft_l1 和 f_scale=1,惩罚为 ρ(z)=2(1+z−1)\rho(z)=2(\sqrt{1+z}-1)ρ(z)=2(1+z​−1)。ρ\rhoρ 是多少?保留两位小数。

rho=rho =rho=允许误差:± 0.05
4数值作答10 分未作答

用 p=4p=4p=4 个参数的曲线拟合 n=10n=10n=10 个点,残差平方和 SSE=0.54\mathrm{SSE}=0.54SSE=0.54。s=SSE/(n−p)s=\sqrt{\mathrm{SSE}/(n-p)}s=SSE/(n−p)​ 是多少?保留两位小数。

s=s =s=允许误差:± 0.005
5配对10 分未作答

把每个参数与它的作用配对。

为左侧每一项选择配对项。

fun
x0
bounds
loss
6排列步骤10 分未作答

把拟合收益率曲线的步骤排好顺序。

拖动以重新排序;也可聚焦某项,按空格抬起,用方向键移动,再按空格放下。

  1. 1查看残差和成功标志
  2. 2带起点和边界调用 least_squares
  3. 3选择模型,这里是纳尔逊–西格尔
  4. 4写一个返回模型减数据的函数
7用文字解释30 分未作答

有一个错误报价远离其他九个收益率。请用一两句话解释:为什么普通最小二乘拟合会被它拉偏,以及 soft_l1 为什么有帮助。

数学模式键盘或 LaTeX 输入第 1/7 题 · Ctrl ⏎ 检查

登录后即可运行你的代码。

所有讲解均可免费阅读。创建账户或登录后,即可运行代码、运行测试并提交此实验。

  • 浏览器内 IDE 与 bash 终端,无需安装
  • 即时评分、XP 以及你在学习路线中的位置
创建账户登录
或
使用 GitHub 继续