You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

结果验证

针对示例数据运行代码后,修正结果完全符合预期:

  1. 资产x序列:第4行收益率32.33触发跳点规则,修正后第4行价格等于第3行修正价11.99,第5行基于11.99按0.12收益率计算得13.4288
  2. 资产y序列:第4行收益率54触发跳点规则,修正后第4行价格等于第3行修正价4.02
  3. 单条记录的资产X无前置数据,修正价格等于原始值430

内容的提问来源于stack exchange,提问作者Lorenzo Mazzucchelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:15:54