103 lines
2.8 KiB
Python
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
|