llm-quant/tests/test_sentiment_indicators.py
2025-10-05 16:28:53 +08:00

103 lines
2.8 KiB
Python

"""Tests for market sentiment indicators."""
from __future__ import annotations
import numpy as np
import pytest
from app.core.sentiment import (
news_sentiment_momentum,
news_impact_score,
market_sentiment_index,
industry_sentiment_divergence
)
def test_news_sentiment_momentum():
# 生成测试数据
window = 20
uptrend = np.linspace(-0.5, 0.5, window) # 上升趋势
downtrend = np.linspace(0.5, -0.5, window) # 下降趋势
flat = np.zeros(window) # 平稳趋势
# 测试上升趋势
result = news_sentiment_momentum(uptrend)
assert result is not None
assert result > 0
# 测试下降趋势
result = news_sentiment_momentum(downtrend)
assert result is not None
assert result < 0
# 测试平稳趋势
result = news_sentiment_momentum(flat)
assert result is not None
assert abs(result) < 0.1
# 测试数据不足
result = news_sentiment_momentum(uptrend[:10])
assert result is None
def test_news_impact_score():
# 测试典型场景
score = news_impact_score(sentiment=0.8, heat=0.6, entity_count=3)
assert 0 <= score <= 1
assert score > news_impact_score(sentiment=0.4, heat=0.6, entity_count=3)
# 测试边界情况
assert news_impact_score(sentiment=0, heat=0.5, entity_count=1) == 0
assert 0 < news_impact_score(sentiment=1, heat=1, entity_count=10) <= 1
# 测试实体数量影响
low_entity = news_impact_score(sentiment=0.5, heat=0.5, entity_count=1)
high_entity = news_impact_score(sentiment=0.5, heat=0.5, entity_count=5)
assert high_entity > low_entity
def test_market_sentiment_index():
window = 20
# 生成测试数据
sentiment_scores = np.random.uniform(-1, 1, window)
heat_scores = np.random.uniform(0, 1, window)
volume_ratios = np.random.uniform(0.5, 2, window)
# 测试正常计算
result = market_sentiment_index(
sentiment_scores,
heat_scores,
volume_ratios
)
assert result is not None
assert -1 <= result <= 1
# 测试数据缺失
result = market_sentiment_index(
sentiment_scores[:10],
heat_scores,
volume_ratios
)
assert result is None
def test_industry_sentiment_divergence():
# 测试显著背离
high_divergence = industry_sentiment_divergence(
industry_sentiment=0.8,
peer_sentiments=[-0.2, -0.1, 0, 0.1]
)
assert high_divergence is not None
assert high_divergence > 0
# 测试一致性好
low_divergence = industry_sentiment_divergence(
industry_sentiment=0.1,
peer_sentiments=[0, 0.1, 0.2]
)
assert low_divergence is not None
assert abs(low_divergence) < abs(high_divergence)
# 测试空数据
assert industry_sentiment_divergence(0.5, []) is None