test_quant_trading.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
超短线量化选股程序一键测试脚本
测试数据下载、大模型调用、单次回测、单次选股功能
"""

import os
import sys
import logging
import time
from pathlib import Path

# 添加项目根目录到Python路径
sys.path.append(str(Path(__file__).parent))

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)

def test_data_download():
    """测试数据下载功能"""
    logger.info("=" * 80)
    logger.info("测试数据下载功能")
    logger.info("=" * 80)
    
    try:
        from src.data_manager import DataManager
        data_manager = DataManager()
        
        # 测试连接
        logger.info("测试数据管理模块连接...")
        data_manager.test_connection()
        
        # 更新股票基本信息
        logger.info("更新股票基本信息...")
        df_basic = data_manager.update_stock_basic()
        logger.info(f"股票基本信息:{len(df_basic)} 只")
        
        # 更新历史数据(最近10天)
        logger.info("更新历史数据(最近10天)...")
        from datetime import datetime, timedelta
        end_date = datetime.now().strftime('%Y%m%d')
        start_date = (datetime.now() - timedelta(days=10)).strftime('%Y%m%d')
        data_manager.update_history_data(start_date, end_date)
        
        logger.info("数据下载功能测试完成")
        return True
        
    except Exception as e:
        logger.error(f"数据下载功能测试失败:{e}")
        return False

def test_model_call():
    """测试大模型调用功能"""
    logger.info("=" * 80)
    logger.info("测试大模型调用功能")
    logger.info("=" * 80)
    
    try:
        from src.model_api import ModelAPI
        model_api = ModelAPI()
        
        # 测试连接
        logger.info("测试大模型API连接...")
        model_api.test_connection()
        
        logger.info("大模型调用功能测试完成")
        return True
        
    except Exception as e:
        logger.error(f"大模型调用功能测试失败:{e}")
        return False

def test_single_backtest():
    """测试单次回测功能"""
    logger.info("=" * 80)
    logger.info("测试单次回测功能")
    logger.info("=" * 80)
    
    try:
        from src.backtester import Backtester
        backtester = Backtester()
        
        # 简化回测参数(只回测最近3天数据)
        backtester.start_date = "20240101"
        backtester.end_date = "20240103"
        
        # 使用默认参数进行回测
        logger.info("开始单次回测...")
        report = backtester.run()
        
        logger.info("回测结果:")
        logger.info(f"总交易天数:{report['total_days']}")
        logger.info(f"总交易次数:{report['total_trades']}")
        logger.info(f"胜率:{report['win_rate']:.2%}")
        logger.info(f"平均单只收益率:{report['avg_return']:.2%}")
        logger.info(f"累计收益率:{report['total_return']:.2%}")
        logger.info(f"最大回撤:{report['max_drawdown']:.2%}")
        logger.info(f"盈亏比:{report['profit_loss_ratio']:.2f}")
        logger.info(f"每日平均收益率:{report['avg_daily_return']:.2%}")
        
        # 保存回测报告
        backtester.save_report(report, "test_backtest")
        
        logger.info("单次回测功能测试完成")
        return True
        
    except Exception as e:
        logger.error(f"单次回测功能测试失败:{e}")
        return False

def test_single_selection():
    """测试单次选股功能"""
    logger.info("=" * 80)
    logger.info("测试单次选股功能")
    logger.info("=" * 80)
    
    try:
        from src.stock_selector import StockSelector
        selector = StockSelector()
        
        # 使用测试数据进行选股(指定策略)
        logger.info("开始单次选股...")
        result = selector.run(['vcp', 'model'], '20240102', '14:30:00')
        
        if not result.empty:
            logger.info(f"选股结果:{len(result)} 只股票")
            selector.save_results(result, "test_selection", strategy_name="vcp-model")
            selector.print_results(result, strategy_name="vcp-model")
        else:
            logger.warning("未选出符合条件的股票")
        
        logger.info("单次选股功能测试完成")
        return True
        
    except Exception as e:
        logger.error(f"单次选股功能测试失败:{e}")
        return False

def test_scheduler():
    """测试调度器功能"""
    logger.info("=" * 80)
    logger.info("测试调度器功能")
    logger.info("=" * 80)
    
    try:
        from src.scheduler import Scheduler
        scheduler = Scheduler()
        
        logger.info("调度器实例化成功")
        
        logger.info("调度任务列表:")
        jobs = scheduler.get_scheduled_jobs()
        for job in jobs:
            logger.info(f"{job['name']} (ID: {job['id']}) - 下次运行:{job['next_run_time']}")
        
        logger.info("调度器功能测试完成")
        return True
        
    except Exception as e:
        logger.error(f"调度器功能测试失败:{e}")
        return False

def run_all_tests():
    """运行所有测试"""
    logger.info("=" * 80)
    logger.info("超短线量化选股程序全面测试")
    logger.info("=" * 80)
    
    # 测试结果记录
    test_results = []
    
    # 测试数据下载
    logger.info("1. 测试数据下载功能")
    result = test_data_download()
    test_results.append(("数据下载", result))
    time.sleep(1)
    
    # 测试大模型调用
    logger.info("\n2. 测试大模型调用功能")
    result = test_model_call()
    test_results.append(("大模型调用", result))
    time.sleep(1)
    
    # 测试单次回测
    logger.info("\n3. 测试单次回测功能")
    result = test_single_backtest()
    test_results.append(("单次回测", result))
    time.sleep(1)
    
    # 测试单次选股
    logger.info("\n4. 测试单次选股功能")
    result = test_single_selection()
    test_results.append(("单次选股", result))
    time.sleep(1)
    
    # 测试调度器
    logger.info("\n5. 测试调度器功能")
    result = test_scheduler()
    test_results.append(("调度器", result))
    time.sleep(1)
    
    # 输出测试结果
    logger.info("\n" + "=" * 80)
    logger.info("测试结果汇总")
    logger.info("=" * 80)
    
    passed = 0
    failed = 0
    
    for test_name, result in test_results:
        if result:
            logger.info(f"✅ {test_name} - 测试通过")
            passed += 1
        else:
            logger.info(f"❌ {test_name} - 测试失败")
            failed += 1
    
    logger.info(f"\n测试统计:{passed} 个通过,{failed} 个失败")
    
    if failed > 0:
        logger.warning("\n⚠️  部分测试失败,请检查相关功能是否正常")
        return False
    else:
        logger.info("\n✅ 所有测试通过")
        return True

if __name__ == "__main__":
    # 运行所有测试
    if run_all_tests():
        logger.info("\n程序功能测试完成,所有功能正常")
        sys.exit(0)
    else:
        logger.error("\n程序功能测试失败,请检查相关功能")
        sys.exit(1)