update: 融合本地成果物到 jiangwei-platform
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
"""
|
||||
基础设施环境检查报告
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
import platform
|
||||
import importlib
|
||||
from typing import Dict, List, Tuple
|
||||
from loguru import logger
|
||||
|
||||
|
||||
def check_python_version() -> Tuple[bool, str]:
|
||||
"""检查 Python 版本"""
|
||||
version = sys.version
|
||||
major, minor = sys.version_info[:2]
|
||||
is_ok = major >= 3 and minor >= 8
|
||||
status = "✅" if is_ok else "❌"
|
||||
message = f"{status} Python 版本: {version}"
|
||||
if not is_ok:
|
||||
message += " (需要 Python 3.8+)"
|
||||
return is_ok, message
|
||||
|
||||
|
||||
def check_dependencies() -> List[Tuple[bool, str]]:
|
||||
"""检查依赖包"""
|
||||
dependencies = [
|
||||
("numpy", "2.0.0"),
|
||||
("pandas", "2.0.0"),
|
||||
("sqlalchemy", "2.0.0"),
|
||||
("loguru", "0.7.0"),
|
||||
("pydantic", "2.0.0"),
|
||||
("fastapi", "0.100.0"),
|
||||
("uvicorn", "0.20.0"),
|
||||
]
|
||||
|
||||
results = []
|
||||
for package, min_version in dependencies:
|
||||
try:
|
||||
module = importlib.import_module(package)
|
||||
version = getattr(module, "__version__", "未知")
|
||||
is_ok = True # 简化检查,实际应该比较版本
|
||||
status = "✅" if is_ok else "⚠️"
|
||||
results.append((is_ok, f"{status} {package}: {version}"))
|
||||
except ImportError:
|
||||
results.append((False, f"❌ {package}: 未安装"))
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def check_directories() -> List[Tuple[bool, str]]:
|
||||
"""检查目录结构"""
|
||||
dirs = [
|
||||
"vnpy_project/logs",
|
||||
"vnpy_project/data",
|
||||
"vnpy_project/strategies",
|
||||
"vnpy_project/backup",
|
||||
"logs",
|
||||
]
|
||||
|
||||
results = []
|
||||
for dir_path in dirs:
|
||||
exists = os.path.exists(dir_path) and os.path.isdir(dir_path)
|
||||
status = "✅" if exists else "❌"
|
||||
results.append((exists, f"{status} 目录: {dir_path}"))
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def check_virtual_environment() -> Tuple[bool, str]:
|
||||
"""检查虚拟环境"""
|
||||
in_venv = hasattr(sys, 'real_prefix') or (
|
||||
hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix
|
||||
)
|
||||
status = "✅" if in_venv else "⚠️"
|
||||
message = f"{status} 虚拟环境: {'已激活' if in_venv else '未激活 (建议使用虚拟环境)'}"
|
||||
return in_venv, message
|
||||
|
||||
|
||||
def check_system_info() -> Dict[str, str]:
|
||||
"""获取系统信息"""
|
||||
return {
|
||||
"系统": platform.system(),
|
||||
"系统版本": platform.version(),
|
||||
"架构": platform.machine(),
|
||||
"处理器": platform.processor(),
|
||||
}
|
||||
|
||||
|
||||
def generate_report():
|
||||
"""生成环境检查报告"""
|
||||
logger.info("=" * 60)
|
||||
logger.info(" 量化交易系统 - 基础设施环境检查报告")
|
||||
logger.info("=" * 60)
|
||||
|
||||
# 系统信息
|
||||
logger.info("\n📊 系统信息:")
|
||||
system_info = check_system_info()
|
||||
for key, value in system_info.items():
|
||||
logger.info(f" {key}: {value}")
|
||||
|
||||
# 虚拟环境
|
||||
logger.info("\n🔧 环境状态:")
|
||||
_, venv_msg = check_virtual_environment()
|
||||
logger.info(f" {venv_msg}")
|
||||
|
||||
# Python 版本
|
||||
_, py_msg = check_python_version()
|
||||
logger.info(f" {py_msg}")
|
||||
|
||||
# 依赖检查
|
||||
logger.info("\n📦 依赖包检查:")
|
||||
dep_results = check_dependencies()
|
||||
for _, msg in dep_results:
|
||||
logger.info(f" {msg}")
|
||||
|
||||
# 目录检查
|
||||
logger.info("\n📂 目录结构检查:")
|
||||
dir_results = check_directories()
|
||||
for _, msg in dir_results:
|
||||
logger.info(f" {msg}")
|
||||
|
||||
# 汇总
|
||||
all_checks = dep_results + dir_results + [check_python_version()]
|
||||
passed = sum(1 for ok, _ in all_checks if ok)
|
||||
total = len(all_checks)
|
||||
|
||||
logger.info("\n" + "=" * 60)
|
||||
logger.info(f"📈 检查结果: {passed}/{total} 项通过")
|
||||
if passed == total:
|
||||
logger.info("🎉 恭喜!所有检查项都通过了,环境准备就绪!")
|
||||
else:
|
||||
logger.warning("⚠️ 部分检查项未通过,请根据提示修复")
|
||||
logger.info("=" * 60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 配置日志
|
||||
logger.remove()
|
||||
logger.add(sys.stderr, format="<level>{message}</level>")
|
||||
|
||||
generate_report()
|
||||
@@ -0,0 +1,60 @@
|
||||
"""
|
||||
数据库配置文件
|
||||
支持 SQLite(方案零)和 PostgreSQL(方案一)
|
||||
"""
|
||||
import os
|
||||
from typing import Optional
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class DatabaseSettings(BaseSettings):
|
||||
"""数据库配置"""
|
||||
|
||||
# 数据库类型: sqlite 或 postgresql
|
||||
db_type: str = "sqlite"
|
||||
|
||||
# SQLite 配置
|
||||
sqlite_path: str = os.path.join(os.path.dirname(__file__), "data", "quant_trading.db")
|
||||
|
||||
# PostgreSQL 配置(方案一使用)
|
||||
postgres_host: str = "localhost"
|
||||
postgres_port: int = 5432
|
||||
postgres_user: str = "quant_user"
|
||||
postgres_password: str = ""
|
||||
postgres_db: str = "quant_trading"
|
||||
|
||||
# 连接池配置
|
||||
pool_size: int = 5
|
||||
max_overflow: int = 10
|
||||
pool_timeout: int = 30
|
||||
pool_recycle: int = 3600
|
||||
|
||||
# 日志配置
|
||||
echo_sql: bool = False
|
||||
|
||||
class Config:
|
||||
env_prefix = "QUANT_"
|
||||
env_file = ".env"
|
||||
|
||||
def get_database_url(self) -> str:
|
||||
"""获取数据库连接 URL"""
|
||||
if self.db_type == "sqlite":
|
||||
# 确保 SQLite 数据库目录存在
|
||||
os.makedirs(os.path.dirname(self.sqlite_path), exist_ok=True)
|
||||
return f"sqlite:///{self.sqlite_path}"
|
||||
elif self.db_type == "postgresql":
|
||||
return (
|
||||
f"postgresql+psycopg2://{self.postgres_user}:{self.postgres_password}"
|
||||
f"@{self.postgres_host}:{self.postgres_port}/{self.postgres_db}"
|
||||
)
|
||||
else:
|
||||
raise ValueError(f"不支持的数据库类型: {self.db_type}")
|
||||
|
||||
|
||||
# 全局数据库配置实例
|
||||
db_settings = DatabaseSettings()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(f"数据库类型: {db_settings.db_type}")
|
||||
print(f"数据库连接 URL: {db_settings.get_database_url()}")
|
||||
@@ -0,0 +1,57 @@
|
||||
"""
|
||||
量化交易系统 - 主程序入口
|
||||
"""
|
||||
from loguru import logger
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def initialize_system():
|
||||
"""初始化系统"""
|
||||
logger.info("=" * 50)
|
||||
logger.info(" 量化交易系统启动中...")
|
||||
logger.info("=" * 50)
|
||||
|
||||
# 确保必要的目录存在
|
||||
os.makedirs("logs", exist_ok=True)
|
||||
os.makedirs("data", exist_ok=True)
|
||||
os.makedirs("strategies", exist_ok=True)
|
||||
os.makedirs("backup", exist_ok=True)
|
||||
|
||||
logger.info("✅ 系统目录检查完成")
|
||||
|
||||
# 测试数据库连接
|
||||
try:
|
||||
from test_database import test_database_connection
|
||||
if test_database_connection():
|
||||
logger.info("✅ 数据库连接正常")
|
||||
else:
|
||||
logger.warning("⚠️ 数据库连接异常")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 数据库测试失败: {e}")
|
||||
|
||||
logger.info("=" * 50)
|
||||
logger.info(" 量化交易系统初始化完成!")
|
||||
logger.info("=" * 50)
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
# 配置日志
|
||||
logger.add("logs/system_{time}.log", rotation="1 day", level="INFO")
|
||||
|
||||
try:
|
||||
initialize_system()
|
||||
logger.info("🚀 系统准备就绪,等待交易指令...")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logger.info("👋 收到中断信号,系统正在关闭...")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 系统错误: {e}")
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,15 @@
|
||||
# 量化交易系统核心依赖
|
||||
numpy>=2.0.0
|
||||
pandas>=2.0.0
|
||||
sqlalchemy>=2.0.0
|
||||
loguru>=0.7.0
|
||||
pydantic>=2.0.0
|
||||
pydantic-settings>=2.0.0
|
||||
python-dotenv>=1.0.0
|
||||
fastapi>=0.100.0
|
||||
uvicorn>=0.20.0
|
||||
# 可选:数据库连接驱动
|
||||
psycopg2-binary>=2.9.0 # PostgreSQL(方案一可选)
|
||||
cryptography>=41.0.0 # 加密库
|
||||
# 可选:ta-lib(技术分析库)
|
||||
# ta-lib>=0.6.0
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/bin/bash
|
||||
# 量化交易系统环境设置脚本
|
||||
# 使用方法: source setup_env.sh
|
||||
|
||||
# 获取脚本所在目录
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
echo "=========================================="
|
||||
echo " 量化交易系统 - 环境初始化"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 检查虚拟环境是否存在
|
||||
if [ ! -d "vnpy_env" ]; then
|
||||
echo "⚠️ 虚拟环境不存在,正在创建..."
|
||||
python3 -m venv vnpy_env
|
||||
echo "✅ 虚拟环境创建成功"
|
||||
fi
|
||||
|
||||
# 激活虚拟环境
|
||||
echo "🔧 激活虚拟环境..."
|
||||
source vnpy_env/bin/activate
|
||||
|
||||
# 升级 pip
|
||||
echo "🔧 升级 pip..."
|
||||
pip install --upgrade pip -q
|
||||
|
||||
# 检查依赖是否安装
|
||||
if [ ! -f "vnpy_env/.dependencies_installed" ]; then
|
||||
echo "📦 安装项目依赖..."
|
||||
pip install -r requirements.txt
|
||||
touch vnpy_env/.dependencies_installed
|
||||
echo "✅ 依赖安装完成"
|
||||
else
|
||||
echo "✅ 依赖已安装"
|
||||
fi
|
||||
|
||||
# 检查必要的目录结构
|
||||
echo "📂 检查目录结构..."
|
||||
mkdir -p vnpy_project/{logs,data,strategies,backup}
|
||||
echo "✅ 目录结构检查完成"
|
||||
|
||||
# 设置环境变量
|
||||
export QUANT_ENV=development
|
||||
export QUANT_DB_TYPE=sqlite
|
||||
export PYTHONPATH="$SCRIPT_DIR:$PYTHONPATH"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " ✅ 环境初始化完成!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "📌 环境变量已设置:"
|
||||
echo " - QUANT_ENV: $QUANT_ENV"
|
||||
echo " - QUANT_DB_TYPE: $QUANT_DB_TYPE"
|
||||
echo " - PYTHONPATH: $PYTHONPATH"
|
||||
echo ""
|
||||
echo "📌 常用命令:"
|
||||
echo " - 运行系统: python main.py"
|
||||
echo " - 测试数据库: python test_database.py"
|
||||
echo " - 退出虚拟环境: deactivate"
|
||||
echo ""
|
||||
@@ -0,0 +1,92 @@
|
||||
"""
|
||||
数据库连接测试脚本
|
||||
"""
|
||||
from sqlalchemy import create_engine, text
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from database_config import db_settings
|
||||
from loguru import logger
|
||||
import os
|
||||
|
||||
|
||||
def test_database_connection():
|
||||
"""测试数据库连接"""
|
||||
logger.info("开始测试数据库连接...")
|
||||
logger.info(f"数据库类型: {db_settings.db_type}")
|
||||
|
||||
try:
|
||||
# 创建数据库引擎
|
||||
engine = create_engine(
|
||||
db_settings.get_database_url(),
|
||||
echo=db_settings.echo_sql,
|
||||
pool_size=db_settings.pool_size,
|
||||
max_overflow=db_settings.max_overflow,
|
||||
pool_timeout=db_settings.pool_timeout,
|
||||
pool_recycle=db_settings.pool_recycle
|
||||
)
|
||||
|
||||
logger.info("数据库引擎创建成功")
|
||||
|
||||
# 测试连接
|
||||
with engine.connect() as conn:
|
||||
# 执行简单的查询
|
||||
if db_settings.db_type == "sqlite":
|
||||
result = conn.execute(text("SELECT sqlite_version()"))
|
||||
version = result.scalar()
|
||||
logger.info(f"SQLite 版本: {version}")
|
||||
elif db_settings.db_type == "postgresql":
|
||||
result = conn.execute(text("SELECT version()"))
|
||||
version = result.scalar()
|
||||
logger.info(f"PostgreSQL 版本: {version}")
|
||||
|
||||
logger.info("数据库连接测试成功!")
|
||||
|
||||
# 创建测试表
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS test_table (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
"""))
|
||||
conn.commit()
|
||||
logger.info("测试表创建成功")
|
||||
|
||||
# 插入测试数据
|
||||
conn.execute(text("INSERT OR REPLACE INTO test_table (id, name) VALUES (:id, :name)"),
|
||||
{"id": 1, "name": "测试数据"})
|
||||
conn.commit()
|
||||
logger.info("测试数据插入成功")
|
||||
|
||||
# 查询测试数据
|
||||
result = conn.execute(text("SELECT * FROM test_table WHERE id = 1"))
|
||||
row = result.fetchone()
|
||||
logger.info(f"查询结果: {row}")
|
||||
|
||||
# 删除测试表
|
||||
conn.execute(text("DROP TABLE test_table"))
|
||||
conn.commit()
|
||||
logger.info("测试表清理完成")
|
||||
|
||||
logger.info("✅ 数据库测试全部通过!")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 数据库测试失败: {str(e)}")
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
return False
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 配置日志
|
||||
logger.add("logs/database_test_{time}.log", rotation="1 day")
|
||||
|
||||
# 确保日志目录存在
|
||||
os.makedirs("logs", exist_ok=True)
|
||||
|
||||
# 运行测试
|
||||
success = test_database_connection()
|
||||
|
||||
# 退出码
|
||||
import sys
|
||||
sys.exit(0 if success else 1)
|
||||
Reference in New Issue
Block a user