使用QuantLib循环获取多币种假期列表报错的解决方法
解决QuantLib循环获取多币种假期列表的问题
错误原因分析
你遇到的module 'QuantLib' has no attribute 'df_calendar'错误,是因为错误地把自己定义的DataFrame df_calendar当成了QuantLib模块的属性(写成了ql.df_calendar)。另外代码里还有几处逻辑问题:
- 存储结果的字典
c未提前初始化 - 列表
a被当作字典使用,日期转换的循环逻辑有误 - CSV中的日历名称是带括号的字符串(如
UnitedStates()),无法直接传入holidayList,需要先处理成可实例化的QuantLib日历类
修正后的代码
import pandas as pd import QuantLib as ql import datetime # 读取包含币种、国家、日历的CSV文件 df_calendar = pd.read_csv('your_file.csv') startdate = ql.Date(1, 12, 2019) enddate = ql.Date(31, 12, 2022) def ql_to_datetime(d): return datetime.date(d.year(), d.month(), d.dayOfMonth()) # 初始化存储各币种假期的字典 ccy_holidays = {} # 遍历DataFrame的每一行 for idx, row in df_calendar.iterrows(): ccy = row['CCY'] # 处理日历名称:去掉末尾的括号,提取类名 calendar_class_name = row['Calendar'].strip().replace('()', '') # 动态获取QuantLib中的日历类并实例化 target_calendar = getattr(ql, calendar_class_name)() # 获取假期列表并转换为Python datetime格式 holiday_dates = [ql_to_datetime(date) for date in ql.Calendar.holidayList(target_calendar, startdate, enddate)] # 将结果存入字典 ccy_holidays[ccy] = holiday_dates # 输出各币种的假期列表 for ccy, holidays in ccy_holidays.items(): print(f"{ccy} 假期列表:") print(holidays)
关键修正点说明
- 使用
getattr(ql, calendar_class_name)()实现从字符串类名到QuantLib日历实例的转换,解决动态调用日历类的问题 - 提前初始化字典
ccy_holidays,避免键不存在的报错 - 用列表推导式简化日期转换逻辑,代码更简洁高效
- 改用
iterrows()遍历DataFrame,可读性更强
内容的提问来源于stack exchange,提问作者Akshay3192
相关产品推荐
相关产品推荐

