diff --git a/datasource/flask_api_source.py b/datasource/flask_api_source.py index f80fe22..dee8d92 100644 --- a/datasource/flask_api_source.py +++ b/datasource/flask_api_source.py @@ -142,6 +142,30 @@ class FlaskAPIDataSource: if 'info' in data: df.attrs['info'] = data['info'] + # ETF 数据自动附加净值和溢价率信息 + if data.get('asset_type') == 'china_etf': + # 净值数据 + nav_section = data.get('nav', {}) + if nav_section.get('data'): + nav_df = pd.DataFrame(nav_section['data']) + if 'date' in nav_df.columns: + nav_df['date'] = pd.to_datetime(nav_df['date']) + nav_df = nav_df.set_index('date') + df.attrs['nav'] = nav_df + + # 溢价率序列 + if 'premium_series' in data: + df.attrs['premium_series'] = data['premium_series'] + + # 最新溢价率 + if 'latest_premium' in data: + df.attrs['latest_premium'] = data['latest_premium'] + df.attrs['premium_date'] = data.get('premium_date') + + # 溢价率统计 + if 'premium_stats' in data: + df.attrs['premium_stats'] = data['premium_stats'] + print(f"✓ {code}: {len(df)} 条数据 ({start_date} ~ {end_date})") return df diff --git a/datasource/flask_server.py b/datasource/flask_server.py index d0697d1..96b948a 100644 --- a/datasource/flask_server.py +++ b/datasource/flask_server.py @@ -630,6 +630,44 @@ def get_ohlcv(): result['cached'] = is_cached result['asset_type'] = final_type.value # 使用最终类型 + + # 如果是中国 ETF,自动附加净值和溢价率数据 + if final_type == AssetType.CHINA_ETF: + try: + f = get_fetcher() + with f: + price_df, nav_df, premium_series = f.fetch_etf_with_nav(code, start, end) + + # 添加净值数据 + if nav_df is not None and len(nav_df) > 0: + result['nav'] = dataframe_to_json(nav_df) + + # 添加溢价率序列 + if premium_series is not None and len(premium_series) > 0: + premium_data = [ + {"date": date.strftime('%Y-%m-%d'), "premium": round(premium, 6)} + for date, premium in premium_series.items() + ] + result['premium_series'] = premium_data + + # 最新溢价率 + latest_premium = premium_series.iloc[-1] + latest_date = premium_series.index[-1].strftime('%Y-%m-%d') + result['latest_premium'] = round(latest_premium, 6) + result['premium_date'] = latest_date + + # 溢价率统计 + result['premium_stats'] = { + "mean": round(premium_series.mean(), 6), + "std": round(premium_series.std(), 6), + "min": round(premium_series.min(), 6), + "max": round(premium_series.max(), 6), + "median": round(premium_series.median(), 6), + } + except Exception as e: + # 净值获取失败不影响主数据返回 + result['nav_error'] = str(e) + # 如果用户指定了类型但与自动检测不同,显示提示 if asset_type_param and detected_type != final_type: result['type_override'] = {