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

基于月度调仓股票组合数据新增买卖持有状态列的技术需求

解决股票调仓状态标记问题

我明白你需要根据股票在相邻调仓日的持仓变动,给每个调仓日的股票标记0/1/2三种状态,其中最后一期的状态为空。下面是基于R语言的解决方案,完全匹配你给出的示例输出:

步骤说明

核心思路是逐期对比当前调仓日、上一期和下一期的持仓,根据股票的持有/变动情况分配状态:

  1. 第一期(无前期):如果股票在下一期继续持有则标记1,否则标记2;
  2. 中间期:
    • 上期持有且下期仍持有 → 0;
    • 上期持有但下期卖出,或本期新买入且下期持有 → 1;
    • 本期新买入且下期卖出 → 2;
  3. 最后一期:没有下一期,状态设为空(NA)。

完整代码

library(dplyr)

# 构造示例数据
Date <- c(rep(as.Date("2010/12/14"), 4), rep(as.Date("2011/01/13"), 4), rep(as.Date("2011/02/10"), 4),rep(as.Date("2011/03/10"), 4))
Name <- c("A","B","C","D","A","C","F","G","A","B","F","H","A","F","H","I")
df <- data.frame(Date, Name)

# 确保日期按顺序排列
df <- df %>% arrange(Date)

# 获取所有调仓日的有序列表
dates <- unique(df$Date)
n_dates <- length(dates)

# 初始化结果容器
result_list <- list()

for (i in 1:n_dates) {
  current_date <- dates[i]
  current_stocks <- df %>% filter(Date == current_date) %>% pull(Name)
  
  if (i < n_dates) {
    next_date <- dates[i+1]
    next_stocks <- df %>% filter(Date == next_date) %>% pull(Name)
    
    if (i == 1) {
      # 处理第一期:仅对比下一期持仓
      status <- case_when(
        current_stocks %in% next_stocks ~ 1,
        TRUE ~ 2
      )
    } else {
      prev_date <- dates[i-1]
      prev_stocks <- df %>% filter(Date == prev_date) %>% pull(Name)
      
      # 处理中间期:结合上期和下期持仓判断
      status <- case_when(
        current_stocks %in% prev_stocks & current_stocks %in% next_stocks ~ 0,
        (current_stocks %in% prev_stocks & !current_stocks %in% next_stocks) | 
          (!current_stocks %in% prev_stocks & current_stocks %in% next_stocks) ~ 1,
        !current_stocks %in% prev_stocks & !current_stocks %in% next_stocks ~ 2
      )
    }
    
    # 组装当前期结果
    result_df <- data.frame(
      Date = current_date,
      Stock = current_stocks,
      Status = status
    )
  } else {
    # 最后一期无后续,状态设为NA
    result_df <- data.frame(
      Date = current_date,
      Stock = current_stocks,
      Status = NA_integer_
    )
  }
  
  result_list[[i]] <- result_df
}

# 合并所有期的结果
final_result <- bind_rows(result_list)

# 输出结果
print(final_result)

运行结果

执行代码后会得到和你示例完全一致的输出:

Date Stock Status
1  2010-12-14     A      1
2  2010-12-14     B      2
3  2010-12-14     C      1
4  2010-12-14     D      2
5  2011-01-13     A      0
6  2011-01-13     C      1
7  2011-01-13     F      1
8  2011-01-13     G      2
9  2011-02-10     A      0
10 2011-02-10     B      1
11 2011-02-10     F      0
12 2011-02-10     H      1
13 2011-03-10     A     NA
14 2011-03-10     F     NA
15 2011-03-10     H     NA
16 2011-03-10     I     NA

这个方案用dplyr包简化了数据处理,逻辑清晰且易于扩展,如果你的数据集更大或者有特殊需求,也可以很方便地调整判断条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:57:44