这是一个基于Python的量化交易系统,集成了完整的持仓分析功能,包括:
- 持仓数据管理
- 技术分析
- 风险控制
- 可视化报告
- XtQuant集成
- Backtrader 集成: 使用成熟的 Backtrader 回测框架
- 多策略支持: 支持同时回测多个策略
- 参数优化: 自动参数优化和策略选择
- 详细分析: 完整的绩效分析和风险指标
- 持仓查询: 支持从XtQuant获取实时持仓数据
- 风险分析: 计算集中度风险、波动率风险、VaR等指标
- 绩效评估: 分析收益率、最大回撤、夏普比率等
- 可视化报告: 生成图表和PDF报告
- 技术指标: 支持MA、MACD、RSI、KDJ、布林带等指标
- 交易信号: 基于多指标综合评分生成买卖信号
- 趋势分析: 识别多头/空头趋势
- 信号过滤: 支持置信度过滤和风险控制
- 实时数据: 从XtQuant获取持仓和行情数据
- 自动分析: 定期分析持仓并提供交易建议
- 风险监控: 实时监控持仓风险
建议使用 Python 3.11.9
conda create -n py311 python=3.11.9
conda activate py311pip install -r requirements.txt重要依赖说明:
backtrader: 回测框架tushare: 金融数据接口talib-binary: 技术分析库xtquant: 迅投量化交易接口matplotlib: 图表生成pandas: 数据处理numpy: 数值计算
首次使用项目时,需要完成两类配置:.env 环境变量和 config/Config.yaml 账户配置。
# 复制环境变量示例文件
cp .env.example .env
# 编辑 .env 文件,配置数据服务、数据库等运行所需的敏感信息
# 例如:TUSHARE_TOKEN、MYSQL_HOST、MYSQL_USER、MYSQL_PASSWORD 等该文件由 modules/data_service/config.py、utils/environment_manager.py 等模块读取,用于:
TUSHARE_TOKEN:数据采集与指标计算使用MYSQL_*:数据库连接- 其他第三方服务凭证
注意: .env 文件包含敏感信息,不会被提交到Git仓库。请确保只在本地维护。
config/ConfigServer.py 会读取此文件,为 Web/API、策略、演示脚本提供统一的交易环境配置。
关键字段说明:
SIMULATION/PRODUCTION:分别配置仿真与实盘的QMT_PATH、ACCOUNT、NAME等信息toshare_token:与.env中的TUSHARE_TOKEN保持一致,供 Tornado API、XtQuant 模块快速获取DATABASE:当需要以 YAML 方式加载数据库配置时在此维护
如需切换交易环境,只需更新 Config.yaml 并重新运行相关脚本/服务,无需再维护重复的 configs/ConfigServer.py。
python main.py# 持仓分析演示
python demo_position_analysis.py
# XtQuant技术分析演示
python demo_xtquant_analysis.py
# Backtrader 回测演示
python demo_backtrader_example.py
# Backtrader 框架测试
python test_backtrader_framework.py
# 比亚迪策略回测演示
python simple_byd_backtest.py
# 比亚迪策略演示
python demo_byd_strategy.py
# 比亚迪策略简单测试
python test_byd_simple.py启动服务器后,可以访问以下API端点:
GET /api-docs- Swagger UI 界面(交互式 API 文档)GET /api-docs/swagger.json- OpenAPI 规范 JSON
在浏览器中访问 http://localhost:8888/api-docs 即可查看完整的 API 文档。
GET /api/position/analysis?account_id=demo- 获取持仓分析GET /api/position/detail?account_id=demo- 获取持仓明细GET /api/position/report?account_id=demo&type=summary- 生成持仓报告
GET /api/technical/analysis?account_id=demo- 获取技术分析GET /api/technical/signals?account_id=demo&min_confidence=0.7- 获取交易信号GET /api/technical/indicators?symbol=000001.SZ&days=60- 获取技术指标
from modules.tornadoapp.position.position_analyzer import PositionAnalyzer
# 创建分析器
analyzer = PositionAnalyzer(tushare_token)
# 分析持仓
positions_data = [
{
"symbol": "000001.SZ",
"volume": 1000,
"avg_price": 15.50,
"current_price": 16.20
}
]
analysis = analyzer.analyze_positions(positions_data, cash=50000)
print(f"总收益率: {analysis.summary.total_unrealized_pnl_pct:.2f}%")from modules.backtrader_engine import BacktraderEngine, TushareDataFeed, MAStrategy
# 创建回测引擎
engine = BacktraderEngine(initial_cash=1000000, commission=0.001)
# 添加数据源和策略
data_feed = TushareDataFeed(symbol='000001.SZ', start_date='20230101',
end_date='20231231', tushare_token='your_token')
engine.add_data(data_feed)
engine.add_strategy(MAStrategy)
# 运行回测
result = engine.run_backtest()
print(f"总收益率: {result.total_return:.2%}")
print(f"夏普比率: {result.sharpe_ratio:.2f}")from strategies.byd_strategy import BYDStrategy, BYDEnhancedStrategy, BYDConservativeStrategy
# 运行比亚迪策略回测
python simple_byd_backtest.py
# 查看详细说明
# 参考 BYD_STRATEGY_SUMMARY.md 文件from modules.tornadoapp.position.xtquant_position_manager import XtQuantPositionManager
# 创建XtQuant管理器
manager = XtQuantPositionManager(tushare_token)
# 分析持仓
results = await manager.analyze_all_positions("demo_account")
# 获取交易建议
recommendations = manager.generate_trading_recommendations(results)
for rec in recommendations:
print(f"{rec['symbol']}: {rec['action']} (置信度: {rec['confidence']:.2f})")from modules.tornadoapp.position.position_visualizer import PositionVisualizer
# 创建可视化工具
visualizer = PositionVisualizer()
# 生成图表
charts = visualizer.generate_comprehensive_report(analysis)modules/tornadoapp/position/
├── __init__.py # 模块初始化
├── position_analyzer.py # 持仓分析器
├── position_visualizer.py # 可视化工具
├── xtquant_position_manager.py # XtQuant集成
└── position_api.py # API路由
modules/tornadoapp/handler/
├── position_handler.py # 持仓分析API处理器
└── technical_analysis_handler.py # 技术分析API处理器
modules/tornadoapp/model/
└── position_model.py # 持仓数据模型
- 移动平均线: MA5, MA10, MA20, MA60
- MACD: 趋势指标
- RSI: 相对强弱指标
- KDJ: 随机指标
- 布林带: 波动率指标
- 成交量: 量价关系分析
系统基于多指标综合评分生成交易信号:
- 买入信号: 评分 >= 3.0
- 卖出信号: 评分 <= -3.0
- 持有信号: -3.0 < 评分 < 3.0
📊 实盘运行记录: 查看详细记录
实时跟踪系统在真实市场环境中的表现,包括:
- 每日交易记录
- 策略执行情况
- 收益和风险分析
- 经验总结和优化建议
- 本系统提供的分析结果仅供参考,不构成投资建议
- 技术分析存在滞后性,请结合基本面分析
- 投资有风险,入市需谨慎
- 建议在实盘交易前进行充分的回测验证
- 实盘交易涉及真实资金,请务必做好风险控制
def calculate_custom_indicator(self, df: pd.DataFrame) -> float:
"""计算自定义指标"""
close_prices = df['close'].values.astype(np.float64)
# 实现指标计算逻辑
return indicator_valuedef generate_custom_signals(self, indicators: Dict, current_price: float) -> Dict:
"""生成自定义交易信号"""
# 实现信号生成逻辑
return signals本项目采用MySQL数据库,专门为记录市场数据而设计,为未来的量化AI模型准备数据。
- 专注数据存储: 简化设计,专注于市场数据存储和查询
- 支持迅投数据: 完整支持迅投的3秒级别tick数据、分钟级、日线数据
- AI友好: 为机器学习模型提供便捷的数据访问接口
- 高性能: 优化的索引策略和查询性能
- 易于维护: 简单的表结构,清晰的数据管理
stock_basic: 股票基础信息表
tick_data: 3秒级别tick数据minute_data: 分钟级行情数据daily_data: 日线行情数据adj_factor: 复权因子表
technical_indicators: 技术指标表
data_sync_status: 数据同步状态表system_config: 系统配置表
# 一键初始化数据库
python database/init_market_data.py --host localhost --user root --password your_password
# 测试连接
python database/init_market_data.py --test-only --host localhost --user root --password your_passwordfrom database.market_data_manager import MarketDataManager
# 创建数据管理器
manager = MarketDataManager(
host='localhost',
port=3306,
user='market_data_app',
password='app_password',
database='market_data'
)
# 测试连接
if manager.test_connection():
print("✅ 数据库连接成功!")import pandas as pd
# 存储股票基础信息
stocks_data = pd.DataFrame({
'ts_code': ['000001.SZ', '000002.SZ', '600519.SH'],
'symbol': ['000001', '000002', '600519'],
'name': ['平安银行', '万科A', '贵州茅台'],
'industry': ['银行', '房地产', '食品饮料'],
'market': ['主板', '主板', '主板']
})
manager.insert_stock_basic(stocks_data)
# 存储日线数据
daily_data = pd.DataFrame({
'symbol': ['000001.SZ'],
'trade_date': ['2025-01-15'],
'open': [15.50], 'high': [15.80], 'low': [15.40], 'close': [15.70],
'volume': [1000000], 'amount': [15700000], 'pct_chg': [1.29]
})
manager.insert_daily_data(daily_data)
# 存储tick数据
tick_data = pd.DataFrame({
'symbol': ['000001.SZ'] * 100,
'tick_time': pd.date_range('2025-01-15 09:30:00', periods=100, freq='3S'),
'last_price': [15.50 + i * 0.01 for i in range(100)],
'volume': [1000] * 100,
'amount': [15500 + i * 10 for i in range(100)]
})
manager.insert_tick_data(tick_data)# 获取股票列表
stocks = manager.get_stock_list()
print(f"股票总数: {len(stocks)}")
# 获取日线数据
daily_data = manager.get_daily_data('000001.SZ', '2025-01-01', '2025-01-15')
print(f"日线数据条数: {len(daily_data)}")
# 获取tick数据
tick_data = manager.get_tick_data('000001.SZ', '2025-01-15 09:30:00', '2025-01-15 10:00:00')
print(f"tick数据条数: {len(tick_data)}")
# 获取最新价格
latest_price = manager.get_latest_price('000001.SZ')
print(f"平安银行最新价格: {latest_price}")# 获取训练数据
def get_training_data(symbol, start_date, end_date):
"""获取用于AI模型训练的数据"""
# 获取日线数据
daily_data = manager.get_daily_data(symbol, start_date, end_date)
# 获取技术指标
indicators = manager.get_technical_indicators(symbol, start_date, end_date)
# 合并数据
training_data = daily_data.merge(indicators, on=['symbol', 'trade_date'], how='left')
# 计算特征
training_data['price_change'] = training_data['close'].pct_change()
training_data['volume_change'] = training_data['volume'].pct_change()
training_data['ma5_ma20_diff'] = training_data['ma5'] - training_data['ma20']
return training_data
# 获取训练数据
training_data = get_training_data('000001.SZ', '2024-01-01', '2024-12-31')
print(f"训练数据形状: {training_data.shape}")# 导出数据到CSV
csv_file = manager.export_data_to_csv(
symbol='000001.SZ',
data_type='daily',
start_date='2025-01-01',
end_date='2025-01-15',
output_dir='data/export'
)
print(f"数据导出到: {csv_file}")更多详细的使用方法和示例,请参考:
database/MARKET_DATA_GUIDE.md- 完整使用指南database/market_data_manager.py- 数据管理器源码database/market_data_schema.sql- 数据库表结构
本项目仅供学习和研究使用,请勿用于商业用途。
如有问题或建议,请通过以下方式联系:
- 提交Issue
- 发送邮件
- 项目讨论区
扫描下方二维码添加微信好友,交流量化交易经验:
微信号: nzc
地区: 河南 开封
扫描下方二维码加入微信群,与更多量化交易爱好者交流:
群内交流内容:
- 量化策略讨论
- 实盘经验分享
- 技术问题答疑
- 市场行情分析
- 代码优化建议

