在本篇文章中将试图使用高斯混合模型 (GMM) 对股市中的不同市场行情进行聚类分析
介绍
通过过去的十年的发展,普通人越来越容易进入股票市场,每天进出市场的资金量创历史新高。
作为投资者,你可以通过多种方式培养何时买入或卖出的经验和直觉。其中一种最简单的方法是咨询朋友或其他投资者,但他们很快就会用相互矛盾的观点淹没你。
本篇文章将试图用严谨的数学工具而不是生硬的意见解决这个赚钱的黄金问题——我应该什么时候买入或卖出?
我将演示如何使用高斯混合模型来帮助确定资金何时进入或退出市场。
从数学上讲,任何给定时间的市场行情都可以称为“市场状态”。行情通常可以解释为任意数量的概念,例如熊市或牛市;波动大小等等。我们可以根据一些特征将交易日的状态进行聚类,这样会比每个对每个概念单独命名要好的多。
由于市场行情没有明确的定义——因此也没有代表市场的响应变量——所以使用无监督机器学习模型来确认市场状态可能要比监督式模型好很多,这也是本篇文章的理论假设。
有监督与无监督机器学习
这两种方法的区别在于使用的数据集是否有标记:监督学习使用有标注的输入和输出数据,而无监督学习算法没有确定的输出。数据集的标注是响应变量或试图预测的变量包含数值或分类值。因此,当使用监督机器学习算法时,预测变量是明确定义的。一个非常简单但强大的监督学习的例子是线性回归。通过x预测y
高斯混合模型(GMM)
高斯混合模型是p维空间中多个正态分布的重叠。 空间的维度由变量的数量生成。 例如,如果我们有一个变量(标准普尔 500 指数回报),GMM 将基于一维数据进行拟合。 GMM 可用于模拟股票市场以及其他金融应用程序的状态。 股市回报的一个特征是由高波动日产生的重尾。 在分布的尾部捕获高度波动的日子的能力对于在建模过程中捕获信息十分重要。
上图代表了一些具有 4 个集群的多模态数据。 高斯混合模型是一种用于标记数据的聚类模型。
使用 GMM 进行无监督聚类的一个主要好处是包含每个聚类的空间可以呈现椭圆形状。 高斯混合模型不仅考虑均值,还考虑协方差来形成集群
GMM 方法的一个优点是它完全是数据驱动的。 提供给模型的数据就可以进行聚类。 重要的是,每个集群的标签可以是数字,因为数据驱动了潜在的特征,而不是人类的意见。
GMM 的数学解释
高斯混合模型的目标是将数据点分配到n个多正态分布中的一个。 为此,使用期望最大化 (EM) 算法来求解每个多正态分布的参数。
第 1步:随机初始化起始正态分布参数
第 2 步:执行E步(Expectation),根据当前的参数值,计算样本隐藏变量的期望;
第 3 步:执行M步(Maximum),根据当前样本的隐藏变量,求解参数的最大似然估计;
第 4 步:计算(数据给状态的分数,平均值,协方差)的联合概率的对数似然
第 5 步:重复第 2-4 步,直到对数似然收敛
每个数据点属于某个集群的概率如下所示。在索引的基础上,我们得到了每个数据点属于每个独立集群的概率。矩阵的大小将是按集群数量计算的数据点数。因为它是一个概率矩阵,在索引“i”下的值和为1。
索引i代表每个数据点或向量。 索引 c 代表给定的集群; 如果我们有三个集群 © 将是 1 或 2 或 3。
上面是多变量高斯公式,其中 mu 和 sigma 是需要使用 EM 算法进行估计的参数。
另一个关键概念是我们空间中的每个高斯分布都是无界的并且彼此重叠。 根据数据点的位置,从每个分布中为其分配一个概率。 属于任何集群的每个数据点的概率总和为 1。
最后,由于 EM 算法是一个迭代过程,我们需要衡量每一步的进度以了解何时停止。 为此,我们使用模型的对数似然函数来测量参数何时收敛。
GMM 的实现
本节将分为两节,每节代表 GMM 的一个应用。
使用 GMM 将 S&P500 的回报分为三个状态。 数据来自雅虎财经。
import pandas as pd
import numpy as np
from datetime import datetime , timedelta
import yfinance as yf #import data via Yahoo
sp_list = ['SPY']today = datetime.today()# dd/mm/YY
#get last business day
offset = max(1, (today.weekday() + 6) % 7 - 3)
timed = timedelta(offset)
today_business = today - timed
print("d1 =", today_business)
today = today_business.strftime("%Y-%m-%d")symbols_list = sp_list
start = '2000-01-01'
end = todayprint('S&P500 Stock download')
r = yf.download(symbols_list, start,end)df_pivot = r
#replace all nan data with zero
treasury_yeild = df_pivot.Close
在这里我需要确定有多少状态最能代表市场环境,我们将假设三种状态——熊市、震荡、牛市。
我将使用 S&P500 的对数回报来拟合 GMM。
一维数据上 GMM 的 Python 实现非常简单。
from scipy.stats import multivariate_normal
from sklearn.mixture import GaussianMixture
#'10YrYeild':treasury_yeild.Close.values
# 0. Create dataset
sp_list = ['SPY']symbols_list = sp_list
start = '2008-01-01'print('S&P500 Stock download')
r = yf.download(symbols_list, start,end)daily_returns = (r.Close.pct_change()) #Daily log returns Close price for each day - Y observations
daily_returns = daily_returns.iloc[1:]X = daily_returns.valuesGMM = GaussianMixture(n_components=3).fit(X.reshape(-1,1)) # Instantiate and fit the model
使用 sklearn 的高斯混合模型就可以找到我们想得到的状态。
从上面的分析来看,两个状态也可能就可以了
可能出现的一个问题是趋同性。有可能是基于初始条件和EM算法中某个阈值的标准的定义上,也有可能是形成不同的分布。这个还需要进一步的调查。
使用符合 GMM 的宏观经济数据对美国经济进行分类
为了直观演示 GMM,我将使用二维数据(两个变量)。 每个对应的簇都是三个维度的多正态分布。 在这个例子中,第一个维度是通胀值(我们称之为 X),第二个维度是 S&P500 的月回报率(我们称之为 Y),第三个维度是 X&Y 的联合概率。 换句话说,X 和 Y 的某个组合的概率是多少。
from scipy.stats import multivariate_normal
from sklearn.mixture import GaussianMixture
#'10YrYeild':treasury_yeild.Close.values
# 0. Create dataset
gmm_data = pd.DataFrame({'Inflation':inflation.Weight,'Market_return':spy.Close.values})
gmm_data = gmm_data.to_numpy()X = gmm_datax,y = np.meshgrid(np.sort(X[:,0]),np.sort(X[:,1]))
XY = np.array([x.flatten(),y.flatten()]).TGMM = GaussianMixture(n_components=3).fit(X) # Instantiate and fit the model
print('Converged:',GMM.converged_) # Check if the model has converged
该图展示了GMM相对于其他聚类算法的一个主要优点。正态分布可以产生椭圆形状,这个性质来自协方差矩阵。
给定二维数据,GMM 能够产生三种不同的状态。
最后,如果要创建一个有意义的模型,应该考虑更多的变量。 实际上一系列不同的指标构成了美国经济及其表现。我们可以继续并合并任意数量的维度,但是在进入 n 维度之前,了解提供给模型的数据的相关结构很重要。
总结
这是我们如何将 GMM 应用于金融市场和经济的简单介绍。 请记住这只是一个介绍, 引入 GMM 方法是为了提高将股票市场价格数据分类为状态的稳健性,市场条件和经济之间的联系还需要更加深入的研究。
作者:Ethan Johnson-Skinner, MSc