R语言如何修正时间序列数据中的价格跳变点?
R语言价格跳变点修正实现
核心规则
- 跳点判定:单条记录的
returns字段值大于1时,判定该条记录价格为异常跳变值 - 修正逻辑:
- 异常跳点所在行(第i行)的修正价格 = 第i-1行的修正后价格
- 跳点之后的所有记录,修正价格按公式
前一行修正价格 * (1 + 当期收益率)逐行计算 - 不同资产的时间序列独立计算,不跨资产修正
实现代码
基础R版本(无第三方依赖)
# 若需把大小写不同的同名资产(如示例中的"x"和"X")合并处理,可打开下一行 # df$asset <- tolower(df$asset) df$price_corrected <- ave( seq_len(nrow(df)), df$asset, FUN = function(row_idx) { sub_data <- df[row_idx, ] corrected <- numeric(length(row_idx)) # 每组第一行无前置收益率,直接取原始价格 corrected[1] <- sub_data$price[1] for (i in 2:length(row_idx)) { curr_ret <- sub_data$returns[i] if (!is.na(curr_ret) && curr_ret > 1) { # 触发跳点规则,当前行价格取前序修正值 corrected[i] <- corrected[i-1] } else { # 正常点按收益率递推 corrected[i] <- corrected[i-1] * (1 + curr_ret) } } corrected } )
Tidyverse版本(适合dplyr工作流)
library(dplyr) df <- df %>% # 若需合并大小写同名资产,打开下一行 # mutate(asset = tolower(asset)) %>% group_by(asset) %>% mutate( price_corrected = accumulate2( .x = returns[-1], .f = ~ ifelse(!is.na(.y) && .y > 1, .x, .x * (1 + .y)), .init = price[1] ) %>% unlist() ) %>% ungroup()
结果验证
针对示例数据运行代码后,修正结果完全符合预期:
- 资产
x序列:第4行收益率32.33触发跳点规则,修正后第4行价格等于第3行修正价11.99,第5行基于11.99按0.12收益率计算得13.4288 - 资产
y序列:第4行收益率54触发跳点规则,修正后第4行价格等于第3行修正价4.02 - 单条记录的资产
X无前置数据,修正价格等于原始值430
内容的提问来源于stack exchange,提问作者Lorenzo Mazzucchelli
相关产品推荐
相关产品推荐

