AKShare 1.13.0 实现上海期货交易所24品种日频数据自动化采集方案
对于量化交易和金融数据分析而言,获取准确、及时的期货市场数据是构建策略的基础。上海期货交易所作为国内重要的商品期货交易平台,其金属、能源化工等品种的行情数据具有极高的分析价值。本文将介绍如何利用AKShare 1.13.0版本构建一个完整的SHFE数据自动化采集系统。
1. 环境配置与核心工具链
在开始数据采集前,需要确保Python环境已安装以下核心组件:
# 基础环境检查清单 import sys print(f"Python版本: {sys.version}") # 应确保Python版本≥3.8 # 必需库安装命令 """ pip install akshare==1.13.0 pip install pandas>=2.0.0 pip install sqlalchemy>=2.0.0 # 如需数据库存储 """AKShare 1.13.0版本针对期货数据接口进行了多项优化:
- 新增了上海期货交易所的氧化铝期货数据
- 修复了历史数据获取时的时区处理问题
- 优化了数据返回的字段排序逻辑
提示:建议使用虚拟环境管理项目依赖,避免版本冲突。可通过
python -m venv shfe_env创建专属环境。
2. SHFE全品种数据获取实战
上海期货交易所目前上市交易的24个品种可分为四大类:
| 品种类别 | 包含品种 |
|---|---|
| 贵金属 | 黄金、白银 |
| 基本金属 | 铜、铜(BC)、铝、锌、铅、镍、锡、氧化铝 |
| 黑色金属 | 螺纹钢、线材、热轧卷板、不锈钢 |
| 能源化工 | 原油、低硫燃料油、燃料油、石油沥青、丁二烯橡胶、天然橡胶、20号胶、纸浆 |
获取当日全品种行情数据的核心代码如下:
import akshare as ak from datetime import datetime import pandas as pd def get_shfe_daily_all(): """获取SHFE全部品种当日行情""" date_str = datetime.now().strftime('%Y%m%d') try: df = ak.get_shfe_daily(date=date_str) # 数据清洗 df = df[~df['symbol'].str.contains('小计|合计')] # 过滤汇总行 df['date'] = pd.to_datetime(date_str) return df.sort_values('variety') except Exception as e: print(f"数据获取失败: {str(e)}") return pd.DataFrame() # 执行采集 shfe_data = get_shfe_daily_all() if not shfe_data.empty: print(f"成功获取{len(shfe_data['variety'].unique())}个品种数据")3. 数据持久化与异常处理
为保证数据的完整性和可追溯性,建议采用以下存储策略:
本地文件存储方案:
def save_to_csv(data, path='shfe_data'): """按日期分品种保存CSV""" date_str = datetime.now().strftime('%Y%m%d') for variety, group in data.groupby('variety'): filename = f"{path}/{variety}_{date_str}.csv" group.to_csv(filename, index=False, encoding='utf_8_sig') # 数据库存储方案(MySQL示例) def save_to_db(data, table_name='shfe_daily'): from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://user:pass@localhost:3306/futures') data.to_sql(table_name, engine, if_exists='append', index=False)健壮性增强措施:
- 网络异常重试机制
- 数据完整性校验
- 重复数据过滤
def robust_data_fetch(max_retries=3): for i in range(max_retries): try: data = get_shfe_daily_all() if data.empty: raise ValueError("返回数据为空") # 校验关键字段 assert 'close' in data.columns return data except Exception as e: print(f"尝试 {i+1}/{max_retries} 失败: {str(e)}") time.sleep(5) return pd.DataFrame()4. 定时任务与自动化部署
对于需要持续跟踪市场的情况,可配置自动化采集系统:
Windows任务计划程序配置:
- 创建
shfe_collector.py主脚本 - 设置每日15:30(收盘后)执行
- 配置日志输出路径
Linux crontab配置示例:
# 每天下午3点30分执行 30 15 * * * /usr/bin/python3 /path/to/shfe_collector.py >> /var/log/shfe_collector.log 2>&1容器化部署方案(Docker示例):
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "shfe_collector.py"]构建命令:
docker build -t shfe-collector . docker run -d --restart unless-stopped -v ./data:/app/data shfe-collector5. 数据分析应用场景示例
获取的SHFE数据可应用于以下典型场景:
技术指标计算:
def calculate_technical(df): """计算常见技术指标""" df['MA5'] = df['close'].rolling(5).mean() df['MA20'] = df['close'].rolling(20).mean() df['ATR'] = df['high'] - df['low'] # 简化版ATR return df # 按品种应用 technical_data = shfe_data.groupby('variety').apply(calculate_technical)跨品种价差分析:
def analyze_spread(copper, aluminum): """铜铝价差分析""" spread = copper['close'] - aluminum['close'] return { 'mean': spread.mean(), 'max': spread.max(), 'min': spread.min(), 'current': spread.iloc[-1] }实际应用中,这些数据还可用于:
- 量化策略回测
- 基本面分析
- 风险价值(VaR)计算
- 市场流动性监测
通过AKShare获取的标准化数据,研究人员可以快速构建各类分析模型,而无需从零开始处理复杂的数据采集问题。这种自动化的数据解决方案特别适合需要长期跟踪多个品种的机构投资者和专业研究人员。