运用R语言、Tushare对单支股票进行回归分析

本文介绍了如何运用R语言和Tushare数据接口,对顺丰控股股票进行回归分析,包括数据获取与预处理、初步回归模型建立、变量选择、多重共线性诊断以及模型效果评估。在变量选择中,通过最优子集、逐步回归确定了关键变量,并通过主成分回归和岭回归解决了多重共线性问题,最终模型在训练集和测试集上表现良好。
摘要由CSDN通过智能技术生成

目录

一、数据描述

(一)数据的获取

(二)数据的预处理及分析

二、初步回归分析

(一)模型及变量

(二)参数估计

(三)假设检验

1. 回归显著性检验

2. 回归系数的显著性检验

3. 回归子集的显著性检验

三、变量选择

(一)最优子集选择

(二)逐步回归

(三)最终模型

(四)假设检验

1. 回归显著性检验

2. 回归系数的显著性检验

(六)残差分析

四、多重共线性

(一)诊断

1. 相关系数

2. 方差膨胀因子(VIF)

3. 特征系统分析

(二)主成分回归

1. 主成分分析

2. 主成分回归

(三)岭回归

五、模型效果及结果分析

(一)训练集

(二)测试集


一、数据描述

(一)数据的获取

        本文选取2020年6月1日到2021年9月30日之间顺丰控股股票的相关数据作为训练集、2021年10月8日到2021年12月17日的顺丰控股股票的相关数据作为测试集,其中指标为交易日期(trade_date)、股票代码(ts_code)、开盘价(open)、最高价(high)、最低价(low)、收盘价(close)、前一日收盘价(pre_close)、涨跌额(change)、涨跌幅(pct_chg)、成交量(vol)、成交额(amount)及换手率(turnover_rate)。以上均通过tushare网站(个人ID:411335)的数据接口运用python获取:

import tushare as ts
import pandas as pd

ts.set_token('Your Token') # 输入个人Tushare接口
pro=ts.pro_api()

df1 = ts.pro_bar(ts_code='002352.SZ', adj='qfq', start_date='20200601', end_date='20210930',factors=['tor'])
df1 = df1[::-1]
df1.to_csv("data_train.csv")

df2 = ts.pro_bar(ts_code='002352.SZ', adj='qfq', start_date='20211008', end_date='20211217',factors=['tor'])
df2 = df2[::-1]
df2.to_csv("data_test.csv")

(二)数据的预处理及分析

        首先,本文对原始数据进行筛选,保留了研究所需数据,删除了多余及缺失数据。接着,由于本文所感兴趣的是前一日的数据对后一日股票价格的影响,因此将后一日的开盘价及收盘价添加进了数据集中。最后,由于解释变量的数据数量及差异较大,本文对其进行了标准化处理:

# 训练集
train.org = read.csv("data_train.csv")[,-1] 
train.org$trade_date = as.Date(as.character(train.org[,1]),format="%Y%m%d")

library(dplyr)
train.need = dplyr::select(train.org, open:close, amount, turnover_rate) # 数据筛选

train.Y = train.need$close[-1]
train.X = train.need[-dim(train.need)[1], ]
X.next_open = train.need$open[-1]

train.data = cbind(train.X, next_open = X.next_open, next_close = train.Y) # 最终数据
train.scale = data.frame(scale(train.data)) # 标准化数据
head(train.scale)

# 测试集
test.org = read.csv("data_test.csv")[,-1]
test.org$trade_date = as.Date(as.character(test.org[,1]),format="%Y%m%d")

test.need = dplyr::select(test.org, open:close, amount, turnover_rate)

test.Y = test.need$close[-1]
test.X = test.need[-dim(test.need)[1], ]
X.next_open = test.need$open[-1]

test.data = cbind(test.X, next_open = X.next_open, next_close = test.Y)
test.scale = data.frame(scale(test.data))
head(test.scale)

        对训练集数据做初步描述性统计,以方便后续分析:

library(ggplot2)
library(ggthemes)

# 后一日收盘价走势
p1 = ggplot(train.org) + geom_line(aes(x=trade_date, y=close), lwd=1, col="darkblue") + labs(x="Trade Date",y = "Close Price (RMB)") + theme_economist() + theme(axis.title = element_text(face = "bold"))
p1

# 每日收益情况
p2 = train.org %>% mutate(bd=ifelse(pct_chg>=0, ">=0", "<0")) %>% ggplot(aes(x=bd)) + geom_bar(fill=c("green4", "red3"), width=0.3) + labs(x="Profit", y="Count")
p2

# 每日涨跌额分布情况
p3 = ggplot(train.org) + geom_density(aes(x=change,colour=I("royalblue")), lwd=1)+
  labs(x="Difference",y = "Density")
p3

输出:

图1 后一日收盘价走势图

图2 每日收益情况

图3 每日涨跌额分布曲线 

        可以看到,训练集中的数据涨跌次数基本持平,且近似呈现中心分布。

二、初步回归分析

(一)模型及变量

        初步模型为:

y^\ast=\beta_1\ x_1^\ast+\beta_2\ x_2^\ast+\beta_3\ x_3^\ast+\beta_4\ x_4^\ast+\beta_5\ x_5^\ast+\beta_6\ x_6^\ast+\beta_7\ x_7^\ast+\varepsilon

其中解释变量分别是标准化后的当日开盘价、最高价、最低价、收盘价、成交额、换手率以及次日开盘价;响应变量为标准化后的次日收盘价。

(二)参数估计

sol.lm1 = lm(next_close ~ .-1, train.scale)
summary(sol.lm1)

输出:

Call:
lm(formula = next_close ~ . - 1, data = train.scale)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.50835 -0.07960 -0.01467  0.07265  0.59552 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
open          -0.032552   0.121366  -0.268    0.789    
high           0.121204   0.147730   0.820    0.413    
low            0.051732   0.155783   0.332    0.740    
close          0.002069   0.155957   0.013    0.989    
amount        -0.009392   0.056105  -0.167    0.867    
turnover_rate  0.005953   0.049145   0.121    0.904    
next_open      0.853367   0.092863   9.190   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1314 on 317 degrees of freedom
Multiple R-squared:  0.983,	Adjusted R-squared:  0.9827 
F-statistic:  2626 on 7 and 317 DF,  p-value: < 2.2e-16

        因此最小二乘估计的经验方程为:

y\widehat\\^\ast\ =-0.0326x_1^\ast+0.1212x_2^\ast+0.0517x_3^\ast+0.0021x_4^\ast-0.0094x_5^\ast+0.0060x_6^\ast+0.8534x_7^\ast

(三)假设检验

1. 回归显著性检验

        由上面结果可以得到检验统计量为2626,自由度为(7,317),检验的p值约等于0,因此认为回归方程是显著的。

2. 回归系数的显著性检验

        由上面结果可以看到,在0.05的显著性水平下,只有 \beta_7\ 是显著的。

3. 回归子集的显著性检验

        由于前六个回归系数的显著性检验并没有拒绝原假设,因此检验这六个变量组成的子集的显著性。假设为:

H_0\ : A\theta=0\ \ vs\ \ H_1\ : A\theta\neq0

其中,A=(I_6,\ 0_6,_1\ ),\ \theta=(\beta_1,\beta_2,\beta_3,\beta_4,\beta_5,\beta_6)\prime

beta_set = result$coefficients[-1,1]
X_set = train.scale[,c(-1,-8)]
X = train.scale[,1]
NX = diag(1, dim(train.scale)[1]) - X%*%solve(t(X)%*%X)%*%X # 正交投影矩阵
fz = t(beta_set)%*%t(X_set)%*%NX%*%t(t(X_set))%*%t(t(beta_set))/6 # 分子
fm = 0.017 # 分母,可由anova(sol.lm1)得到

F0 = fz/fm # 检验统计量
F0
pf(F0, 6, 317, lower.tail = F) # p值

输出:

        [,1]
[1,] 66.1167
             [,1]
[1,] 5.458672e-53

可以看到,检验统计量的值为66.1167,检验的p值约等于0,由此可见应拒绝原假设,认为该子集不为0。

三、变量选择

(一)最优子集选择

library(leaps)
exps = regsubsets(next_close ~ ., data = train.data, nbest=1, really.big = T)
expres = summary(exps)
res = data.frame(expres$outmat, adj2 = expres$adjr2, Cp = expres$cp, BIC = expres$bic)
res

        输出不同子集下的调整后的R2,Cp统计量以及BIC统计量:

open

high

low

close

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值