fix(api_pro_bar): 使用 Tushare 原始字段名

删除 turnover_rate/volume_ratio 到 tor/vr 的不必要重命名,
直接使用 Tushare API 返回的原始字段名。
This commit is contained in:
2026-03-02 01:05:15 +08:00
parent b461a4940d
commit e8158a8d59
3 changed files with 406 additions and 18 deletions

View File

@@ -167,11 +167,57 @@ if "date" in data.columns:
- 格式:`{code}.{exchange}`,如 `000001.SZ``600000.SH`
- 确保返回的 DataFrame 包含 `ts_code`
### 4.5 令牌桶限速要求
### 4.5 字段名规范(重要)
**必须使用 Tushare API 返回的原始字段名,禁止进行不必要的重命名。**
这是为了确保:
- 代码可读性:使用 API 文档中的标准字段名
- 维护简单性:避免因字段名映射导致的混淆和错误
- 数据一致性:数据库字段名与 API 返回字段名保持一致
**禁止做法**(以下代码是不允许的):
```python
# 错误:将 Tushare 的原始字段名改为自定义名称
column_mapping = {
"turnover_rate": "tor", # 不要这样做
"volume_ratio": "vr", # 不要这样做
}
data = data.rename(columns=column_mapping)
```
**正确做法**(直接使用原始字段名):
```python
# 正确:保留 Tushare 返回的原始字段名
# Tushare 返回 'turnover_rate',就直接使用 'turnover_rate'
# Tushare 返回 'volume_ratio',就直接使用 'volume_ratio'
# 表结构定义应使用原始字段名
TABLE_SCHEMA = {
"ts_code": "VARCHAR(16) NOT NULL",
"trade_date": "DATE NOT NULL",
"turnover_rate": "DOUBLE", # 使用原始字段名
"volume_ratio": "DOUBLE", # 使用原始字段名
# ... 其他字段
}
```
**例外情况**(允许重命名):
- 日期字段:如果 API 返回 `date`,应重命名为 `trade_date` 以符合项目规范
- 必须重命名的情况:如果两个不同 API 返回相同含义但不同名称的字段,需要统一命名
**教训**(真实案例):
`api_pro_bar.py` 早期版本将 `turnover_rate` 重命名为 `tor``volume_ratio` 重命名为 `vr`
导致:
1. 代码与 Tushare 文档不一致,增加学习成本
2. 数据库字段名与 API 字段名不一致,造成混淆
3. 需要额外的数据迁移脚本修复历史数据
### 4.6 令牌桶限速要求
所有 API 调用必须通过 `TushareClient`,自动满足令牌桶限速要求。
#### 4.5.1 基本用法(单线程场景)
#### 4.6.1 基本用法(单线程场景)
```python
from src.data.client import TushareClient
@@ -198,7 +244,7 @@ def get_{data_type}(...) -> pd.DataFrame:
- API 重试逻辑(指数退避)
- 配置加载
#### 4.5.2 多线程/并发场景(重要)
#### 4.6.2 多线程/并发场景(重要)
**问题**: 多线程并发调用时,如果每个线程创建独立的 `TushareClient` 实例,每个实例会有独立的限流器,导致实际并发请求数 = 线程数 × 单个限流器速率,**限流失效**。

View File

@@ -2,8 +2,8 @@
Fetch A-share stock market data with adjustment factors from Tushare.
This interface provides backward-adjusted (后复权) daily market data
including all available fields: base price data, turnover rate (tor),
volume ratio (vr), and adjustment factors.
including all available fields: base price data, turnover rate (turnover_rate),
volume ratio (volume_ratio), and adjustment factors.
"""
import pandas as pd
@@ -61,8 +61,8 @@ def get_pro_bar(
- pct_chg: Price change percentage
- vol: Trading volume (lots)
- amount: Trading amount (thousand CNY)
- tor: Turnover rate (if factors includes 'tor')
- vr: Volume ratio (if factors includes 'vr')
- turnover_rate: Turnover rate (if factors includes 'tor')
- volume_ratio: Volume ratio (if factors includes 'vr')
- adj_factor: Adjustment factor (if adjfactor=True)
- ma_X: Moving average price for period X (if ma specified)
- ma_v_X: Moving average volume for period X (if ma specified)
@@ -123,14 +123,6 @@ def get_pro_bar(
if "date" in data.columns:
data = data.rename(columns={"date": "trade_date"})
# Rename columns to match database schema
# Tushare API uses 'turnover_rate' and 'volume_ratio', but our DB uses 'tor' and 'vr'
column_mapping = {
"turnover_rate": "tor",
"volume_ratio": "vr",
}
data = data.rename(columns=column_mapping)
return data
@@ -138,7 +130,7 @@ class ProBarSync(StockBasedSync):
"""Pro Bar 数据批量同步管理器,支持全量/增量同步。
继承自 StockBasedSync使用多线程按股票并发获取数据。
默认获取全部数据列tor, vr, adj_factor
默认获取全部数据列turnover_rate, volume_ratio, adj_factor
Example:
>>> sync = ProBarSync()
@@ -162,8 +154,8 @@ class ProBarSync(StockBasedSync):
"pct_chg": "DOUBLE",
"vol": "DOUBLE",
"amount": "DOUBLE",
"tor": "DOUBLE",
"vr": "DOUBLE",
"turnover_rate": "DOUBLE",
"volume_ratio": "DOUBLE",
"adj_factor": "DOUBLE",
}