两件事:找最低点,找曲线穿过零的位置
scipy.optimize 解决两类问题。第一类是最小化函数 f(x),即找输出最小的输入。调用 minimize(f, x0),其中 x0 是你的初始猜测。BFGS 沿着 f 的斜率下坡。Nelder-Mead 不需要斜率,只比较函数值。SLSQP 还支持边界和约束,例如和必须为 1 的权重。结果只是局部最小值,也就是你出发的那个山谷的谷底,换一个 x0 可能得到不同的答案。一定要检查 res.success。
第二类问题是求根:解 g(x)=0。brentq(g, a, b) 需要一个括区间,即两端 g 的符号相反,这样它反复二分区间就一定能找到根。二分 n 次后区间宽度为 (b−a)/2n。newton(g, x0, fprime) 使用 g 的斜率,快得多,但需要好的起点,斜率接近水平时可能跳得很远。在金融中,债券的到期收益率就是一个根:它是使债券价格公式等于市场价格的利率 y。牛顿一步是 y新=y−g(y)/g′(y)。
ynew=y−g′(y)g(y),g(y)=1+y5+(1+y)2105−98,width after n halvings=2nb−a(1) 两年期债券的收益率一张债券一年后付
5,两年后付
105,价格为
98。从
y=6% 出发。价格公式给出
98.17,所以
g=0.17。斜率
g′=−5/1.062−210/1.063=−180.8。牛顿一步得到
y=0.06−0.17/(−180.8)=6.092%,在括区间
[0,0.5] 上用
brentq 确认根为
6.0923%。要让
[0,1] 上的二分法精度达到
0.001,需要
2n≥1000,即
n=10 次二分。再看最小化:两个资产波动率为
20 和
10、相关系数
0.2,协方差为
40,所以第一个资产的最小方差权重为
(100−40)/(400+100−80)=0.143。在真实数据上,SPY 和 TLT 自 2005 年 2 月起
5,404 天的年化波动率为
19.0% 和
14.6%,相关系数
−0.30。SPY 的最小方差权重为
40%,波动率为
9.7%。对有两个山谷的函数,如
x4−3x2+x,
minimize 从
x0=2 停在
1.13,从
x0=−2 停在
−1.30,后者更低。
- 最小化或求根:
minimize 找低点,brentq 和 newton 找函数为零的位置。 - 括区间是保证:符号相反时
brentq 一定收敛,newton 更快但需要好的起点。 - 最小值可能只是局部的:试几个起点,并在相信
res.x 之前先读 res.success。
实验:评分内容
- 牛顿一步15 分
- 二分次数10 分
- 最小方差权重15 分
- 各任务该用的工具15 分
- 隐含波动率的流程10 分
- 可能是局部的最小值10 分
- 为什么要括区间,牛顿法为什么会失败25 分