创业板是一种专门的证券市场,是对主板市场的重要补充. 它可以为创业型企业、高科技企业等企业提供融资,为没有资质在主板上市的企业提供及时的金 融服务. 2009 年 10 月 30 日,中国创业板正式上市. 2010 年 6 月 1 日,为了更全 面地反应创业板市场的整体表现,深圳证券交易所正式编制和发布创业板指数.
本案例使用的是通过 Python 第三方库 Tushare得到的创业板指数数据集, 时间跨度从2014年3月1日到2017年3月1日. 数据集包括8个特征,主要 包括日期时间、开盘、最高、收盘和成交量等特征,共 729 个样本。
在本案例中,我们首先对数据集进行预处理,对特征日期的格式进行转换。然后,使用隐马尔可夫模型分析影响股票市场的隐含变量,寻找最优的隐含状态序列。
首先,我们加载案例所需要的第三方库,并且屏蔽运行代码产生的warning
信息。
import warnings
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.mlab import normpdf
warnings.filterwarnings("ignore")
使用Pandas
的read_csv
函数读入数据,保存在变量stock_data
中。
stock_data = pd.read_csv('./input/stock_index.csv')
stock_data.head()
print u'数据集stock_data的大小为: ', stock_data.shape
然后,我们查看stock_data
各个特征的信息,包括特征的数据类型,以及是否存在缺失值等。
stock_data.info()
从info()
返回的信息来看,数据集stock_data
没有缺失值,特征时间
的数据类型object
,具体来说就是字符串类型。接下来,我们将特征时间
的类型从字符型转换为datetime
类型。
stock_data['date'] = pd.to_datetime(stock_data['date'])
stock_data.head()
stock_data.info()
我们把stock_data
的行索引设置为stock['date']
,这样我们可以根据不同的日期进行数据切片。
stock_data.index = stock_data['date']
stock_data.head()
比如,我们查询2017年2月份之后的数据,这里需要用到Python
的内置日期库datetime
。
import datetime as dt
stock_data[:dt.datetime(2017, 1, 31)]
我们尝试使用折线图,展示stock_data
的开盘stock_data[open]
和收盘stock_data[closes]
plt.figure()
stock_data['open'].plot(color = 'r')
stock_data['close'].plot(color = 'b')
plt.legend(['open price', 'close price'], loc='upper right')
plt.title('Stock Index Trend')
plt.show()
returns = stock_data['p_change']
[n, bins, patches] = plt.hist(returns, 100)
mu = np.mean(returns)
sigma = np.std(returns)
x = normpdf(bins, mu, sigma)
plt.plot(bins, x, color='blue', lw=2)
plt.show()
隐马尔科夫模型是一种简单的贝叶斯网模型,属于有向图模型的一种。
下面,我们考察指数收盘时的变动情况,也就是说相邻两天stock_data['close']
的差值。为了匹配起见,特征date
和volume
的取值也需要向后推一天,即$len(close) = stock\_data['close'].shape[0] - 1$
diff = np.diff(stock_data['close'])
dates = stock_data['date'][1:]
close = stock_data['close'][1:]
volume = stock_data['volume'][1:]
为了方便可视化,我们在这里选取指数的涨跌情况和成交量两个指标进行考察,即输入HMM模型的数据集为X
,大小为(728, 2)
X = np.column_stack([diff, volume])
X.shape
from hmmlearn.hmm import GaussianHMM
# 创建Gaussian MMM模型
model = GaussianHMM(n_components=4, covariance_type="diag", n_iter=1000)
## 使用数据集X训练模型
model.fit(X)
# 预测最优的隐含状态序列
hidden_states = model.predict(X)
模型训练完成后,我们查看响应的参数,比如说转移矩阵,每个隐含状态的分布参数。
print u"转移矩阵为: "
print model.transmat_
print ''
print u"每个隐含状态分布的均值和方差: "
for number in range(model.n_components):
print u"{0}th 隐含状态".format(number)
print u"均值: ", model.means_[number]
print u"方差: ", np.diag(model.covars_[number])
print ''
plt.figure(figsize=(50,10), dpi = 80)
fig, axs = plt.subplots(model.n_components, sharex=True, sharey=True)
colours = cm.rainbow(np.linspace(0, 1, model.n_components))
for i, (ax, colour) in enumerate(zip(axs, colours)):
# Use fancy indexing to plot data in each state.
mask = hidden_states == i
ax.plot_date(dates[mask], close[mask], ".-", c=colour)
ax.set_title(u"{0}th hidden state".format(i))
# Format the ticks.
#ax.xaxis.set_major_locator(YearLocator())
#ax.xaxis.set_minor_locator(MonthLocator())
fig.tight_layout()
ax.grid(True)
plt.show()