💡 数据源选择与最佳实践
本章介绍了多个数据源,这里总结实战中的选择策略:
数据源对比表
| 数据源 | 适用场景 | 优势 | 劣势 |
|---|
| **Tushare** | A股研究 | 数据丰富,更新及时 | 需积分 |
| **Baostock** | 历史回测 | 完全免费,历史完整 | 速度慢 |
| **Yfinance** | 美股研究 | 简单易用 | 国内访问慢 |
| **Akshare** | 实时数据 | 免费,更新快 | 稳定性一般 |
统一数据接口设计
class UnifiedDataSource:
"""统一数据接口"""
def __init__(self, source='baostock'):
self.source = source
self._init_source()
def get_daily(self, code, start, end):
"""统一日线接口"""
if self.source == 'baostock':
return self._get_baostock(code, start, end)
elif self.source == 'tushare':
return self._get_tushare(code, start, end)
def _get_baostock(self, code, start, end):
import baostock as bs
bs.login()
rs = bs.query_history_k_data_plus(
code, "date,code,open,high,low,close,volume",
start_date=start, end_date=end
)
# ... 处理返回
数据缓存策略
import pickle
from pathlib import Path
def get_cached_data(code, start, end, cache_dir='cache'):
"""带缓存的数据获取"""
cache_file = Path(cache_dir) / f"{code}_{start}_{end}.pkl"
if cache_file.exists():
with open(cache_file, 'rb') as f:
return pickle.load(f)
data = fetch_data(code, start, end)
cache_file.parent.mkdir(exist_ok=True)
with open(cache_file, 'wb') as f:
pickle.dump(data, f)
return data
数据质量检查
def validate_data(df):
"""数据质量检查"""
checks = {
'缺失值': df.isnull().sum().sum(),
'重复行': df.duplicated().sum(),
'日期连续性': check_date_continuity(df),
'价格合理性': check_price_validity(df)
}
return checks
关键建议:
- 回测优先使用Baostock(免费完整)
- 研究阶段使用Tushare(数据丰富)
- 生产环境缓存数据减少API调用