Install
openclaw skills install market-data-hubProvides multi-source real-time and historical Chinese stock market data with auto rate limiting, failover, and technical indicator calculations.
openclaw skills install market-data-hub一个功能强大的股票行情数据获取技能,支持多数据源、自动限流、故障切换和技术指标计算。
多数据源支持
智能限流与重试
自动故障切换
丰富的技术指标
pip install -r requirements.txt
主要依赖:
akshare>=1.10.0 - AKShare数据接口baostock>=0.8.8 - Baostock数据接口pandas>=1.5.0 - 数据处理requests>=2.28.0 - HTTP请求from src import MarketDataHub
# 创建实例
hub = MarketDataHub()
# 获取实时行情
quote = hub.get_realtime_quote('300502') # 新易盛
print(f"当前价格: {quote['price']}")
print(f"涨跌幅: {quote['change_pct']}%")
# 获取K线数据
df = hub.get_kline('300502', period='day', start_date='2024-01-01')
print(df.head())
hub = MarketDataHub(
rate_limits=None, # 自定义限流配置
source_priority=None, # 数据源优先级
enable_rate_limit=True, # 是否启用限流
enable_retry=True, # 是否启用重试
enable_circuit_breaker=True # 是否启用熔断器
)
quote = hub.get_realtime_quote(
symbol='300502', # 股票代码
source='auto' # 数据源:'auto', 'tencent', 'akshare', 'baostock'
)
返回数据示例:
{
"symbol": "300502",
"name": "新易盛",
"price": 125.80,
"change": 5.20,
"change_pct": 4.31,
"volume": 15234500,
"amount": 1914829000,
"open": 120.50,
"high": 128.00,
"low": 119.80,
"pre_close": 120.60,
"timestamp": "2024-01-15T10:30:00",
"source": "tencent"
}
df = hub.get_kline(
symbol='300502',
period='day', # 周期:'day', 'week', 'month'
start_date='2024-01-01',
end_date='2024-03-01',
source='auto'
)
quotes = hub.get_batch_quotes(
symbols=['300502', '600519', '000858'],
source='tencent'
)
flow = hub.get_capital_flow('300502')
print(f"主力净流入: {flow['main_inflow']}")
print(f"散户净流入: {flow['retail_inflow']}")
df = hub.get_lhb_data(trade_date='2024-01-15')
# 计算MA5, MA10, MA20, MA60
df = hub.calculate_ma(df, periods=[5, 10, 20, 60])
# 计算EMA
df = hub.calculate_ma(df, periods=[12, 26], ma_type='ema')
# 计算WMA
df = hub.calculate_ma(df, periods=[10], ma_type='wma')
df = hub.calculate_macd(
df,
fast_period=12,
slow_period=26,
signal_period=9
)
# 输出列: MACD_DIF, MACD_DEA, MACD_HIST, MACD_golden_cross, MACD_death_cross
df = hub.calculate_rsi(df, period=14)
# 输出列: RSI, RSI_oversold, RSI_overbought
df = hub.calculate_bollinger_bands(
df,
period=20,
std_multiplier=2.0
)
# 输出列: BB_MIDDLE, BB_UPPER, BB_LOWER, BB_WIDTH, BB_percent_b
df = hub.calculate_kdj(df, n_period=9)
# 输出列: KDJ_K, KDJ_D, KDJ_J, KDJ_golden_cross, KDJ_death_cross
df = hub.get_all_indicators(df)
# 包含所有上述指标
默认限流配置:
rate_limits = {
'akshare': {'rate': 0.5, 'capacity': 10}, # 每2秒1次,突发10次
'tencent': {'rate': 2.0, 'capacity': 20}, # 每秒2次,突发20次
'baostock': {'rate': 1.0, 'capacity': 10} # 每秒1次,突发10次
}
hub = MarketDataHub(rate_limits=rate_limits)
默认优先级:['baostock', 'tencent', 'akshare']
# 使用默认优先级
hub = MarketDataHub()
# 或自定义优先级
hub = MarketDataHub(
source_priority=['baostock', 'tencent', 'akshare']
)
# 自动模式下按优先级尝试
quote = hub.get_realtime_quote('300502', source='auto')
stats = hub.get_usage_stats()
print(f"腾讯请求次数: {stats['requests']['tencent']}")
print(f"失败次数: {stats['failures']['tencent']}")
# 运行所有测试
python -m pytest tests/ -v
# 运行特定测试
python tests/test_market_data_hub.py
python tests/test_strategies.py
python tests/test_limiter.py
python tests/test_indicators.py
market-data-hub/
├── SKILL.md # 本文件
├── requirements.txt # 依赖包
├── example.py # 示例脚本
├── src/
│ ├── __init__.py
│ ├── market_data_hub.py # 主入口类
│ ├── strategies/
│ │ ├── __init__.py
│ │ ├── base_strategy.py # 策略基类
│ │ ├── akshare_strategy.py
│ │ ├── tencent_strategy.py
│ │ └── baostock_strategy.py
│ ├── limiter/
│ │ ├── __init__.py
│ │ └── token_bucket.py # 漏斗桶限流
│ ├── retry/
│ │ ├── __init__.py
│ │ └── retry_strategy.py # 重试策略
│ └── indicators/
│ ├── __init__.py
│ ├── moving_average.py
│ ├── macd.py
│ ├── rsi.py
│ ├── bollinger.py
│ └── kdj.py
└── tests/
├── test_market_data_hub.py
├── test_strategies.py
├── test_limiter.py
└── test_indicators.py
数据源可用性
pip install aksharepip install baostock网络限制
数据质量
默认优先级
股票代码格式
'300502''sz300502', 'sh600519'MIT License