为股票建立逻辑回归模型

Build Logistic Regression Model for shares

我正在使用的数据包含标准普尔 500 指数 10 股的收盘价。

数据:

> dput(head(StocksData))
structure(list(ACE = c(56.86, 56.82, 56.63, 56.39, 55.97, 55.23
), AMD = c(8.47, 8.77, 8.91, 8.69, 8.83, 9.19), AFL = c(51.83, 
50.88, 50.78, 50.5, 50.3, 49.65), APD = c(81.59, 80.38, 80.03, 
79.61, 79.76, 79.77), AA = c(15.12, 15.81, 15.85, 15.66, 15.71, 
15.78), ATI = c(53.54, 52.37, 52.53, 51.91, 51.32, 51.45), AGN = c(69.77, 
69.53, 69.69, 69.98, 68.99, 68.75), ALL = c(29.32, 29.03, 28.99, 
28.66, 28.47, 28.2), MO = c(20.09, 20, 20.07, 20.16, 20, 19.88
), AMZN = c(184.22, 185.01, 187.42, 185.86, 185.49, 184.68)), row.names = c(NA, 
6L), class = "data.frame")

在接下来的部分中,我将计算 10 股的每日百分比变化:

perc_change <- (StocksData[-1, ] - StocksData[-nrow(StocksData), ])/StocksData[-nrow(StocksData), ] * 100
perc_change

输出:

#    ACE  AMD   AFL    APD    AA   ATI   AGN   ALL    MO  AMZN
#2 -0.07  3.5 -1.83 -1.483  4.56 -2.19 -0.34 -0.99 -0.45  0.43
#3 -0.33  1.6 -0.20 -0.435  0.25  0.31  0.23 -0.14  0.35  1.30
#4 -0.42 -2.5 -0.55 -0.525 -1.20 -1.18  0.42 -1.14  0.45 -0.83
#5 -0.74  1.6 -0.40  0.188  0.32 -1.14 -1.41 -0.66 -0.79 -0.20
#6 -1.32  4.1 -1.29  0.013  0.45  0.25 -0.35 -0.95 -0.60 -0.44

通过上面的代码,我找到了最新的 N 个变化率(N 应该在 [1,10] 中)。 我想制作 逻辑回归模型以预测第二天 (N + 1) 的变化,即“增加”或“减少”。

首先,我将数据分成两块:训练集和测试集: (注意:因为 testset 我必须参加最后的 40 场比赛,因为 trainset 我必须参加测试集的前 85 场比赛!)

trainset <- head(StocksData, 870)
testset <- tail(StocksData, 40)

继续模型的拟合:

model <- glm(Here???,family=binomial(link='logit'),data=trainset)

我面临的问题是我不明白,我不知道在 glm 函数中包含什么。 我研究了很多逻辑回归模型,我认为我的数据中没有我需要放在那里的这个对象。

对我代码中的这个误解部分有什么帮助吗?

根据您分享的内容,您需要预测有关您提到的投资组合的新数据到达时的增加或减少。在这种情况下,您需要定义目标变量。我们可以计算正面和负面变化的数量。有了这些变量,我们可以创建一个目标变量,如果正大于负(会有增量)则为 1,如果相反则为 0(不会有增量)。共享的数据非常小,但我已经绘制了代码草图,以便您可以应用 training/test 方法进行建模。这里的代码:

我们将从perc_change开始计算正变量和负变量:

#Build variables
#Store number of and positive negative changes
i <- names(perc_change)
perc_change$Neg <- apply(perc_change[,i],1,function(x) length(which(x<0)))
perc_change$Pos <- apply(perc_change[,i],1,function(x) length(which(x>0)))

现在,我们创建带有条件的目标变量:

#Build target variable
perc_change$Target <- ifelse(perc_change$Pos>perc_change$Neg,1,0)

我们为数据创建一个副本并删除不必要的变量:

#Replicate data
perc_change2 <- perc_change
perc_change2$Neg <- NULL
perc_change2$Pos <- NULL

使用 perc_change2 输入已准备就绪,您应该拆分为 train/test 数据。我不会这样做,因为数据太小了。我直接上模型:

#Train the model, few data for train/test in example but you can adjust that
model <- glm(Target~.,family=binomial(link='logit'),data=perc_change2)

有了这个模型,您就知道如何评估性能和其他事情了。如果需要更多详细信息,请随时告诉我。