求助:验证从当前日期计算股票1/3/6月回报率的逻辑
聊聊你这套股票回报率计算逻辑的合理性
首先得说,你通过日期差筛选对应时段价格来计算回报率的核心思路是站得住脚的,但当前的固定天数区间划分逻辑有几个明显的问题,甚至还有一个容易忽略的错误,咱们一步步捋:
一、当前逻辑的不合理/待修正点
最明显的错误:3个月和6个月的天数区间搞反了
你定义6个月对应90-93天,但这个时长其实是3个月的合理范围(3个月大概90-92天);而3个月对应60-61天,这其实只相当于2个月左右,完全不符合“3个月回报率”的业务定义,这是首先要修正的核心问题。固定天数区间忽略了月份的自然差异
不同月份天数差很大:平年2月只有28天,大月有31天,闰年2月还有29天。比如当前日期是2024年3月1日,往前推1个月是2024年2月1日,天数差是29天,这时候你的逻辑(只取30/31天)就会漏掉这个有效数据;再比如如果当前是1月31日,往前推1个月是12月31日,天数差31天,这符合你的规则,但如果是5月31日往前推1个月是4月30日,天数差31天,也符合,但遇到2月的特殊情况就会漏数据。没考虑金融领域对“月”的常见定义
行业里计算月度回报率通常有两种标准:- 日历月:比如今天是5月15日,1个月前就是4月15日,不管中间隔了29/30/31天;
- 固定30天:把每个月都按30天算,但这种方式会和实际日历周期脱节。
你的逻辑卡在中间,既不是严格的日历月,也不是固定30天,容易出现样本遗漏或错误匹配。
二、更合理的优化方案
方案1:按日历月精确匹配(推荐)
如果业务要求严格对应“N个月前”的日历周期,直接用日期函数计算目标日期,比靠天数差靠谱多了:
- 1个月回报率:找
date字段等于「当前日期 - 1个月」的记录,提取对应价格; - 3个月回报率:找
date字段等于「当前日期 - 3个月」的记录,提取对应价格; - 6个月回报率:找
date字段等于「当前日期 - 6个月」的记录,提取对应价格。
如果遇到周末、节假日无交易数据的情况,可以取目标日期前后最近的交易日价格来替代。
方案2:修正后的天数范围匹配
如果必须用天数差来划分,得把区间调整得更灵活,覆盖所有可能的月份组合:
- 1个月:天数差在28-31天之间(覆盖平年2月、闰年2月、大月、小月的所有情况);
- 3个月:天数差在89-92天之间(3个月的天数范围从平年2-4月的89天到7-9月的92天);
- 6个月:天数差在178-184天之间(半年的天数从平年上半年的178天到闰年下半年的184天)。
这样就能避免因月份天数差异导致的有效样本遗漏。
三、额外提醒
- 回报率的计算公式要准确:
(当前价格 - N个月前价格) / N个月前价格 * 100%,别搞反分子分母; - 要考虑异常情况:如果对应时段找不到有效价格(比如这段时间没交易),得提前定义好处理规则——是取最近的价格,还是返回空值,还是用其他方式补全。
内容的提问来源于stack exchange,提问作者Jitesh
相关产品推荐
相关产品推荐

