stock-analysis / API_USAGE_GUIDE.md
fromozu's picture
Auto-deploy from GitHub Actions - 6ea75c7
a105470 verified
# 股票分析系统 API 使用指南
## 概述
本指南详细介绍如何使用股票分析系统的RESTful API接口,包括认证、请求格式、响应处理和错误处理等。
## 快速开始
### 1. 获取API密钥
联系系统管理员获取API密钥,或使用默认测试密钥:
```
X-API-Key: UZXJfw3YNX80DLfN
```
### 2. 基础请求格式
所有API请求都需要包含以下头部:
```http
Content-Type: application/json
X-API-Key: your_api_key_here
```
### 3. 基础URL
```
http://your-domain.com/api/v1
```
## 核心API端点
### 1. 投资组合分析
**端点**: `POST /api/v1/portfolio/analyze`
**功能**: 分析投资组合的整体表现和风险
**请求示例**:
```bash
curl -X POST "http://localhost:8888/api/v1/portfolio/analyze" \
-H "Content-Type: application/json" \
-H "X-API-Key: UZXJfw3YNX80DLfN" \
-d '{
"stocks": [
{
"stock_code": "000001.SZ",
"weight": 0.4,
"market_type": "A"
},
{
"stock_code": "600000.SH",
"weight": 0.6,
"market_type": "A"
}
],
"analysis_params": {
"risk_preference": "moderate",
"time_horizon": "medium"
}
}'
```
**响应示例**:
```json
{
"success": true,
"data": {
"portfolio_score": 75.5,
"risk_level": "中等风险",
"risk_analysis": {
"volatility_risk": 65.2,
"concentration_risk": 45.8,
"correlation_risk": 55.3,
"overall_risk_score": 55.4
},
"recommendations": [
"投资组合表现良好,可适当调整优化",
"根据您的保守风险偏好,建议降低组合风险"
],
"individual_stocks": [
{
"stock_code": "000001.SZ",
"stock_name": "平安银行",
"score": 78.2,
"weight": 0.4,
"contribution": 31.28,
"risk_level": "中等",
"recommendation": "买入"
}
]
},
"meta": {
"analysis_time": "2025-01-03T10:30:00Z",
"processing_time_ms": 1250,
"cache_hit": false
}
}
```
### 2. 个股分析
**端点**: `POST /api/v1/stock/analyze`
**功能**: 分析单只股票的详细信息
**请求示例**:
```bash
curl -X POST "http://localhost:8888/api/v1/stock/analyze" \
-H "Content-Type: application/json" \
-H "X-API-Key: UZXJfw3YNX80DLfN" \
-d '{
"stock_code": "000001.SZ",
"market_type": "A",
"analysis_depth": "full",
"include_ai_analysis": true
}'
```
**响应示例**:
```json
{
"success": true,
"data": {
"stock_info": {
"stock_code": "000001.SZ",
"stock_name": "平安银行",
"industry": "银行",
"market_type": "A"
},
"analysis_result": {
"overall_score": 78.5,
"technical_score": 75.2,
"fundamental_score": 82.1,
"capital_flow_score": 77.8
},
"technical_analysis": {
"trend": "上升",
"support_levels": [12.50, 12.20],
"resistance_levels": [13.80, 14.20],
"indicators": {
"rsi": 65.2,
"macd_signal": "买入",
"ma_trend": "多头排列"
}
},
"fundamental_analysis": {
"pe_ratio": 5.8,
"pb_ratio": 0.65,
"roe": 12.5,
"debt_ratio": 45.2
},
"risk_assessment": {
"risk_level": "中等",
"volatility": 25.3,
"total_risk_score": 45.2
},
"ai_analysis": {
"summary": "该股票基本面良好,技术面呈现上升趋势...",
"recommendation": "建议买入",
"confidence": 0.85
}
}
}
```
### 3. 批量股票评分
**端点**: `POST /api/v1/stocks/batch-score`
**功能**: 批量分析多只股票的评分
**请求示例**:
```bash
curl -X POST "http://localhost:8888/api/v1/stocks/batch-score" \
-H "Content-Type: application/json" \
-H "X-API-Key: UZXJfw3YNX80DLfN" \
-d '{
"stock_codes": ["000001.SZ", "600000.SH", "000002.SZ"],
"market_type": "A",
"min_score": 60,
"sort_by": "score",
"sort_order": "desc"
}'
```
### 4. 异步任务管理
**创建任务**: `POST /api/v1/tasks`
```bash
curl -X POST "http://localhost:8888/api/v1/tasks" \
-H "Content-Type: application/json" \
-H "X-API-Key: UZXJfw3YNX80DLfN" \
-d '{
"task_type": "portfolio_analysis",
"params": {
"stocks": [{"stock_code": "000001.SZ", "weight": 1.0}]
}
}'
```
**查询任务状态**: `GET /api/v1/tasks/{task_id}`
```bash
curl -X GET "http://localhost:8888/api/v1/tasks/your-task-id" \
-H "X-API-Key: UZXJfw3YNX80DLfN"
```
**获取任务结果**: `GET /api/v1/tasks/{task_id}/result`
```bash
curl -X GET "http://localhost:8888/api/v1/tasks/your-task-id/result" \
-H "X-API-Key: UZXJfw3YNX80DLfN"
```
## 认证机制
### 1. API密钥认证(基础)
在请求头中包含API密钥:
```http
X-API-Key: your_api_key_here
```
### 2. HMAC签名认证(高安全级别)
对于敏感操作,使用HMAC签名:
```http
X-API-Key: your_api_key_here
X-HMAC-Signature: hmac_sha256_signature
X-Timestamp: unix_timestamp
```
**HMAC签名生成示例(Python)**:
```python
import hmac
import hashlib
import time
import json
def generate_hmac_signature(data, api_key, secret_key):
timestamp = str(int(time.time()))
# 构建签名数据
sign_data = {**data, 'timestamp': timestamp, 'api_key': api_key}
sign_string = '&'.join(f"{k}={v}" for k, v in sorted(sign_data.items()))
# 生成HMAC签名
signature = hmac.new(
secret_key.encode(),
sign_string.encode(),
hashlib.sha256
).hexdigest()
return signature, timestamp
```
## 错误处理
### 标准错误响应格式
```json
{
"success": false,
"error": {
"code": "ERROR_CODE",
"message": "错误描述",
"details": {
"additional_info": "详细信息"
}
},
"meta": {
"timestamp": "2025-01-03T10:30:00Z",
"request_id": "req_123456789"
}
}
```
### 常见错误代码
| 错误代码 | HTTP状态码 | 描述 |
|---------|-----------|------|
| `MISSING_API_KEY` | 401 | 缺少API密钥 |
| `INVALID_API_KEY` | 403 | 无效的API密钥 |
| `RATE_LIMIT_EXCEEDED` | 429 | 请求频率超限 |
| `INVALID_STOCK_CODE` | 400 | 无效的股票代码 |
| `PORTFOLIO_TOO_LARGE` | 400 | 投资组合过大 |
| `ANALYSIS_FAILED` | 500 | 分析失败 |
| `TASK_NOT_FOUND` | 404 | 任务不存在 |
## 限流策略
### 基础限流
- **免费用户**: 100次/小时
- **付费用户**: 1000次/小时
- **企业用户**: 10000次/小时
### 端点特定限流
- **个股分析**: 50次/小时
- **投资组合分析**: 20次/小时
- **批量评分**: 10次/小时
### 限流响应头
```http
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1641024000
```
## 最佳实践
### 1. 错误重试
```python
import time
import requests
def api_request_with_retry(url, data, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.post(url, json=data, headers=headers)
if response.status_code == 429: # 限流
retry_after = int(response.headers.get('Retry-After', 60))
time.sleep(retry_after)
continue
return response
except requests.RequestException as e:
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt) # 指数退避
```
### 2. 批量处理
```python
def batch_analyze_stocks(stock_codes, batch_size=10):
results = []
for i in range(0, len(stock_codes), batch_size):
batch = stock_codes[i:i + batch_size]
response = requests.post(
f"{base_url}/api/v1/stocks/batch-score",
json={"stock_codes": batch},
headers=headers
)
if response.status_code == 200:
batch_results = response.json()['data']['results']
results.extend(batch_results)
time.sleep(1) # 避免触发限流
return results
```
### 3. 缓存利用
```python
import hashlib
import json
def get_cache_key(request_data):
data_str = json.dumps(request_data, sort_keys=True)
return hashlib.md5(data_str.encode()).hexdigest()
def cached_api_request(url, data, cache_ttl=300):
cache_key = get_cache_key(data)
# 检查缓存
cached_result = cache.get(cache_key)
if cached_result:
return cached_result
# 发送请求
response = requests.post(url, json=data, headers=headers)
result = response.json()
# 存储到缓存
if response.status_code == 200:
cache.set(cache_key, result, ttl=cache_ttl)
return result
```
## 健康检查
**端点**: `GET /api/v1/health`
检查API服务状态:
```bash
curl -X GET "http://localhost:8888/api/v1/health" \
-H "X-API-Key: UZXJfw3YNX80DLfN"
```
## 支持与反馈
如有问题或建议,请联系:
- 邮箱: support@example.com
- 文档: `/api/docs` (Swagger UI)
- 健康检查: `/api/v1/health`