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:
2026-05-11 23:34:23 +08:00
parent f663d51b87
commit 1fca536c95
61 changed files with 221 additions and 159 deletions

View 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}")