fix(datasource): QDII溢价率计算修复净值日期滞后一天对齐

问题: 溢价率计算使用同一天收盘价+净值,但QDII净值T+1披露
修复: 将净值索引后移一天,T日收盘价配T-1日净值
参考: 集思录做法(价格日期配前一日净值)

验证数据(513100.SH):
- 2026-05-15: 收盘价2.100, 净值(5/14)2.0200, 溢价率3.96% ✓
This commit is contained in:
2026-05-16 08:57:20 +08:00
parent 4c7538e6e1
commit 13be83965b

View File

@@ -236,15 +236,15 @@ class UniversalDataFetcher:
溢价率 = (ETF收盘价 - ETF净值) / ETF净值
注意净值数据通常T+1公布只计算有净值日期的溢价率
不使用 ffill只保留当天有净值数据的日期
关键QDII基金净值T+1披露需要用T日收盘价配T-1日净值
集思录做法:价格日期配前一日净值(净值日期滞后一天)
Args:
price_df: ETF价格数据索引为日期
nav_df: ETF净值数据索引为日期
Returns:
溢价率Series索引为净值日期,值为溢价率)
溢价率Series索引为价格日期,值为溢价率)
"""
# 去除重复日期
price_index = price_df.index
@@ -255,15 +255,20 @@ class UniversalDataFetcher:
if nav_index.has_duplicates:
nav_df = nav_df[~nav_df.index.duplicated(keep='last')]
# 找到共同的日期(只有当天有净值数据才计算溢价率)
common_dates = price_df.index.intersection(nav_df.index)
# QDII净值T+1披露T日收盘价配T-1日净值
# 将净值索引后移一天,使价格日期与前一日净值对齐
nav_df_shifted = nav_df.copy()
nav_df_shifted.index = nav_df_shifted.index + pd.Timedelta(days=1)
# 找到对齐后的共同日期(价格日期)
common_dates = price_df.index.intersection(nav_df_shifted.index)
if len(common_dates) == 0:
return None
# 计算共同日期的溢价率
# 计算溢价率T日收盘价 / T-1日净值已后移到T日索引
close_prices = price_df.loc[common_dates, 'close']
nav_values = nav_df.loc[common_dates, 'nav']
nav_values = nav_df_shifted.loc[common_dates, 'nav']
premium = (close_prices - nav_values) / nav_values
premium = premium.dropna()