有没有可能通过机器学习预测股价走势?
如果给定一组股价数据集我们是不是有可能预测出未来的股价走势?从机器学习的角度来说,预测股价走势就是一个数据科学问题,但从有效市场理论来说,股票市场因为受众多因素影响是随机的和不可预测的。
在本文中我们将尝试使用三种不同的模型来预测苹果公司的股价,并且我们会把这三种模型的结果绘制在一张图上以进行比较。因此,本文主要将分为如下四部分:
安装依赖项
收集数据
编写模型脚本
可视化分析
下面是本实现所需要的四个依赖项:
pip install csv
pip install numpy
pip install scikit-learn
pip install matplotlib
其中,CSV 允许我们从股价 CSV 格式的文件中读取数据,Numpy 允许我们在数据集上执行计算,而 sikit-learn 允许我们构建预测模型,当然最后我们还需要使用 matplotlib 绘制数据点和模型曲线,因此我们才能进行可视化分析。
下面,首先需要从 Google Finance 下载数据集,我们可以在如下搜索框键入「NASDAQ:AAPL」,在点击左侧的历史数据后选择下载。
下面我们需要写模型,首先我们要导入函数库,小编使用的是 Jupyter notebook,上面四个包是 Anaconda 预安装的,所以直接导入并没有报错。
import csv
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
下面则是定义变量和读取数据的函数 get_data():
dates = []
prices = []
def get_data(filename):
with open(filename, 'r') as csvfile:
csvFileReader = csv.reader(csvfile)
next(csvFileReader)
for row in csvFileReader:
dates.append(int(row[0].split('-')[0]))
prices.append(float(row[1]))
return
在上面的代码中,我们首先需要初始化两个空列表,即 dates 和 prices。下面我们需要构建 get_data() 以读取股票数据并存入变量中,其中 filename 就是我们所下载的数据集名称。在这个函数中,我们需要打开 CSV 格式的文件,读取并储存在 CSV 文件变量中。Open() 函数代表抽取文件内容,其中'r'代表读取操作。如上所示,我们在使用 csv.reader() 读取 csv 文件变量后将其赋予 csvFileReader 变量。并且随后采用一个循环语句对于 csv 文件的每一行,将日期和价格分别添加到我们前面所定义的变量中,python 中的 append 方法会在列表尾部添加一个新元素。而 Python 中的 split() 方法通过指定分隔符对字符串进行切片,在本文的语句中 row[0].split('-')[0] 代表 csv 文件每行的第一元素以'-'为标准进行分割,并且只取分割后的第一个元素,也就是每个月的哪一天。
def predict_prices(dates, prices, x):
dates = np.reshape(dates, (len(dates), 1))
svr_lin = SVR(kernel= 'linear', C=1e3)
svr_poly = SVR(kernel= 'poly', C=1e3, degree= 2)
svr_rbf = SVR(kernel= 'rbf', C=1e3, gamma=0.1)
svr_lin.fit(dates, prices)
svr_poly.fit(dates, prices)
svr_rbf.fit(dates, prices)
如上所示的代码,下面我们需要构建预测模型。首先需要使用 Numpy 将列表元素转换为 n*1 的矩阵,其中 reshape 函数的三个参数分别代表所要重塑的列表元素、长度为列表元素的个数、并且为 1*n 维矩阵,n 的值等于我们数据量的大小。下面我们创建出三种支持向量机模型。
支持向量机是一种强大的分类模型,它试图在保留最大间隔的条件下寻找决策边界并将数据分割出来,然后模型根据决策边界对新数据进行预测。SVM 同样可以用于回归任务,支持向量回归同样也是一种 SVM 模型,它将数据点间的间隔作为误差以预测最可能出现的下一个数据点。
plt.scatter(dates,
prices,
color="black",
label="Data")
plt.plot(dates,
svr_rbf.predict(dates),
color="red",
label="RBF Model")
plt.plot(dates,
svr_lin.predict(dates),
color="green",
label='linear Model')
plt.plot(dates,
svr_poly.predict(dates),
color="blue",
label="Ploynomial Model")
plt.xlabel('Dates')
plt.ylabel('Price')
plt.title('Support Vector Reg')
plt.legend()
plt.show()
return svr_rbf.predict(x)[0], svr_lin.predict(x)[0], svr_poly.predict(x)[0]
get_data('aapl.csv')
predicted_prices = predict_prices(dates, prices, 29)
print(predicted_prices)
随后我们可以创建图表,我们可以将初始数据点表示为黑点,不同的模式使用不同颜色的曲线表示。如上所示,我们在使用 plot() 函数时,因为要在一张图上绘制所有的信息,所以我们需要将所有信息绘制完成后在 plot.show() 展示图像。其中 plt.scatter() 表示绘制散点图,而 plt.plot() 表示绘制连线图。在绘制模型曲线时,我们需要调用前面使用 scikit-learn 训练的模型预测器,比如说 svr_lin.fit(dates, prices) 代表使用数据拟合线性支持向量回归,而后面需要调用这一模型进行预测就需要使用 svr_lin.predict(dates),其代表着调用模型对变量 datas 中的数据进行预测。
下面展示了这三个模型所绘制出的可视化图表。