购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 SciPy的初步使用

SciPy包含致力于解决在科学计算中的常见问题的各个工具箱,它的不同子模块对应不同的应用,例如插值、积分、优化、图像处理和特殊函数等。

SciPy可以与其他标准科学计算程序库如 GSL(GNU C 或 C++科学计算库)或者MATLAB工具箱进行比较,是Python中科学计算程序的核心包,用于有效地计算NumPy矩阵,以便于NumPy和SciPy协同工作。

由于SciPy涉及的领域众多,所以本章只选择部分与金融量化分析相关的子库进行介绍,并结合实例进行讲解。

3.3.1 回归分析

回归分析(Regression Analysis)是确定两种或两种以上变量之间相互依赖的定量关系的一种统计分析方法,运用十分广泛。回归分析按照涉及的变量的多少,可分为一元回归分析和多元回归分析;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。

回归分析在金融领域的应用十分广泛,比如在 CAPM 模型中 beta 系数的计算,本质上就是一元线性回归,我们先从这个简单的例子入手。

按照惯例,这里先引入NumPy、Pandas及Matplotlib库,并更改Matplotlib库的字体以便其正常显示中文:

首先,获取近两年来沪深300指数及其最大成分股中国平安的每日涨跌幅数据:

其效果如图3-5所示。

图3-5

可以发现,中国平安与沪深300的相关性还是比较大的。

接下来要用到StatsModels模块。该模块曾经是scipy.stats下的子模块,后被重写并成为现在独立的StatsModels模块,在此利用其强大的OLS(Ordinary Least Square)功能进行回归分析。

首先,引入该模块:

接着,对二者的收益率进行线性回归,斜率即beta系数:

为了让结果更加直观,我们将源数据及拟合直线可视化,如图3-6所示。

图3-6

同样,归因分析对于投资组合管理十分重要。某一组合的收益与损失可以被分解为多个表示投资组合权重的因子。我们认为一个虚拟投资组合是由两个随机因子和事先分配的权重构成的,这一分析过程类似于多元线性回归:

In [116]:import numpy.random as npr

接下来分别构造三个随机因子,并对投资组合添加噪声,再对其进行多元线性回归。与一元线性回归类似,二者仅仅在基函数的数量上有所不同:

可以看到,由于对投资组合添加了一定的噪声,所以导致计算出的因子权重与原先设置的因子权重相比有了微小的偏差。

3.3.2 插值

插值是在离散数据的基础上补插连续函数,使这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,可根据函数在有限个点处的取值状况,估算出函数在其他点处的近似值。

同样,大部分金融数据都是离散数据,所以插值在金融领域的应用极其广泛,我们先从一个实例入手。

首先,读取近一个月的沪深300指数数据:

接下来,导入scipy.interpolate子库对数据进行样条插值:

分别对源数据进行线性及三次样条插值,使用的函数为splrep和splev,在表3-3中列出了splrep函数的主要参数及其描述,在表3-4中列出了splev函数的主要参数及其描述。

表3-3

表3-4

代码如下:

然后,对源数据及插值点进行可视化,效果如图3-7所示。

图3-7

由于源数据本身就是以天为单位的离散数据点,所以在使用线性插值时,插值点与Matplotlib贴合。在使用三次样条插值时,插值点形成的曲线更为平滑、连续。

3.3.3 正态性检验

在 3.1.5 节中,我们提到许多金融模型都依赖于正态分布,这是金融理论的主要统计学基础之一。然而股票市场的收益是否真的符合正态分布?接下来我们利用A股数据检验一下。

首先,获取“平安银行”“万科A”“格力电器”“华东医药”“东方雨虹”“宇通客车”及“海螺水泥”从2011年至2014年每日的前复权收盘价格(这里的股票是随机选择的,不代表投资建议),代码如下:

我们将各股在起始日期的证券价格归一化,可视化价格如图3-8所示。

图3-8

再分别计算各股的对数收益率:

利用pandas.hist将数据可视化:

In [129]:log_returns.hist(bins=50,figsize=(10,6),layout=(2,3))

可以发现,至少从数据分布情况上来看,各股的对数收益率并不太符合正态分布,如图3-9所示。

图3-9

接下来我们通过分位数-分位数(qq)图来进一步判断各股的对数收益率是否符合正态分布。statsmodel.api中的qqplot可以帮助我们完成这一工作,效果如图3-10所示。

图3-10

通过观察图 3-10 可以发现,样本分位数并不在一条直线上,这表明各股的对数收益率并不符合正态分布。在两侧分别有许多值远低于或远高于直线,这就是“肥尾效应”。

3.3.4 凸优化

“凸优化”是一种比较特殊的优化,指求取最小值的目标函数为凸函数的一类优化问题。在各行各业中都充斥着凸优化问题,其中以金融领域尤为明显,比如,利用市场数据校准齐全定价模型、效用函数优化、投资组合优化等。为了更加切合本书的主题,本节直接运用投资组合优化作为例子进行展示。

马柯维茨投资组合理论是美国经济学家 Markowitz(1952)在其发表的论文《资产组合的选择》中提出的,它标志着现代投资组合理论研究的开始。Markowitz利用均值-方差模型分析得出通过投资组合可以有效降低风险的结论。这一理论的基本原理已经被写进诸多教材中,在此不作重复阐述,感兴趣的读者可以查阅相关资料。

首先,使用蒙特卡罗模拟生成一定数量的随机投资组合权重向量,并计算其相应的预期投资组合收益及方差:

接下来,对结果进行可视化,并将无风险短期利率定义为0,以便计算夏普率。

效果如图3-11所示。

图3-11

投资组合的优化关键在于对组合中各标的权重的优化,优化目标大致有以下三类。

(1)夏普最大化。

(2)收益最大化。

(3)风险最小化。

最优化投资组合的推导是一个约束最优化问题。我们可以使用 scipy.optimize 子库中的minmize函数求解这一问题。

首先,导入该模块:

In [133]:import scipy.optimize as sco

然后,建立一个函数将收益率、波动率、夏普率封装起来:

接着,建立一个目标函数:

并将所有参数(权重)的总和约束为1,将参数的权重限制在0~1:

最后,调用minmize函数进行最优化求解:

可以发现,在夏普率最大的投资组合中仅包括格力电器、华东医药及宇通客车。

此时该组合的统计数字为:

即预期收益率为 16.2%,预期波动率为 23.7%,最优夏普率为 0.68。以此类推,我们还可以得到风险(波动率)最小化投资组合:

还可以得到收益最大化组合:

接下来构建有效边界,即计算在给定收益的情况下风险最小的投资组合权重。与之前的三个最优化求解过程相比,这一步仅仅在约束条件上有所变化,需要确保预期收益率等于给定的收益率:

将这一结果可视化,叉号组成的曲线表示在给定的收益率下的最优投资组合,星号分别为最大夏普率、最小波动率及最大收益率组合,效果如图3-12所示。

图3-12 bvIRxfiJJo0Rri8ba3l1h5rTImBwsDYVp+pTdBmeBaJp+0ebhcE8h/mG3hkM970e

点击中间区域
呼出菜单
上一章
目录
下一章
×