淘先锋技术网

首页 1 2 3 4 5 6 7

有没有可能通过机器学习预测股价走势?

如果给定一组股价数据集我们是不是有可能预测出未来的股价走势?从机器学习的角度来说,预测股价走势就是一个数据科学问题,但从有效市场理论来说,股票市场因为受众多因素影响是随机的和不可预测的。

在本文中我们将尝试使用三种不同的模型来预测苹果公司的股价,并且我们会把这三种模型的结果绘制在一张图上以进行比较。因此,本文主要将分为如下四部分:

安装依赖项

收集数据

编写模型脚本

可视化分析

下面是本实现所需要的四个依赖项:

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 中的数据进行预测。

下面展示了这三个模型所绘制出的可视化图表。