如何在R中用for循环实现迭代计算填充价格数据框
解决R中用循环填充股价数据框的问题
嗨,我明白你卡在for循环的语法上了,其实这个需求的逻辑你已经摸透了——就是用前一天的股价乘上(1+当日收益率)来递推当天的股价,只是不知道怎么把这个逻辑写成循环而已。我给你两种方案,一种是你想要的for循环,另一种是更符合R风格的向量化方法,都能解决问题:
方案1:使用for循环实现
你已经完成了数据框的初始化工作,接下来只需要遍历从第2行到最后一行的所有行,逐行应用你的公式就行。R支持整行的向量运算,所以不需要再嵌套列的循环,一行代码就能处理所有10列:
# 遍历第2行到数据框的最后一行(用nrow更灵活,行数变化时不用修改) for (t in 2:nrow(pri)) { pri[t, ] = pri[t-1, ] * (1 + ret[t, ]) }
代码解释:
t in 2:nrow(pri):让循环变量t从第2行开始,一直到数据框的总行数(这里是30),这样就算后续数据行数改变,代码也不用调整。pri[t, ] = pri[t-1, ] * (1 + ret[t, ]):对第t行的所有列,直接用前一行t-1的股价,乘以(1+第t行的对应收益率),完成整行的计算填充。
方案2:向量化方法(更高效)
在R中,循环的效率有时候不如向量化操作,尤其是当数据量很大的时候。你可以用cumprod()(累积乘积)函数来实现同样的效果,代码更简洁,运行速度也更快:
# 先把收益率转换为(1+收益率)的形式,然后对每列计算累积乘积,再乘以初始股价 pri = t(apply(1 + ret, 2, cumprod)) * given
代码解释:
1 + ret:把所有收益率转换成增长因子。apply(1 + ret, 2, cumprod):对每一列(参数2代表列)计算累积乘积,这样每一列的第一个值是1+ret[1,],第二个值是(1+ret[1,])*(1+ret[2,]),以此类推,正好对应股价的增长倍数。t(...):因为apply返回的结果会把列转成行,所以需要转置回来恢复原来的行列结构。* given:用初始股价乘以每一列的累积增长倍数,直接得到所有行的股价。
这样两种方法都能完美实现你想要的迭代填充效果,你可以根据自己的习惯选择使用~
内容的提问来源于stack exchange,提问作者ritalin
相关产品推荐
相关产品推荐

