Python for循环内if判断datetime.date相等不生效 无法过滤非交易日
问题根因
过滤逻辑失效核心错误
你在date_maker中比对休市日期的逻辑完全错误:遍历self.nobiz时,每一次循环都会覆盖adding的取值,最终adding的结果仅和休市列表最后一个元素的匹配结果挂钩,前面所有匹配结果都会被覆盖。
比如你休市列表有100个日期,哪怕当前待判断日期是第1个休市日,只要最后一个元素和它不相等,adding最终还是会被设为True,导致休市日期被误加入结果。
休市日期生成逻辑错误
nonbizday方法的生成逻辑不符合A股2021年休市规则:
- 固定每次加1天、加6天的逻辑既不能正确覆盖全年周末,也没有包含元旦、春节等法定休假日
- 循环终止条件判断滞后,会把2022年的日期也追加到休市列表中
- 方法内定义的
newyears变量从未被使用,属于冗余代码
修复方案
修正过滤逻辑
把date_maker中的日期比对部分改成如下逻辑:
def date_maker(self): btime = self.data['Meta Data']['3. Last Refreshed'] btime = datetime.datetime.strptime(btime, dtnotime).date() benchlist = [] # 先把休市列表转成集合,查询效率比列表高100倍以上 holiday_set = set(self.nobiz) for i in range(1, 11): current_date = btime - datetime.timedelta(days=i) # 只要不在休市集合里就加入结果,不需要手写循环遍历比对 if current_date not in holiday_set: benchlist.append(current_date) return benchlist
修正休市日期生成逻辑
如果要准确生成2021年A股休市日期,建议直接录入官方公布的法定休假日,再叠加全年周末,示例逻辑:
def nonbizday(self): # 2021年A股法定休假日,可按证监会官方公告补充完整 statutory_holidays = [ datetime.date(2021,1,1), datetime.date(2021,2,11), # 剩余法定休假日按规则补全 ] nobiz = set(statutory_holidays) # 遍历2021年所有日期,把周末加进休市列表 d = datetime.date(2021,1,1) while d.year == 2021: # weekday返回值5对应周六、6对应周日 if d.weekday() >=5: nobiz.add(d) d += datetime.timedelta(days=1) return list(nobiz)
其他优化建议
- 日常开发直接用成熟工具库实现交易日过滤即可,不需要手写逻辑:比如用
pandas.date_range的freq='B'参数生成基础工作日,对接exchange_calendars库可直接获取A股、港股等全球市场的准确交易日序列,自动适配所有休市规则 - 变量命名尽量见名知意,比如
nobiz改成cn_stock_holidays_2021,benchie改成trading_date_candidate,避免后续维护看不懂含义 - 调试用的print代码上线前清理,或者替换为logging模块输出可分级的日志
内容的提问来源于stack exchange,提问作者KingAndrew801
相关产品推荐
相关产品推荐

