1. SciPy是一款方便、易于使用、专为科学和工程设计的Python工具包。2. 它包括统计,优化,整合,线性代数,傅里叶变换,信号和图像处理,常微分方程求解器等等模块。3. SciPy库为很多问题提供了便捷且高效的数值路径解法。
要说明的是,在导入SciPy模块时,一般针对想实现的功能导入相应的子模块即可,不需要导入完整的SciPy模块。
在本章中通过例子的形式来讲解某几个子模块下(表格中加粗显示),需要说明的是这里注重的是模块的应用,具体的算法或者原理只做简单陈述
子模块 | 功能 | 子模块 | 功能 |
---|---|---|---|
cluster | 聚类算法 | **optimize | 优化和求根** |
constants | 物理数学常数 | signal | 信号处理 |
fftpack | 快速傅里叶变换 | sparse | 稀疏矩阵 |
integrate | 积分和常微分方程求解 | spatial | 空间数据结构和算法 |
interpolate | 插值处理 | special | 特殊方程 |
io | 输入输出 | stats | 统计分布和函数 |
linalg | 线性代数 | weave | C/C++积分 |
odr | 正交距离回归 |
利用scipy模块下的integrate子模块可以进行积分求解,和微分方程的求解。
quad函数求积分,会输出积分值,和最大误差。注意quad函数一次只能求解一重积分。$$\int_{a}^{b}dF(x) = ?$$$$\int_{a}^{b}dF(x) = lim\sum_{i=1}^{n}f(x_i) \Delta x_i$$
$$\frac{dy}{dx}=sin(x)$$
曲线拟合实际上是一个最优化某目标函数的问题
人为构造数据集,真实函数如下图红线所示,蓝色点表示的是样本点
假设我们已经知道了函数的形式为$y = ae^{-bsin(fx+\phi)}$,只需要估计函数中的参数
基于样本数据,利用最小二乘的方法来估计函数中的参数
例如我们有四种资产,利用这四种资产构建投资组合,根据马克维茨的现代投资组合理论可以求解有效边界。求解有效边界的过程实际上就是一个求解最优化问题的过程。
为了更好突显有效边界,这里随机构造4000个投资组合
利用马克维茨的MPT——在组合目标收益率情况下,最小化组合方差,求解有效边界。具体而言就是在不同的期望回报率约束下,求解下面的数学优化问题
$$Min 投资组合方差=\sum_{i=1}^{n}\sum_{j=1}^{n}w_iw_j\sigma_{ij}$$
$$s.t. \sum_{i=1}^{n}w_iE(r_i) = 期望回报率, \sum_{i=1}^{n}w_i = 1$$
可视化有效边界,可看到随机构造的投资组合都越不过有效边界
scipy的统计模块下,包含了很多种连续概率分布函数。对于这些连续概率分布函数,通常会用四种操作:
通过之前的integrate模块的积分功能可以帮助求解概率——概率密度函数的积分
对数正态分布
卡方分布
F分布
t分布
离散均匀分布
二项分布
泊松分布
检验一组样本是否可认为服从正态分布。例如我们想检验下面的x_for_test这个样本是否可认为来自正态分布的总体。
KS检验,从峰度和偏度出发,进行的检验。该检验不光能检验某数据集服从正态,也可以检验该数据集是否服从其他的分布。
用法:kstest(待检验数据集, 何种类型分布的检验, args=(), N=20, alternative=’two_sided’(设置双尾,单尾检验等), mode=’approx’, **kwds)
具体的可以参考:https://docs.scipy.org/doc/scipy-0.7.x/reference/generated/scipy.stats.kstest.html
经过KS检验发现p值很小,则拒绝原假设,即有充足理由认为该样本不是来自于正态总体的
Shapiro检验,专门用来做正态性检验的模块。需注意的是,在样本数很大的情况下,该检验不适合做正态性检验,检验结果可能不准确。
具体可以参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.shapiro.html
经过Shapiro检验,发现p值较大,可以认为数据是来自于一个正态分布总体的
检验两个独立的样本对应总体的均值是否存在显著的差异
随机产生20个4维点,disMat为各个点之间的距离矩阵
基于距离矩阵disMat进行层次聚类
从上图可以看到聚类的结果,例如我们考虑阈值为3,可以做一条y=3的水平线来辅助判断,可以看到图中9单独成一个类,17--11之间的点可形成一个类,剩余点也形成了一个类
一般地通过多项式插值来进行插值,调用scipy.interpolate中的interp1d模块可以实现。通过kind参数可以调节插值的方法:
例如,相对下面的10$*$10的矩阵进行插值处理,扩张成一个100$*$100的矩阵,使得整个曲面更加光滑一些。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
1 | -3.703201 | -0.400318 | 1.580455 | 0.798721 | 6.071079 | 8.672773 | 6.820533 | -0.707631 | 6.012882 | 0.380787 |
2 | -1.145648 | -3.759621 | 8.016974 | 4.090643 | 4.443695 | 0.446498 | 0.428496 | 3.707856 | -17.316609 | 14.633428 |
3 | -3.908394 | -0.814071 | 1.315033 | 1.449469 | -2.333758 | 4.574864 | 3.629699 | -10.753554 | -5.935987 | -12.333878 |
4 | -0.255300 | -6.557950 | -1.594488 | -8.838964 | 5.145881 | -0.901672 | -5.951584 | 6.990636 | 11.796797 | -7.305400 |
5 | -9.913660 | -12.400839 | -6.915492 | 9.365875 | -7.743060 | -2.503458 | 3.416506 | -6.089799 | 10.711856 | 18.799075 |
6 | 3.159555 | -8.347973 | -12.767721 | 0.614833 | 1.529912 | -13.542717 | 1.809428 | 10.177388 | 7.766459 | -6.101687 |
7 | -8.817611 | -0.471369 | -3.194466 | 4.864112 | 0.914487 | 7.942217 | -0.296812 | -1.506718 | -1.920830 | 4.727719 |
8 | -15.056821 | -1.742246 | -5.434945 | 18.394791 | 0.529686 | -10.661008 | -7.973814 | -0.112875 | 4.902229 | -2.354906 |
9 | -14.678328 | -6.707785 | 5.278384 | -7.699973 | 20.646028 | -9.825168 | -12.836315 | -6.445505 | -1.626839 | -1.211078 |
10 | 36.102272 | 8.547623 | -3.156888 | -3.282717 | 8.829625 | -15.125651 | -15.816051 | -2.890754 | -5.458071 | -17.222252 |
有些插值方法基于径向基函数,径向基函数的含义是点x处的函数值只依赖于x与某点c的距离。
常用的径向基函数(RBF)有Gaussian函数,Multiquadric函数和Inverse Multiquadric函数。
原数据为三维空间上的一些散点,通过RBF插值可以形成一个光滑的曲面
例如对下面的x_series序列,希望提取其中的趋势项,并查看趋势项的形态
对序列x_series做剔除趋势项处理,并将趋势项提取计算出来,查看趋势项的形态
傅里叶分析实际上是在频域考虑时域的问题,例如这里的将剔除某曲线(序列)中一些特定的频率成分,提取剩余部分成为滤波,再将频域中的滤波转化为时域当中显示的过程。
关于傅里叶分析可以参考:http://blog.jobbole.com/70549/
那么对于投资领域中股票的K线图,实际上是时域下的一条曲线,通过傅里叶分析将其转化到频域,再做频域下的处理,之后返回到时域上,可能会有出乎意料的效果。因为很多在时域上不好处理的操作,在频域上很容易实现。
利用傅里叶变换得到信号频谱,注意对象是剔除趋势项后的序列after_trend不是原序列
联系客服