目录
一、数据描述
(一)数据的获取
本文选取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 每日涨跌额分布曲线
可以看到,训练集中的数据涨跌次数基本持平,且近似呈现中心分布。
二、初步回归分析
(一)模型及变量
初步模型为:
其中解释变量分别是标准化后的当日开盘价、最高价、最低价、收盘价、成交额、换手率以及次日开盘价;响应变量为标准化后的次日收盘价。
(二)参数估计
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
因此最小二乘估计的经验方程为:
(三)假设检验
1. 回归显著性检验
由上面结果可以得到检验统计量为2626,自由度为(7,317),检验的p值约等于0,因此认为回归方程是显著的。
2. 回归系数的显著性检验
由上面结果可以看到,在0.05的显著性水平下,只有 是显著的。
3. 回归子集的显著性检验
由于前六个回归系数的显著性检验并没有拒绝原假设,因此检验这六个变量组成的子集的显著性。假设为:
其中,。
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 |