stock-ai-agent/backend/test_market_signal.py
2026-03-02 22:58:04 +08:00

143 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
测试市场信号分析 - 验证趋势判断功能
"""
import asyncio
import sys
import os
import json
# 添加项目路径
sys.path.insert(0, os.path.dirname(__file__))
from app.crypto_agent.market_signal_analyzer import MarketSignalAnalyzer
from app.utils.logger import logger
from app.services.bitget_service import BitgetService
async def test_trend_analysis(symbol: str = "BTCUSDT"):
"""测试趋势分析"""
logger.info("=" * 60)
logger.info(f"开始测试市场信号分析: {symbol}")
logger.info("=" * 60)
# 1. 获取 K 线数据
logger.info(f"\n[1/3] 获取 {symbol} 的 K 线数据...")
bitget_service = BitgetService()
data = bitget_service.get_multi_timeframe_data(symbol)
if not data:
logger.error(f"❌ 无法获取 {symbol} 的 K 线数据")
return
logger.info(f"✅ K 线数据获取成功")
for tf, df in data.items():
if df is not None and len(df) > 0:
latest_price = float(df.iloc[-1]['close'])
logger.info(f" {tf}: 最新价格 ${latest_price:,.2f}, 数据量 {len(df)}")
# 2. 分析市场信号
logger.info(f"\n[2/3] 分析市场信号...")
analyzer = MarketSignalAnalyzer()
result = await analyzer.analyze(symbol, data)
# 3. 打印分析结果
logger.info(f"\n[3/3] 分析结果:")
logger.info("-" * 60)
# 打印趋势判断(新功能)
logger.info("\n📊 趋势判断(新增):")
logger.info(f" 趋势方向: {result.get('trend_direction', 'unknown')}")
logger.info(f" 趋势强度: {result.get('trend_strength', 'unknown')}")
# 打印市场状态
logger.info(f"\n📈 市场状态:")
logger.info(f" {result.get('market_state', 'unknown')}")
logger.info(f" 分析摘要: {result.get('analysis_summary', 'unknown')}")
logger.info(f" 量价分析: {result.get('volume_analysis', 'unknown')}")
# 打印关键价位
if result.get('key_levels'):
logger.info(f"\n💰 关键价位:")
levels = result['key_levels']
if levels.get('support'):
logger.info(f" 支撑位: {[f'${s:,.0f}' for s in levels['support'] if s]}")
if levels.get('resistance'):
logger.info(f" 阻力位: {[f'${r:,.0f}' for r in levels['resistance'] if r]}")
# 打印信号
logger.info(f"\n🎯 交易信号:")
signals = result.get('signals', [])
if not signals:
logger.warning(" ⚠️ 无交易信号(观望)")
else:
for i, sig in enumerate(signals, 1):
action_emoji = "🟢" if sig.get('action') == 'buy' else "🔴" if sig.get('action') == 'sell' else ""
grade_icon = {'A': '⭐⭐⭐', 'B': '⭐⭐', 'C': '', 'D': ''}.get(sig.get('grade', ''), '')
entry_type_emoji = "⚡现价" if sig.get('entry_type') == 'market' else "⏳挂单"
logger.info(f"\n 信号 #{i} {action_emoji} {grade_icon}")
logger.info(f" ├─ 类型: {sig.get('timeframe', 'unknown')} | {entry_type_emoji}")
logger.info(f" ├─ 操作: {sig.get('action', 'unknown').upper()}")
logger.info(f" ├─ 信心度: {sig.get('confidence', 0)}% | 等级: {sig.get('grade', 'unknown')}")
logger.info(f" ├─ 入场价: ${sig.get('entry_price', 0):,.2f}")
logger.info(f" ├─ 止损: ${sig.get('stop_loss', 0):,.2f} | 止盈: ${sig.get('take_profit', 0):,.2f}")
logger.info(f" └─ 理由: {sig.get('reasoning', 'unknown')}")
# 检查是否顺势
trend_dir = result.get('trend_direction', 'neutral')
action = sig.get('action', '')
if trend_dir == 'uptrend' and action == 'sell':
logger.warning(f" ⚠️ 警告: 上升趋势中做空(逆势)")
elif trend_dir == 'downtrend' and action == 'buy':
logger.warning(f" ⚠️ 警告: 下降趋势中做多(逆势)")
elif trend_dir == 'uptrend' and action == 'buy':
logger.info(f" ✅ 顺势交易")
elif trend_dir == 'downtrend' and action == 'sell':
logger.info(f" ✅ 顺势交易")
logger.info("\n" + "=" * 60)
logger.info("测试完成")
logger.info("=" * 60)
return result
async def test_multiple_symbols():
"""测试多个交易对"""
symbols = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT']
for symbol in symbols:
logger.info(f"\n\n{'#' * 60}")
logger.info(f"# 测试 {symbol}")
logger.info(f"{'#' * 60}")
try:
await test_trend_analysis(symbol)
except Exception as e:
logger.error(f"{symbol} 测试失败: {e}")
import traceback
traceback.print_exc()
# 等待一段时间,避免 API 限流
await asyncio.sleep(2)
def main():
import argparse
parser = argparse.ArgumentParser(description='测试市场信号分析')
parser.add_argument('--symbol', default='BTCUSDT', help='交易对(默认: BTCUSDT')
parser.add_argument('--multi', action='store_true', help='测试多个交易对')
args = parser.parse_args()
if args.multi:
asyncio.run(test_multiple_symbols())
else:
asyncio.run(test_trend_analysis(args.symbol))
if __name__ == '__main__':
main()