Files
etf/archive/single_files/fetch_159516_nav.py
aszerW 1fca536c95 refactor: 归档旧代码,保留新框架结构
归档内容:
- core/ (数据源、因子计算、通用工具) → archive/legacy_core/
- strategies/rotation/engine.py, portfolio.py, report.py → archive/legacy_core/
- scripts/ (run_rotation, daily_scheduler) → archive/legacy_scripts/
- examples/ → archive/legacy_examples/
- tests/ (实验、对比测试) → archive/legacy_tests/
- 单独文件 (fetch_*.py, 动量.py, 全球市场.py等) → archive/single_files/

保留新结构:
- framework/ (抽象接口)
- strategies/shared/ (定制组件)
- strategies/rotation/strategy.py (新策略)
- 外层配置: .env, .dockerignore, build-and-push.sh, hk_ecs.pem, README.md, requirements.txt
- Docker相关: Dockerfile, Dockerfile_base, docker-compose.yml

更新README反映新框架架构
2026-05-11 23:34:23 +08:00

110 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
获取159516 ETF净值数据
"""
import os
import pandas as pd
import tushare as ts
from datetime import datetime, timedelta
# 设置Tushare token
def get_tushare_token():
# 首先尝试从环境变量获取
token = os.environ.get("TUSHARE_TOKEN")
if token:
return token
# 尝试从.env文件获取
try:
from dotenv import load_dotenv
load_dotenv()
token = os.environ.get("TUSHARE_TOKEN")
if token:
return token
except ImportError:
pass
# 手动读取.env文件
env_path = os.path.join(os.path.dirname(__file__), '.env')
if os.path.exists(env_path):
with open(env_path, 'r') as f:
for line in f:
if line.startswith('TUSHARE_TOKEN='):
token = line.strip().split('=', 1)[1].strip().strip('"').strip("'")
if token:
return token
raise ValueError("请设置 TUSHARE_TOKEN 环境变量或在.env文件中配置")
def fetch_etf_nav(etf_code="159516.SZ", days=30):
"""
获取ETF净值数据
Args:
etf_code: ETF代码"159516.SZ"
days: 获取天数
Returns:
DataFrame: 包含日期和净值
"""
pro = ts.pro_api(get_tushare_token())
# 计算日期范围
end_date = datetime.now()
start_date = end_date - timedelta(days=days + 5)
start_str = start_date.strftime('%Y%m%d')
end_str = end_date.strftime('%Y%m%d')
# 转换代码格式 (tushare使用.SH而不是.SS)
ts_code = etf_code.replace(".SS", ".SH")
print(f"获取 {etf_code} 净值数据...")
print(f"日期范围: {start_str} ~ {end_str}")
try:
# 获取ETF净值数据
nav_df = pro.fund_nav(
ts_code=ts_code,
start_date=start_str,
end_date=end_str
)
if nav_df is None or len(nav_df) == 0:
print("未获取到净值数据")
return None
# 排序并处理数据
nav_df = nav_df.sort_values('nav_date')
# 转换日期格式
nav_df['date'] = pd.to_datetime(nav_df['nav_date'])
nav_df = nav_df.set_index('date')
print(f"\n获取到 {len(nav_df)} 条净值数据")
print(f"最新净值日期: {nav_df.index.max().strftime('%Y-%m-%d')}")
print(f"最新净值: {nav_df['unit_nav'].iloc[-1]}")
# 显示最近10条数据
print(f"\n最近10条净值数据:")
print(nav_df[['unit_nav']].tail(10).to_string())
return nav_df
except Exception as e:
print(f"获取净值数据失败: {e}")
return None
if __name__ == "__main__":
# 获取159516的净值数据
result = fetch_etf_nav("159516.SZ", days=30)
if result is not None:
# 保存到CSV文件
output_file = "159516_nav_data.csv"
result[['unit_nav']].to_csv(output_file)
print(f"\n数据已保存到: {output_file}")