马尔可夫链是一个至少有两个状态的系统。有关马尔可夫链的详细信息,请参阅 http://en.wikipedia.org/wiki/Markov_chain。
t 时的状态取决于 t-1 时的状态,而且只取决于 t-1 时的状态。系统在这些状态之间随机切换。链对状态没有任何记忆。
马尔可夫链经常被用来模拟物理、化学、金融和计算机科学中的现象。例如,谷歌的 PageRank 算法使用马尔可夫链对网页进行排名。
我想为一只股票定义马尔可夫链。假设我们有持平、上涨和下跌三种状态。我们可以根据当日收盘价确定稳定状态。在遥远的未来,或者从理论上说,在无限长的时间之后,我们马尔科夫链系统的状态将不再发生变化。
这就是稳定状态(见 http://en.wikipedia.org/wiki/Steady_state )。动态平衡是稳态的一种。对于一只股票来说,达到稳定状态可能意味着相关公司已经趋于稳定。
随机矩阵(见 http://en.wikipedia.org/wiki/Stochastic 矩阵)A 包含状态转换概率,应用于稳定状态时,会产生相同的状态 x。
其数学符号如下:

另一种方法是将其视为特征值的特征向量(见 http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors ) 。
操作步骤有八个,让我们来看看是如何完成的。
现在,我们需要获取数据:
首先, 我们先获取一年的数据。其中一种方法是使用 matplotlib。
我们将获取去年的数据。代码如下

第二步 选择收盘价。
我们现在有了雅虎财经的历史数据。数据以元组列表的形式表示,但我们只对收盘价感兴趣。元组中的第一个元素表示日期。随后是开盘价、最高价、最低价和收盘价。最后一个元素是成交量。我们可以如下选择收盘价:

收盘价是每个元组中的第五个数字。现在我们应该有一个包含约 253 个收盘价的列表。
第三, 确定状态。
我们可以用 ( diff ) NumPy 方法减去连续几天的价格来确定状态。然后,状态由差值的符号给出。( sign ) NumPy 方法对负数返回-1,对正数返回 1,否则返回 0:

第四步 将随机矩阵初始化为 0 值。
每次转换都有三种可能的起始状态和三种可能的结束状态。例如,如果我们从一个向上的状态开始,我们可以切换到
● Up ● Flat ● Down
使用(zeros )NumPy 方法初始化随机矩阵:

第五步 为每个符号选择相应的起始状态指数。现在代码变得有点乱。我们必须使用实际循环!我们将循环遍历可能的符号,并选择与每个符号相对应的起始状态索引。使用 ( where ) NumPy 方法选择指数。这里,k 是平滑常数,我们稍后会讨论:
第六步 平滑和随机矩阵。现在我们可以计算每个过渡的出现次数。将其除以给定起始状态下的过渡总数,就得到了随机矩阵的过渡概率。顺便说一句,这并不是最好的方法,因为它可能会过度拟合。在现实生活中,我们可能会遇到收盘价没有变化的一天,尽管这对于流动性较强的股票市场来说不太可能。
处理零发生率的一种方法是应用加法平滑法 (http://en.wikipedia.org/wiki/Additive_smoothing)。
其原理是在我们发现的出现次数上加上某个常数,从而去除零。以下代码计算随机矩阵的值:

上述代码的作用是根据出现次数和加法平滑计算每种可能过渡的过渡概率。在其中一次测试运行中
第七步特征值和特征向量。要获取特征值和特征向量,我们需要使用 ( linalg ) NumPy 模块和 ( eig ) 方法:

方法 ( eig ) 返回一个包含特征值的数组和另一个包含特征向量的数组。
第八步 选择特征值 1 的特征向量。目前,我们只对特征值 1 的特征向量感兴趣。实际上,特征值可能并不完全是 1,因此我们应该留出一定的误差范围。我们可以找到介于 0.9 和 1.1 之间的特征值索引,如下所示:

你现在需要知道发生了什么?
我们得到的特征向量值没有归一化。因为我们处理的是概率,所以它们的总和应该是 1。它们的描述如下
| 方法名称 | 方法描述 |
|---|---|
diff() |
计算离散差分。默认为一阶(见 http://docs.scipy.org/doc/numpy/reference/generated/numpy.diff.html)。 |
sign() |
返回数组元素的符号(参见 http://docs.scipy.org/doc/numpy/reference/generated/numpy.sign.html) |
eig() |
返回数组的特征值和特征向量(参见 http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html) |