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反映新框架架构
This commit is contained in:
109
archive/single_files/fetch_159516_nav.py
Normal file
109
archive/single_files/fetch_159516_nav.py
Normal file
@@ -0,0 +1,109 @@
|
||||
#!/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}")
|
||||
Reference in New Issue
Block a user