|
|
d62763b0bd
|
feat(flask): OHLCV 端点自动附加 ETF 净值和溢价率
flask_server.py:
- 当 asset_type 为 china_etf 时,自动调用 fetch_etf_with_nav
- 响应中添加 nav、premium_series、latest_premium、premium_stats
flask_api_source.py:
- 解析 ETF 数据中的净值和溢价率信息
- 将 nav_df、premium_series、premium_stats 存入 DataFrame.attrs
|
2026-05-14 00:57:37 +08:00 |
|
|
|
4fe21a7cd4
|
fix(datasource): 修复 zstd 响应 JSON 解析问题
- flask_api_source.py: 添加 requests.exceptions.JSONDecodeError 捕获
- flask_server.py: 启用 flask-compress gzip 压缩
- requirements.txt: 添加 flask-compress>=1.14
- strategy.py: 修复 flask_api 配置读取方式
问题原因:Traefik Ingress 使用 zstd 压缩响应,
requests.response.json() 解析失败,但 json.loads(response.text) 成功
|
2026-05-14 00:27:30 +08:00 |
|
|
|
416f708d53
|
feat(datasource): 实现加密货币数据获取功能
- 新增 ccxt_source.py: CCXT + OKX 加密货币数据源
- 新增 socks2http.py: SOCKS5 转 HTTP 代理转换器
- 修改 universal_fetcher.py: 添加 _fetch_crypto 方法,支持 timeframe 参数
- 修改 flask_server.py: API 支持 timeframe 参数,加密货币不缓存
支持的 timeframe: 1d, 1h, 4h, 15m, 1m
测试验证: BTC 数据获取成功
|
2026-05-13 23:30:32 +08:00 |
|
|
|
ecd8d6539f
|
feat(datasource): 股票info字段放到API响应最外层
- yfinance_source.py: stock_info 存储在 df.attrs['info'] 中
- flask_server.py: dataframe_to_json 从 df.attrs 提取 info 放到最外层
- flask_server.py: 缓存切片函数保留 info 字段
- Dockerfile: 启用 Flask 服务作为默认 CMD(端口80)
响应结构示例:
{
"data": [{"date": "2024-01-01", "code": "AAPL", ...}],
"info": {"sector": "Technology", "industry": "...", ...}
}
|
2026-05-13 00:26:19 +08:00 |
|
|
|
d226916131
|
fix: Flask服务默认端口改为80,简化Dockerfile CMD
修改内容:
- flask_server.py: 默认端口从5000改为80
- Dockerfile: CMD简化,无需指定--port参数
最终Dockerfile:
FROM index-base:latest
WORKDIR /app
...
EXPOSE 80
CMD ["python", "datasource/flask_server.py", "--host", "0.0.0.0"]
|
2026-05-12 23:53:23 +08:00 |
|
|
|
cf48c4418f
|
fix: asset_type参数改为强制覆盖而非验证
问题:
- 原设计要求asset_type与自动检测结果一致
- 如果自动检测逻辑有问题,用户无法覆盖
修改:
- 指定asset_type后直接使用,不再验证
- 用户指定的类型强制覆盖自动检测结果
- 返回type_override字段提示覆盖情况
返回示例(覆盖时):
{
"asset_type": "us_index", // 用户指定
"type_override": {
"detected": "hk_index", // 自动检测结果
"specified": "us_index", // 用户指定
"hint": "用户强制覆盖了自动检测结果"
}
}
|
2026-05-12 23:34:36 +08:00 |
|
|
|
95c7a091f5
|
feat: Flask API增加asset_type参数支持类型验证
新功能:
- /api/v1/ohlcv 接口新增可选 asset_type 参数
- 用于验证code与指定类型是否匹配
- 类型不匹配时返回400错误并说明
API文档更新:
- endpoints 添加 asset_type 参数说明
- 新增 asset_types 字段说明各类型含义
使用示例:
- /api/v1/ohlcv?code=000300.SH (自动检测)
- /api/v1/ohlcv?code=000300.SH&asset_type=china_index (验证类型)
- /api/v1/ohlcv?code=513100.SH&asset_type=us_index (类型不匹配报错)
|
2026-05-12 23:32:08 +08:00 |
|
|
|
fb755fc31e
|
refactor: 加密货币默认不缓存,简化分层缓存策略
问题:
- 加密货币分钟级数据量大,不适合全量缓存
- 原分层策略过于复杂
优化方案:
- 日级别数据(股票/指数/ETF/期货): 缓存全量数据,切片返回
- 加密货币: 每次实时下载,不缓存
代码简化:
- 删除 CRYPTO_CACHE_DAYS 配置
- 删除 _get_crypto_cache_start 函数
- _fetch_full_data_cached: 加密货币直接返回None
- fetch_data_with_ttl: 加密货币分支直接下载
优势:
- 日级别数据:减少重复下载
- 加密货币:避免内存爆炸,实时获取最新价格
|
2026-05-12 23:27:44 +08:00 |
|
|
|
1d3483bc02
|
feat: DEFAULT_START_DATE改为1980-01-01支持最长历史数据
数据历史深度调研:
- YFinance 标普500: 1980-01-02 (45年, 11685条)
- YFinance 日经225: 1980-01-04 (45年, 11396条)
- YFinance 纳斯达克100: 1985-10-01 (40年, 10232条)
- YFinance 恒生指数: 1986-12-31 (38年, 9712条)
- Tushare 沪深300: 2005-01-04 (21年, 5183条)
修改:
- DEFAULT_START_DATE: '2015-01-01' -> '1980-01-01'
- 支持最长45年的历史数据下载
- A股数据会在数据源端自动截取有效范围
|
2026-05-12 23:03:37 +08:00 |
|
|
|
4cee249823
|
feat: 优化缓存策略 - 全量数据缓存 + 按日期切片
缓存策略改进:
- Key改为(code, today_date):每天缓存一次全量数据
- 下载全量数据:从DEFAULT_START_DATE(2015-01-01)到今天
- 返回时切片:从缓存数据中按start-end范围切片返回
新增功能:
- DEFAULT_START_DATE配置项(可通过环境变量覆盖)
- _fetch_full_data_cached:缓存全量数据
- _slice_data_from_cache:从缓存切片指定日期范围
优势:
- 同一天内不同日期范围请求不会重复下载
- 第二天请求自动更新缓存(today_date变化)
- 减少对外部数据源的请求次数
修改文件:
- datasource/flask_server.py
|
2026-05-12 22:47:03 +08:00 |
|
|
|
5c98b1cb6a
|
refactor: SSH密钥移到根目录,删除config目录
迁移内容:
- config/hk_ecs.pem → hk_ecs.pem(根目录)
- 删除 config 目录(无其他内容)
路径更新:
- datasource/flask_server.py:默认路径改为 hk_ecs.pem
- strategies/rotation/config.yaml:SSH配置路径
- docker-compose.yml:挂载路径
- build-and-push.sh:示例命令
- README.md:项目结构说明
设计原则:敏感文件集中放在根目录
- .env:环境变量
- hk_ecs.pem:SSH密钥
|
2026-05-12 22:31:43 +08:00 |
|
|
|
70515ab169
|
fix: SSH密钥路径从根目录迁移到config目录
修改内容:
1. datasource/flask_server.py
- 默认路径从 'hk_ecs.pem' 改为 'config/hk_ecs.pem'
2. docker-compose.yml
- 挂载路径从 './hk_ecs.pem:/app/hk_ecs.pem'
- 改为 './config/hk_ecs.pem:/app/config/hk_ecs.pem'
3. build-and-push.sh
- 示例命令中的路径同步更新
4. README.md
- 项目结构说明中更新密钥位置
验证:
- rotation.yaml 已使用 config/hk_ecs.pem(无需修改)
- flask_server 默认路径正确指向 config/hk_ecs.pem
- 密钥文件存在于 config/hk_ecs.pem
|
2026-05-12 22:02:35 +08:00 |
|
|
|
16affb2368
|
feat: fetch_etf_with_nav 返回历史溢价率序列
修改内容:
1. universal_fetcher.py
- fetch_etf_with_nav 返回三值:(price_df, nav_df, premium_series)
- 新增 _calculate_premium_series 方法:计算每一天的溢价率
- 溢价率 = (ETF收盘价 - ETF净值) / ETF净值
- 净值用ffill对齐价格日期(处理T+1延迟)
2. flask_server.py
- /api/v1/etf/nav 端点返回历史溢价率序列
- 添加 premium_series 字段:[{date, premium}]
- 添加 latest_premium: 最新溢价率
- 添加 premium_stats: 统计数据(mean/std/min/max/median)
测试结果(513100.SH 纳指100 ETF):
- 价格数据: 8条
- 净值数据: 8条
- 溢价率序列: 8条
- 最新溢价率: 0.1500%
- 溢价率均值: 1.1433%
- 溢价率范围: 0.15% ~ 1.69%
|
2026-05-12 21:39:07 +08:00 |
|
|
|
4e3aac5e0e
|
feat: Flask统一数据服务迁移(分层架构)
架构设计:
- 对外统一接口 fetch():自动识别资产类型并路由
- 对内分层实现:各资产类型独立方法,职责单一
新增文件:
- datasource/universal_fetcher.py: 统一数据获取器
- _fetch_china_index: A股指数(Tushare)
- _fetch_china_etf: A股ETF(含净值)
- _fetch_us_index: 美股指数(YFinance+SSH)
- _fetch_hk_index: 港股指数(YFinance+SSH)
- _fetch_futures: 期货(Tushare/YFinance)
- fetch_etf_with_nav: ETF价格+净值(计算溢价率)
- datasource/asset_type_detector.py: 资产类型检测器
- AssetType枚举:9种资产类型
- detect(): 自动识别资产类型
- group_by_type(): 批量分组
- datasource/flask_server.py: Flask API服务
- LRU + TTL 双缓存机制
- 8个API端点:ohlcv、etf/nav、batch、cache等
更新:
- datasource/__init__.py: 导出新模块
验证:
- 模块导入成功
- 资产类型检测正确
- A股数据获取正常(沪深300: 5条)
|
2026-05-12 21:33:19 +08:00 |
|