【问题标题】:Using Iteration in Data Frames在数据框中使用迭代
【发布时间】:2017-07-25 23:13:25
【问题描述】:

我正在处理股票(何时买入/卖出以及持有多少股票)

我是一个初学者,试图从 Excel 中的小样本量转移到 R 中的更大样本量。

我将尝试用一个可重现的例子来解释我的问题。如果无法理解,请告诉我,我会尽力澄清。

我有两只股票:

AAPL.price <- c(140,145,150,148,152,156,153)
MSFT.price <- c(70,75,73,74,73,76,74)
price <- data.frame (AAPL.price,MSFT.price)

我还有一个数据框,它告诉我何时买入和何时卖出给定股票(1 是买入,-1 是卖出)

AAPL <- c(1,-1,0,1,0,0,-1)
MSFT <- c(0,0,1,0,-1,0,1)
decision <- data.frame (AAPL,MSFT)

此外,我还创建了一个公式,告诉我在每个时间点我持有多少股票。但是,由于股票数量取决于可用现金等因素,我创建了一个函数,它总是告诉我,当我购买股票时,我总是减 100(只是为了简单起见,希望我以后可以改变它)。

函数是:

numberstocks <- function(x) {

newValue <- 0

for (i in 1:length(x)) {

    if (x[i] == -1) {
        newValue <- -100
    } else if (x[i] == 1) {
        newValue <- 100
    } else if (x[i] == 0 && newValue != 100) {
        newValue <- 0
    }
    x[i] <- newValue
}

return(x)

}

通过应用decision2 &lt;- as.data.frame (lapply(decision,numberstocks)),我得到一个数据框,当我持有股票时价值为 100,当我卖出股票时价值为-100。

之后,我开始计算现金。为此,我在数据框中添加了两列:一列是我的现金流动(来自买卖),另一列是我的实际现金价值。

positivevalues <- function (x)
sapply (seq_along(x),function (i) {
    if (x[i] < -0.5) {
        100
    }else{
        x[i]
    }
})

decision3 <- as.data.frame (lapply(decision2[,1:2], positivevalues))
decision2$cashmov <- with (decision2, c(rowSums(decision*price*decision3)))

decision2$cash <- with (decision2, c(1000000, matrix(0,6,1)))
decision2$cash <- 0
    for (i in 1) {
    decision2$cash [i] = 1000000
    }
    for (i in 2:7){
    decision2$cash [i] = decision2$cash[i-1]-decision2$cashmov[i]
}        

最后,我还创建了一个列,告诉我每个时期我购买的股票数量。

decision2$numberbuys <- with (decision2, c(rowSums(decision>0)))

我想要的是,对于每一点,当我购买股票时,我希望拥有“100”而不是“100”

decision2$cash[i-1]/decision2$numberbuys[i]/price

这会影响 [i] 期的现金,从而影响 [i+1] 期的股票数量等等。

有人可以帮我解决这个问题吗?

对不起,如果太混乱了,我尽量说清楚。

提前谢谢你

【问题讨论】:

    标签: r dataframe iteration


    【解决方案1】:

    如果我猜对了,那么你在下一个认识方面会遇到问题:
    decision2$cash[i-1]/decision2$numberbuys[i]/price

    输入

    con <- textConnection("AAPL MSFT    cash cashmov numberbuys
    100    0 1000000   14000          1
    -100    0 1014500  -14500          0
       0  100 1007200    7300          1
     100  100  992400   14800          1
     100 -100  999700   -7300          0
     100    0  999700       0          0
    -100  100 1007600   -7900          1")
    
    decision2 <- read.table(con, header = T)
    
    df <- data.frame(cash = decision2$cash, numberbuys = decision2$numberbuys)
    
    #cash.offset column is decision2$cash[i-1]
    df$cash.offset <- c(NA, df$cash[1:nrow(df) - 1])
    df$res <- df$cash.offset / df$numberbuys
    
    df$AAPL <- df$res / decision2$AAPL
    df$MSFT <- df$res / decision2$MSFT
    
    df$AAPL[is.infinite(df$AAPL)] <- 0
    df$MSFT[is.infinite(df$MSFT)] <- 0
    
    print(df)
    

    输出

         cash numberbuys cash.offset     res  AAPL  MSFT
    1 1000000          1          NA      NA    NA    NA
    2 1014500          0     1000000     Inf     0     0
    3 1007200          1     1014500 1014500     0 10145
    4  992400          1     1007200 1007200 10072 10072
    5  999700          0      992400     Inf     0     0
    6  999700          0      999700     Inf     0     0
    7 1007600          1      999700  999700 -9997  9997
    

    【讨论】:

    • 感谢您的帮助,但实际上这不是我的问题。我的问题是如何使决策 2(AAPL 和 MSFT)的第一列和第二列取决于以前的现金价值。我想将您创建的“res”列除以每只股票的价格。然后我想在我出售股票时重新评估相同数量股票的价值,这将对现金产生影响。我说清楚了吗?
    • 我为两个股票代码添加了带有res / price 的列。我希望你可以自己重新评估价值观。
    • 感谢您的帮助。然而,这不是我想要的。因为我的挣扎是,例如,在时间 3 我购买了 10145 支 MSFT 股票,而在时间 5 我卖出了这些股票。这些股票的出售必须影响我在时间 5 的现金水平,这反过来又会影响我在时间 7 购买的 MSFT 股票。而您所做的仅使用现金水平 [i-1] 来确定股票数量买入 [i] 但我还需要卖出股票的价格和数量 [i] 来影响现金水平 [i]
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2019-12-07
    • 2019-01-14
    相关资源
    最近更新 更多