线性回归实战:股价预测(未完)


本文内容是对贪心科技课程第二章的笔记

问题描述剖析

我们制定的任务是:根据历史的股价数据,预测出5天之后的股价。有了这个预测值之后,我们就可以设计这样的买卖策略:如果5天之后的预测值大于现在的价格,就买进。当然,实操中用的买卖策略远比这个复杂得多。
首先,股价预测本身可以看作是回归问题,因为被预测的股价可以看作是具体的数值。但如果我们想预测的是未来股价的涨或者跌,那就变成分类问题了。
股价是有一定预测性的,但由于受到的外部因素很多,预测具有极高的挑战性。
在这里插入图片描述

数据预处理

理解股价数据

对于A股来讲,它的交易是T+1的形式,也就是当天购置的股票只能在第二天卖出。这区别于美股,可以在一天之内对已购置的股票再出售,所以这种交易模式可支持高频交易,但对于A股是不可能的。由于A股市场T+1特性,在建模时,我们更多关注的是按每日的股价的波动。
在这里插入图片描述

在这里插入图片描述根据上面两张图我们可以得出,一支股票样本的数据由日期,开盘,最高,最低,收盘,涨跌,成交,换手,振幅等这些特征组成。
我们预测的价格为收盘价。

数据清洗

在这里插入图片描述

对于上面的数据,我们首先希望以时间的维度做一个排序,因为我们的任务是预测未来5天之后的股价。所以,下面按照date字段,把所有的样本以时间的升序做个排序。

df['date'] = pd.to_datetime(df['date'])  # 把字符串转换成时间的格式 
df = df.set_index('date')  # 把date字段作为index 
# 按照时间升序排列,替换原来的数据
df.sort_values(by=['date'], inplace=True, ascending=True) 
df.head(10) 

在这里插入图片描述

构造训练数据

问题本身是回归问题,所以需要预测值。对于这次的任务,我们的目标是通过当日的数据特征去预测5天之后的股价。在数据中,暂时还没有包含这5天之后的股价。但构造的方式很简单,比如对于2016-11-29当天的数据,根据5天的规定,预测值设定为9.49(5天之后的收盘价),对于2016-11-30当天的数据,预测值设定为9.48,以此类推。所以在预测值的构造上,我们只需要把原来数据中的close字段的值往前挪5位就可以了。

num = 5
df['label'] = df['close'].shift(-num)  # 构造预测值,这里的num=5

在这里插入图片描述

处理NA字段

这样一来,我们拥有了数据特征,同时也拥有了对应的预测值。但由于预测值的构造过程中往前挪了5个位置,最后5位数据的标签没有,会出现na值。
在这里插入图片描述所以我们要舍弃na值,去掉这些值。

df,dropna(inplace = True)

在这里插入图片描述

数据归一化

为了解决字段值之间大小的差异,我们通常在训练模型前做归一化的操作。归一化的目的就是把每个字段转换到同等大小的区间来消除字段大小所带来的影响。 归一化通常有两种方法,第一种是 min-max归一化 ,第二种是 z-score归一化 。
特征缩放,线性归一化
在这里插入图片描述
特征缩放,标准差标准化
在这里插入图片描述
进行标准化,减去均值再除以标准差。这里把df所有数据都进行了标准化。只需要对特定几列做就可以了。

df = df.apply(
    lambda x: (x - x.mean()) / (x.std()))

构建模型

直接调用库构建简单的线性模型和均方误差损失函数

import torch
import torch.nn as nn

loss = torch.nn.MSELoss()

def get_net(feature_num):
    net = nn.Linear(feature_num, 1)
    for param in net.parameters():
        nn.init.normal_(param, mean=0, std=0.01)
    return net

训练数据和测试数据

提取特征值和预测值,分别保存为X, y两个变量中。

# 构建特征向量X,也就是数据中的X。由于我们要预测df['label']值,需要先去掉,不然就失去预测意义了。 
# 在本次预测任务中先不考虑"price_change"和"p_change"两个字段。 
X = df.drop(['price_change', 'label', 'p_change'],axis=1)
X = X.values

然后对X进行归一化或标准化

for x in X:
     lambda x: (x - x.mean()) / (x.std())

然后提取预测值y

y = df.label.values
#输出(606, 11) (606,)

把数据分为训练集和测试集

# 把数据分为训练和测试数据。我们把一开始的550个样本作为训练数据
#之后的样本作为测试数据
X_train, y_train = X[0:550, :], y[0:550]
X_test, y_test = X[550:606,:], y[550:606]
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

训练模型

设置相关参数,对模型训练

#学习率
lr = 0.03
#迭代周期个数
num_epochs = 5
#初始化模型
net = get_net(X_train.shape[1])
batch_size = 10

对模型进行评估

lr.score(X_test, y_test) # 使用绝对系数 R^2 评估模型

可视化结果

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值