# sidecar 对外接口说明 ## 1. 模块定位 sidecar 是本项目的 Python 行情数据侧车模块,对外提供统一的数据获取与 DuckDB 缓存接口。调用方可以选择直接调用 Python 服务类,也可以通过 FastAPI HTTP 接口访问。 ## 2. Python 服务接口 ### 2.1 创建默认服务 ```python from sidecar.config import load_config from sidecar.service import create_default_service service = create_default_service(load_config()) ``` #### 输入 无业务输入;配置从环境变量读取: | 环境变量 | 类型 | 默认值 | 说明 | |---|---:|---|---| | `TORTOISE_DUCKDB_PATH` | string | `data/tortoise.duckdb` | DuckDB 数据库文件路径 | | `TORTOISE_SNAPSHOT_TTL_SECONDS` | int | `15` | 行情快照缓存秒数 | | `TORTOISE_REQUEST_TIMEOUT_SECONDS` | int | `8` | 腾讯财经 HTTP 请求超时秒数 | #### 输出 返回 `UnifiedDataService` 实例。 ### 2.2 `get_kline` ```python bars = service.get_kline("600000", period="day", limit=120, refresh=False) ``` #### 输入 | 参数 | 类型 | 必填 | 默认值 | 说明 | |---|---|---:|---|---| | `symbol` | string | 是 | - | 股票代码,支持 `600000`、`sh600000`、`SZ000001` 等格式 | | `period` | string | 否 | `day` | K 线周期,支持 `day/week/month/1m/5m/15m/30m/60m` | | `limit` | int | 否 | `800` | 最大返回条数 | | `refresh` | bool | 否 | `False` | 是否跳过缓存强制刷新 | #### 输出 返回 `list[KlineBar]`,按交易日期升序排列。 | 字段 | 类型 | 说明 | |---|---|---| | `symbol` | string | 标准化股票代码,例如 `sh600000` | | `period` | string | K 线周期 | | `trade_date` | date | 交易日期 | | `open` | float/null | 开盘价 | | `high` | float/null | 最高价 | | `low` | float/null | 最低价 | | `close` | float/null | 收盘价 | | `volume` | float/null | 成交量 | | `amount` | float/null | 成交额 | | `source` | string | 数据源,当前为 `mootdx` | ### 2.3 `get_snapshot` ```python snapshot = service.get_snapshot("600000", refresh=False) ``` #### 输入 | 参数 | 类型 | 必填 | 默认值 | 说明 | |---|---|---:|---|---| | `symbol` | string | 是 | - | 股票代码,支持 `600000`、`sh600000`、`SZ000001` 等格式 | | `refresh` | bool | 否 | `False` | 是否跳过 TTL 缓存强制刷新 | #### 输出 返回 `Snapshot`。 | 字段 | 类型 | 说明 | |---|---|---| | `symbol` | string | 标准化股票代码 | | `name` | string/null | 股票名称 | | `trade_time` | datetime/null | 行情时间 | | `price` | float/null | 最新价 | | `previous_close` | float/null | 昨收价 | | `open` | float/null | 开盘价 | | `high` | float/null | 最高价 | | `low` | float/null | 最低价 | | `volume` | float/null | 成交量 | | `amount` | float/null | 成交额 | | `change` | float/null | 涨跌额 | | `change_percent` | float/null | 涨跌幅百分比 | | `turnover_rate` | float/null | 换手率 | | `pe_ttm` | float/null | 滚动市盈率 | | `pe_static` | float/null | 静态市盈率 | | `pb` | float/null | 市净率 | | `market_cap` | float/null | 总市值 | | `float_market_cap` | float/null | 流通市值 | | `limit_up` | float/null | 涨停价 | | `limit_down` | float/null | 跌停价 | | `source` | string | 实际命中的数据源,通常为 `tencent` 或 `mootdx` | ## 3. HTTP 接口 启动命令: ```bash uvicorn sidecar.api:app --host 127.0.0.1 --port 8765 ``` ### 3.1 健康检查 ```http GET /health ``` #### 输入 无。 #### 输出 ```json { "status": "ok" } ``` ### 3.2 获取 K 线 ```http GET /kline/{symbol}?period=day&limit=800&refresh=false ``` #### 输入 | 参数 | 位置 | 类型 | 必填 | 默认值 | 说明 | |---|---|---|---:|---|---| | `symbol` | path | string | 是 | - | 股票代码 | | `period` | query | string | 否 | `day` | K 线周期 | | `limit` | query | int | 否 | `800` | 返回条数,范围 `1..800` | | `refresh` | query | bool | 否 | `false` | 是否强制刷新 | #### 输出 ```json { "data": [ { "symbol": "sh600000", "period": "day", "trade_date": "2026-06-23", "open": 10.0, "high": 10.5, "low": 9.8, "close": 10.2, "volume": 1000000.0, "amount": 10200000.0, "source": "mootdx" } ] } ``` ### 3.3 获取行情快照 ```http GET /snapshot/{symbol}?refresh=false ``` #### 输入 | 参数 | 位置 | 类型 | 必填 | 默认值 | 说明 | |---|---|---|---:|---|---| | `symbol` | path | string | 是 | - | 股票代码 | | `refresh` | query | bool | 否 | `false` | 是否强制刷新 | #### 输出 ```json { "data": { "symbol": "sh600000", "name": "浦发银行", "trade_time": "2026-06-23T15:00:00", "price": 10.5, "previous_close": 10.0, "open": 10.1, "high": 10.6, "low": 9.9, "volume": 1000000.0, "amount": 10500000.0, "change": 0.5, "change_percent": 5.0, "turnover_rate": 1.2, "pe_ttm": 6.7, "pe_static": 7.8, "pb": 0.66, "market_cap": 1000.0, "float_market_cap": 800.0, "limit_up": 11.0, "limit_down": 9.0, "source": "tencent" } } ``` ## 4. 缓存行为 - K 线缓存表:`md.kline_bars`,主键为 `symbol + period + trade_date`。 - 快照缓存表:`md.snapshots`,主键为 `symbol`,使用 `expires_at` 控制 TTL。 - `refresh=false` 时优先使用缓存;`refresh=true` 时跳过缓存并重新拉取。 - 快照数据源按顺序降级:腾讯财经失败后回退 mootdx。 ## 5. 注意事项 - 当前 K 线底层依赖 mootdx,第一次连接可能触发 mootdx 自动测速。 - 腾讯财经 PB 字段使用索引 `46`,索引 `43` 是振幅,不可作为 PB 使用。 - 策略模块建议只依赖本文件描述的统一接口,不直接依赖 mootdx 或腾讯财经字段。 ## 6. 真实数据源测试 默认单元测试不访问外网。需要验证 mootdx 与腾讯财经真实接口时,先安装依赖,再显式开启环境变量: ```bash pip install -e .[test] RUN_REAL_MARKET_TESTS=1 pytest tests/test_real_sources.py -vv ``` Windows PowerShell 示例: ```powershell $env:RUN_REAL_MARKET_TESTS = "1" python -m pytest tests/test_real_sources.py -vv ``` 真实测试用例: - `3-1`:腾讯财经真实快照接口返回有效价格。 - `3-2`:mootdx 真实 K 线接口返回至少一条日线。 - `3-3`:统一服务使用真实数据源写入并读取 DuckDB 缓存。