run.py
#!/usr/bin/env python3
"""
AI Quant 项目直接运行程序
"""
import sys
import os
import logging
import argparse
# 添加项目根目录到路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# 配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler("aiquant.log"),
logging.StreamHandler()
]
)
logger = logging.getLogger("AIQuant.run")
def check_dependencies():
"""
检查项目依赖是否已安装
"""
logger.info("检查项目依赖...")
required_packages = [
"vnpy", "numpy", "pandas", "plotly", "pyqtgraph", "PySide6", "zmq",
"qdarkstyle", "talib", "tqdm", "tzlocal", "loguru", "deap", "nbformat",
"akshare", "tushare", "ollama"
]
missing_packages = []
for package in required_packages:
try:
__import__(package)
logger.info(f"✅ 依赖包 {package} 已安装")
except ImportError:
logger.error(f"❌ 依赖包 {package} 未安装")
missing_packages.append(package)
if missing_packages:
logger.error(f"缺失依赖包: {', '.join(missing_packages)}")
logger.error("请运行以下命令安装依赖:")
logger.error("pip install -r requirements.txt --break-system-packages")
return False
logger.info("✅ 所有项目依赖已安装")
return True
def show_project_info():
"""
显示项目信息
"""
logger.info("=" * 50)
logger.info("AI Quant - A 股量化交易框架")
logger.info("=" * 50)
logger.info(f"版本: {__version__}")
logger.info(f"项目路径: {os.path.abspath('.')}")
logger.info(f"Python 版本: {sys.version}")
logger.info("=" * 50)
def run_simple_test():
"""
运行简单测试
"""
logger.info("运行简单测试...")
from core.api.zs_sec import ZSSecConfig
# 测试招商证券接口配置
config = ZSSecConfig(
server_address="180.168.146.187",
port=10100,
account="123456",
password="123456",
broker_code="0000"
)
if config.validate():
logger.info("✅ 招商证券接口配置验证成功")
else:
logger.error("❌ 招商证券接口配置验证失败")
from app.strategy.single_stock import SingleStockAnalyzer
from service.data.mock_data import generate_random_kline_data
# 测试单票量化策略
analyzer = SingleStockAnalyzer()
# 创建测试数据(使用模拟数据生成模块)
data = generate_random_kline_data(
"000001.SZ", "2023-01-01", "2023-12-31", "d")
# 分析股票
result = analyzer.analyze("000001.SZ", data)
logger.info(f"✅ 单票量化策略分析成功:")
logger.info(f" {result}")
logger.info("=" * 50)
def main():
"""
主入口函数
"""
global __version__
__version__ = "1.0.0"
# 解析命令行参数
parser = argparse.ArgumentParser(
description="AI Quant 项目直接运行程序"
)
parser.add_argument(
"--check",
action="store_true",
help="检查项目依赖"
)
parser.add_argument(
"--test",
action="store_true",
help="运行简单测试"
)
parser.add_argument(
"--info",
action="store_true",
help="显示项目信息"
)
parser.add_argument(
"--console",
action="store_true",
help="启动控制台模式"
)
parser.add_argument(
"--gui",
action="store_true",
help="启动图形界面模式"
)
args = parser.parse_args()
logger.info("AI Quant 项目直接运行程序启动")
# 检查依赖
if args.check or not (args.test or args.info or args.console or args.gui):
if not check_dependencies():
return 1
# 显示项目信息
if args.info or not (args.test or args.console or args.gui):
show_project_info()
# 运行测试
if args.test or not (args.console or args.gui):
run_simple_test()
# 启动控制台模式
if args.console:
logger.info("启动控制台模式...")
from app.console import run_console
return run_console()
# 启动图形界面模式
if args.gui:
logger.info("启动图形界面模式...")
from app.main import run_gui
return run_gui()
# 如果没有指定任何模式,显示帮助信息
if not (args.check or args.test or args.info or args.console or args.gui):
parser.print_help()
return 0
return 0
if __name__ == "__main__":
try:
sys.exit(main())
except KeyboardInterrupt:
logger.info("程序被用户中断")
sys.exit(0)
except Exception as e:
logger.error(f"程序运行失败: {e}")
logger.exception("详细错误信息:")
sys.exit(1)