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