Numpy攻略:确定稳态

马尔可夫链:被用来描述至少有两个状态的系统,指数学中具有马尔可夫性质的离散事件随机过程。该过程中,在给定当前知识或信息的情况下,过去(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的。此类系统t时刻的状态仅取决于t-1时刻的状态。

稳态:在未来某个时刻之后或者从理论上讲经过无限长时间之后,马尔可夫链系统的状态将不再改变,这个状态被称为稳态。

随机矩阵包含了状态之间转移的概率,把随机矩阵A应用于稳态,状态将保持不变,用数学符号表示如下:

Ax=x

具体步骤:
1.获取一年的数据:使用Matplotlib函数
[新的mpl_finance中没有quotes_historical_yahoo,因此需要安装fix_yahoo_finance安装命令:pip install fix_yahoo_finance]
雅虎数据需要通过pandas_datareader获取,
https://blog.csdn.net/huang_susan/article/details/806556282.选取收价盘
3.确定状态数组
用sign函数,当Numpy的sign函数的输入参数为负值,正值和0时,其返回结果分别为-1,1,0
4.初始化随机矩阵:使用zeros函数,对随机矩阵进行初始化
5.选取每一种符号对应的起始索引状态:使用where函数选取索引的起始索引。
6.平滑处理和随机矩阵
加法平滑:在转换次数上加一个常数,从而避免出现概率为0的情况。
7.特征值和特征向量
Numpy中的linalg模块和eig函数:返回一个特征值数组和一个特征向量数组。
完整的代码如下图:

import fix_yahoo_finance as yf
import pandas_datareader as web
from datetime import date
yf.pdr_override()
import numpy
import sys
#sys:负责python与解释器的交互。
#sys.argv():实现程序外部向程序内部传递参数,脚本的名称是sys.argv[0]表示列表的第一列参数
#sys.exit():解释器自动退出
if len(sys.argv)!=3:
    print("Usage Python %s SYMBOL k"%(sys.argv[0]) )
    print("For instance python %s AAPL 1"%(sys.argv[0]))
    sys.exit()
#datetimie:日期时间函数
today=date.today()
start=(today.year-1,today.month,today.day)
quotes=web.get_data_yahoo(sys.argv[1],start,today)
close=[q[4] for q in quotes]
#diff函数:计算离散分差,默认计算一阶分差
#sign函数:返回数组的符号
states=numpy.sign(numpy.diff(close))
NDIM=3
#numpy中的zeros函数:返回给定形状和类型的新数组,用0填充
SM=numpy.zeros((NDIM,NDIM))
signs=[-1,0,1]
k=int(sys.argv[2])
for i in range(len(signs)):
    #从特定符号对应的状态开始转换
    start_indices=numpy.where(states[:-1]==signs[i])[0]
    N=len(start_indices)+k*NDIM
    #跳过总转换次数为0的情况
    if N==0:
        continue
    #获取结束状态的状态值
    end_values=states[start_indices+1]
    for j in range(len(signs)):
        #特定类型转换发生的次数
        occurrence=len(end_values[end_values==signs[j]])
        SM[i][j]=(occurrence+k)/float(N)
print(SM)
#eig:返回数组的特征值的特征向量
eig_out=numpy.linalg.eig(SM)
print(eig_out)
idx_vec=numpy.where(numpy.abs(eig_out[0]-1)<0.1)
print("Index eigenvalue 1",idx_vec)
x=eig_out[1][:idx_vec].flatten()
print("Steady state vector",x)
print("check",numpy.dot(SM))

猜你喜欢

转载自blog.csdn.net/JiangCaifu/article/details/83867463