赞
踩
- #线性回归算法一般用于解决”使用已知样本对未知公式参数的估计“类问题
- #获取数据
- # 股票数据特征:开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)、交易额(Volume)
- # 及调整后的开盘价(Adj. Open)、最高价(Adj. High)、最低价(Adj. Low)、收盘价(Adj. Close)、交易额(Adj. Volume)
- #数据预处理
- #除权后的数据更能反映数据特征,选择调整后的数据为主要使用的数据特征
- #两个数据特征:HL_PCT(股票最高价与最低价变化百分比)、PCT_change(股票收盘价与最低价的变化百分比)
- #自变量为:Adj.Close、HL_PCT、PCT_change、Adj.Volume
- #因变量为:Adj.Close
-
- import quandl
- from sklearn import preprocessing
- df = quandl.get('WIKI/GOOGL')
- # df = quandl.get('WIKI/AAPL')
- # print(df)
-
- import math
- import numpy as np
- #定义预测列变量,存放研究对象的标签名
- forecast_col = 'Adj. Close'
- #定义预测天数,这里设置为所有数据量长度的1%
- forecast_out = int(math.ceil(0.01*len(df)))
- #只用到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'],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'])
-
- from sklearn import model_selection,svm
- from sklearn.linear_model import LinearRegression
- #先把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)
- #用测试数据评估准确性
- accuracy = clf.score(X_test,y_test)
- #进行预测
- foreca_set = clf.predict(X_lately)
- print(foreca_set,accuracy)
-
- import matplotlib.pyplot as plt
- from matplotlib import style
- import datetime
- #修改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()
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。