如何在R语言中计算平均方向准确率(Mean Directional Accuracy)?
如何在R中计算平均方向准确率(MDA)
当然可以!平均方向准确率(MDA)是评估时间序列预测方向正确性的经典指标——它核心衡量的是你预测的涨跌方向和实际市场涨跌方向吻合的比例。针对你手里的股票实际值+情绪得分的数据框,在R里有两种简单的实现方式,我给你一步步讲清楚:
方法一:自定义函数(灵活适配你的数据逻辑)
首先我们得明确两个关键方向的定义(你可以根据自己的研究需求调整):
- 实际方向:股票每日价格的涨跌方向,用当日价格与前一日的差值符号表示(正=涨,负=跌)
- 预测方向:这里假设你用情绪得分的符号作为涨跌预测(正=预测涨,负=预测跌);如果你的逻辑是用情绪得分的变化方向来预测,只需要修改下面的代码即可。
自定义MDA计算函数
calculate_mda <- function(actual_prices, sentiment_scores) { # 1. 计算实际价格的日变化方向 actual_diffs <- diff(actual_prices) actual_directions <- sign(actual_diffs) # 2. 把情绪得分转换为预测方向(去掉第一个值,因为实际变化少了一个观测) pred_directions <- sign(sentiment_scores[-1]) # 3. 过滤掉实际价格平盘(变化为0)的情况(这类观测无法判断方向对错) valid_indices <- actual_directions != 0 actual_valid <- actual_directions[valid_indices] pred_valid <- pred_directions[valid_indices] # 4. 计算方向一致的比例 correct_count <- sum(actual_valid == pred_valid) mda <- correct_count / length(actual_valid) return(mda) }
用示例数据测试
# 模拟你的数据结构 set.seed(123) # 固定随机种子,结果可复现 stock_data <- data.frame( actual_price = c(100, 102, 99, 101, 105, 103, 104), # 股票实际价格 sentiment = c(0.2, 0.5, -0.1, 0.3, 0.6, -0.2, 0.1) # 每日情绪得分 ) # 计算MDA mda_result <- calculate_mda(stock_data$actual_price, stock_data$sentiment) cat("平均方向准确率(MDA):", round(mda_result, 4), "\n")
方法二:用现成统计包快速计算
如果你不想自己写函数,可以用专门的时间序列评估包TSmetrics,它内置了mda()函数,能自动处理方向计算。
步骤:
- 安装并加载包:
install.packages("TSmetrics") library(TSmetrics)
- 注意:这个函数需要实际价格序列和预测价格序列作为输入(不是直接用情绪得分)。如果你的情绪得分是用来预测价格的,先得到预测价格后再用这个函数:
# 模拟预测价格(这里只是示例,你需要替换成自己的预测结果) stock_data$predicted_price <- c(NA, 101, 100, 102, 106, 104, 103) # 计算MDA mda_from_package <- mda(stock_data$actual_price, stock_data$predicted_price) cat("使用TSmetrics包计算的MDA:", round(mda_from_package, 4), "\n")
一些关键注意事项
- 平盘处理:实际价格无变化(diff=0)的观测通常会被排除,因为这类情况没有明确的涨跌方向,无法验证预测对错。
- 预测逻辑调整:如果你的预测方向不是基于情绪得分的符号,而是情绪得分的变化(比如情绪上升预测涨),只需要把
pred_directions <- sign(diff(sentiment_scores))即可。 - 样本量:确保你的时间序列有足够多的观测值,MDA结果才具有统计意义。
内容的提问来源于stack exchange,提问作者davide andriolo
相关产品推荐
相关产品推荐

