数据集包含两支股票(GOOGL、AAPL)的历史股价数据,其中特征属性包括:
数据集中的记录数取决于获取的历史数据的时间段,每一行代表一天的数据。
项目中涉及的主要算法是线性回归(Linear Regression)和支持向量机回归(Support Vector Machine Regression,SVM Regression)。
以下是算法原理的简要描述:
线性回归:
支持向量机回归:
决策树
决策树模型是一种用于分类和回归任务的机器学习模型,它模仿了人类在面对决策问题时的思维方式,通过一系列的决策规则来进行预测和分类。决策树模型是一种可解释性强的模型,通常用于以下两种情况:
决策树的构建过程通常分为以下几个步骤:
决策树模型的优点包括易于理解和解释、对缺失值不敏感、能够处理数值和分类特征、适用于大规模数据等。然而,它也容易过拟合训练数据,因此通常需要采用剪枝等技术来改进模型的泛化性能。决策树模型的一种常见变体是随机森林,它通过组合多个决策树来提高性能和稳定性。
模型评价方法:
在项目中,使用了以下模型评价方法来评估模型性能:
import quandl
from sklearn import preprocessing
import math
import numpy as np
from sklearn import model_selection, svm
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from matplotlib import style
import datetime
from sklearn.tree import DecisionTreeRegressor
# Todo: 获取股票数据GOOGL、AAPL
# df = quandl.get('WIKI/GOOGL')
df = quandl.get('WIKI/AAPL')
# print(df)
# Todo: 定义预测列变量
# todo: 定义预测天数、特征、处理异常值、生成X,y
# 定义预测列变量,存放研究对象的标签名
forecast_col = 'Adj. Close'
# 定义预测天数,这里设置为所有数据量长度的1%
forecast_out = int(math.ceil(0.01 * len(df)))
print("----------定义の预测天数----------")
print(forecast_out)
# 只用到df中的下面几个字段
df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']]
# 构造两个新列
df['HL_PCT'] = (df['Adj. High'] - df['Adj. Close']) / df['Adj. Close'] * 100.0
df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0
# 真正用到的特征
df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]
# 处理空值,这里设置为-99999
df.fillna(-99999, inplace=True)
# label代表预测结果,通过让Adj. Close列的数据往前移动1%行来表示
df['label'] = df[forecast_col].shift(-forecast_out)
# 生成在模型中使用的数据X,y,以及预测时用到的数据X_lately
X = np.array(df.drop(['label'], axis=1))
X = preprocessing.scale(X)
# 上面生成的label列时留下的最后1%行的数据,这些行并没有label 数据,用作预测时用到的输入数据
X_lately = X[-forecast_out:]
X = X[:-forecast_out]
# 抛弃label列中为空的那些行
df.dropna(inplace=True)
y = np.array(df['label'])
print("----------预测股票价格的特征变量X----------")
print(X)
print("----------预测的目标变量y----------")
print(y)
print("----------用于预测的输入数据X_lately----------")
print(X_lately)
# Todo: 线性回归分析
# 先把X,y数据分成两部份,训练和测试
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2)
# 生成线性回归对象
clf = LinearRegression(n_jobs=-1)
# 开始训练
clf.fit(X_train, y_train)
# 进行预测
foreca_set = clf.predict(X_lately)
# 用测试数据评估准确性
accuracy = clf.score(X_test, y_test)
print("----------线性回归-预测---------")
print(foreca_set)
print("---------线性回归-准确性---------")
print(accuracy)
# Todo: 支持向量机回归分析
# 支持向量机回归分析
clf_svm = svm.SVR(kernel='linear')
# 开始训练支持向量机回归模型
clf_svm.fit(X_train, y_train)
# 用测试数据评估支持向量机回归模型准确性
accuracy_svm = clf_svm.score(X_test, y_test)
# 进行支持向量机回归模型的预测
forecast_set_svm = clf_svm.predict(X_lately)
print("----------支持向量机-预测---------")
print(forecast_set_svm)
print("---------支持向量机-准确性---------")
print(accuracy_svm)
# 决策树回归模型
clf_tree = DecisionTreeRegressor()
clf_tree.fit(X_train, y_train)
accuracy_tree = clf_tree.score(X_test, y_test)
forecast_set_tree = clf_tree.predict(X_lately)
print("----------决策树-预测---------")
print(forecast_set_tree)
print("---------决策树-准确性---------")
print(accuracy_tree)
# Todo: 可视化展示
# 修改matplotlib样式
style.use('ggplot')
one_day = 86400
# 在df中新建Forecast列,用于存放预测结果的数据
df['Forecast'] = np.nan
# 取df最后一行的时间索引
last_date = df.iloc[-1].name
last_unix = last_date.timestamp()
next_unix = last_unix + one_day
# 遍历预测结果,用它向df中追加行
for i in foreca_set:
next_date = datetime.datetime.fromtimestamp(next_unix)
next_unix += one_day
# [np.nan for _ in range(len(df.columns)-1)]生成不包含Forecast字段的列表
# 而[i]是只包含Forecast字段的列表
# 拼在一起组成新行,按日期追加到df下面
df.loc[next_date] = [np.nan for _ in range(len(df.columns) - 1)] + [i]
# 绘图
df['Adj. Close'].plot()
df['Forecast'].plot()
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()
x_train:代表训练数据集的输入特征,即训练图像数据。
x_test:代表测试数据集的输入特征,即测试图像数据。
y_train:代表训练数据集的目标标签,即训练图像对应的类别。
y_test:代表测试数据集的目标标签,即测试图像对应的类别。
项目的主要目标是预测股票价格,并通过模型评价方法来评估预测的准确性。
最终的结果分析包括以下几个方面:
模型准确性:
可视化分析:
时间序列分析:
综合这些分析结果,可以评估模型的预测能力和泛化性能,以确定模型是否适合用于股票价格预测以及在实际交易中的应用潜力。