feat(data): Tushare 限速退避 + 新浪兜底(财务 getFinanceReport2022 / 日K 前复权),source+adjust 口径标记
- TushareProvider:频率超限按指数退避重试(不再一次 200/min 即中断),最长等待 30s
- SinaProvider 重构(参考 cc-cursor 公开接口实现):
· 新增财务通道 CompanyFinanceService.getFinanceReport2022(source=gjzb) → FinancialIndicator
(report_date / announce_date=publish_date),与 Tushare fina_indicator schema 一致
· 日 K 保留 jsonp(前复权),统一 UA + 重试
· 不支持方法仍抛 DataSourceNotSupported(复权因子/交易日历/基础信息)
- FailoverProvider 现在可对 daily 与 financial 兜底(CLI _failover_provider 接 SinaProvider)
- DailyBar + stock_daily 表新增 source/adjust 列:新浪兜底行标记 sina/qfq,
Tushare 恢复后 --resume 按同键覆盖回不复权 → 两源格式一致且可追溯
- 迁移 91c4e27a03fb 已生成;执行需在全市场同步结束后:uv run alembic upgrade head
- 测试 34+ 项(新浪财务解析/格式一致/限速退避等)通过
This commit is contained in:
+37
@@ -0,0 +1,37 @@
|
||||
"""stock_daily source/adjust 来源与口径标记
|
||||
|
||||
Revision ID: 91c4e27a03fb
|
||||
Revises: 53113c80257f
|
||||
Create Date: 2026-09-06
|
||||
|
||||
新浪兜底行带 source=sina / adjust=qfq 标记;现有 648 万行回填默认
|
||||
tushare / none(SQLite ADD COLUMN 带常量默认值,不重写现有数据)。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision: str = "91c4e27a03fb"
|
||||
down_revision: str | None = "53113c80257f"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.add_column(
|
||||
"stock_daily",
|
||||
sa.Column("source", sa.String(length=16), nullable=False, server_default="tushare"),
|
||||
)
|
||||
op.add_column(
|
||||
"stock_daily",
|
||||
sa.Column("adjust", sa.String(length=8), nullable=False, server_default="none"),
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_column("stock_daily", "adjust")
|
||||
op.drop_column("stock_daily", "source")
|
||||
@@ -61,6 +61,8 @@ class StockDailyModel(Base):
|
||||
id: Mapped[int] = mapped_column(PK_INT, primary_key=True, autoincrement=True)
|
||||
symbol: Mapped[str] = mapped_column(String(SYMBOL_LEN), index=True)
|
||||
trade_date: Mapped[date] = mapped_column(Date, index=True)
|
||||
source: Mapped[str] = mapped_column(String(16), default="tushare", server_default="tushare")
|
||||
adjust: Mapped[str] = mapped_column(String(8), default="none", server_default="none")
|
||||
open: Mapped[Decimal | None] = mapped_column(Numeric(12, 4), nullable=True)
|
||||
high: Mapped[Decimal | None] = mapped_column(Numeric(12, 4), nullable=True)
|
||||
low: Mapped[Decimal | None] = mapped_column(Numeric(12, 4), nullable=True)
|
||||
|
||||
Reference in New Issue
Block a user