基于月度调仓股票组合数据新增买卖持有状态列的技术需求
解决股票调仓状态标记问题
我明白你需要根据股票在相邻调仓日的持仓变动,给每个调仓日的股票标记0/1/2三种状态,其中最后一期的状态为空。下面是基于R语言的解决方案,完全匹配你给出的示例输出:
步骤说明
核心思路是逐期对比当前调仓日、上一期和下一期的持仓,根据股票的持有/变动情况分配状态:
- 第一期(无前期):如果股票在下一期继续持有则标记1,否则标记2;
- 中间期:
- 上期持有且下期仍持有 → 0;
- 上期持有但下期卖出,或本期新买入且下期持有 → 1;
- 本期新买入且下期卖出 → 2;
- 最后一期:没有下一期,状态设为空(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
相关产品推荐
相关产品推荐

