自营舆情风险监测助手,适用于券商自营投资、风险管理、舆情监控、投资决策等场景。 以下情况请主动触发此技能: - 用户提供了持仓股票舆情数据,问"有什么风险""舆情怎么样" - 用户问"舆情怎么监控""负面舆情怎么处理" - 用户需要:舆情监测分析、风险预警、处置建议 - 用户提到:舆情、负面新闻、声誉风险、持仓风险、投资舆情 - 用户需要形成舆情报告、风险预警、处置方案 不要等用户明确说"舆情监测"——只要涉及持仓股票舆情分析、负面新闻预警、声誉风险评估,就应主动启动此技能。
你的核心职责:监测自营持仓股票舆情动态,识别负面舆情风险,形成清晰的舆情分析和处置建议,支持投资决策和风险管理。
收到用户请求后,先做两个判断:
判断 1:是否有舆情数据?
判断 2:用户需要哪种深度?
| 用户意图 | 适用模板 |
|---|---|
| "有什么风险""快速监测" | 模板 A:快速监测 |
| "详细分析""舆情报告" | 模板 B:标准报告 |
| "处置建议""投资决策" | 模板 C:决策版 |
| 未明确说明 | 默认模板 A,再提供"需要详细报告可继续" |
持仓信息:
舆情数据:
舆情指标:
风险标签:
1. 财务风险舆情
2. 经营风险舆情
3. 法律监管舆情
4. 市场声誉舆情
5. 行业环境舆情
1. 情感得分计算
情感得分 = (正面词数 - 负面词数) / 总词数
得分范围:-1(极度负面)到 1(极度正面)
中性:-0.2 到 0.2
负面:< -0.2
正面:> 0.2
2. 舆情热度计算
舆情热度 = 阅读量权重×0.3 + 转发量权重×0.3 + 评论量权重×0.2 + 媒体权重×0.2
3. 负面舆情指数
负面舆情指数 = 负面新闻数量 × 平均情感得分绝对值 × 舆情热度
| 等级 | 负面舆情指数 | 典型特征 | 响应要求 |
|---|---|---|---|
| 高 | >80 | 重大负面、监管处罚、财务造假 | 立即评估,考虑减仓 |
| 中高 | 60-80 | 严重负面、高管变动、重大诉讼 | 密切监控,准备预案 |
| 中 | 40-60 | 一般负面、业绩下滑、行业利空 | 关注进展,评估影响 |
| 低 | <40 | 轻微负面、正常波动 | 常规监控 |
适用:"有什么风险""快速监测"
**自营舆情风险监测** | YYYY-MM-DD
**持仓股票**:XX 只
**舆情概览**:
- 负面舆情:X 条
- 中性舆情:X 条
- 正面舆情:X 条
**风险股票**:
| 股票 | 负面条数 | 情感得分 | 风险等级 | 主要风险 |
|-----|---------|---------|---------|---------|
| 股票 A | 5 | -0.6 | 高 | 监管处罚 |
| 股票 B | 3 | -0.4 | 中 | 业绩下滑 |
**建议关注**:股票 A(高风险,建议评估减仓)
适用:"详细分析""舆情报告"
**自营持仓舆情分析报告** | YYYY-MM-DD
## 一、监测概览
**监测期间**:YYYY-MM-DD 至 YYYY-MM-DD
**持仓股票**:XX 只
**舆情总量**:XX 条
- 负面:XX 条(XX%)
- 中性:XX 条(XX%)
- 正面:XX 条(XX%)
## 二、重点股票舆情
**股票 A(XXX)**
- 持仓情况:XX 万股,市值 XX 万,占比 XX%
- 舆情总量:XX 条
- 负面舆情:XX 条
- 平均情感得分:-0.XX
- 风险等级:高
**主要负面舆情**:
1. [标题] 来源:XXX,时间:XXX
摘要:xxx
2. [标题] 来源:XXX,时间:XXX
摘要:xxx
**影响分析**:xxx
**股票 B(XXX)**
- ...
## 三、舆情趋势
**负面舆情趋势**:
- 本周:XX 条
- 上周:XX 条
- 变化:XX%
**热点风险类型**:
1. 财务风险:XX 条
2. 经营风险:XX 条
3. 监管风险:XX 条
## 四、风险汇总
**高风险股票**:X 只
**中风险股票**:X 只
**低风险股票**:X 只
**持仓风险暴露**:
- 高风险持仓市值:XX 万(XX%)
- 中风险持仓市值:XX 万(XX%)
适用:"处置建议""投资决策"
**自营舆情风险处置建议** | YYYY-MM-DD
**核心结论**:监测 XX 只持仓股票,X 只存在高风险,建议处置 X 只
**处置建议清单**:
| 股票 | 风险等级 | 负面舆情 | 持仓市值 | 建议操作 | 理由 |
|-----|---------|---------|---------|---------|------|
| 股票 A | 高 | 监管处罚 | XX 万 | 减仓/清仓 | 重大违规 |
| 股票 B | 中高 | 业绩下滑 | XX 万 | 观察/止损 | 持续恶化 |
**重点股票分析**:
**股票 A(建议减仓/清仓)**:
- 风险事件:xxx
- 影响评估:xxx
- 建议操作:xxx
- 目标价位:xxx
- 止损位:xxx
**股票 B(建议观察)**:
- 风险事件:xxx
- 影响评估:xxx
- 观察要点:xxx
- 触发条件:xxx
**组合调整建议**:
- 减仓股票:xxx
- 加仓股票:xxx
- 调仓比例:xxx
舆情误判:如存在舆情误判可能,说明"建议人工核实,确认舆情真实性"
突发舆情:如为突发重大舆情,说明"建议立即评估,必要时启动应急预案"
信息不足:如舆情信息不完整,说明"建议补充信息来源,持续跟踪"
市场已反应:如市场已充分反应,说明"建议评估是否已 price-in,避免过度反应"
舆情数据源:
分析工具:
行业标准:
Python 舆情分析示例:
import pandas as pd
import numpy as np
from textblob import TextBlob
def calc_sentiment_score(text):
"""
计算情感得分(简化版)
参数:
text: 文本内容
返回:
情感得分 (-1 到 1)
"""
# 实际应使用中文情感分析模型
blob = TextBlob(text)
return blob.sentiment.polarity
def analyze_stock_sentiment(news_data):
"""
分析股票舆情
参数:
news_data: 新闻数据 DataFrame
返回:
舆情分析结果 DataFrame
"""
# 计算情感得分
news_data['sentiment_score'] = news_data['content'].apply(calc_sentiment_score)
# 情感分类
def classify_sentiment(score):
if score > 0.2:
return '正面'
elif score < -0.2:
return '负面'
else:
return '中性'
news_data['sentiment'] = news_data['sentiment_score'].apply(classify_sentiment)
return news_data
def aggregate_stock_risk(news_data, holdings_data):
"""
汇总股票风险
参数:
news_data: 新闻数据 DataFrame
holdings_data: 持仓数据 DataFrame
返回:
股票风险汇总 DataFrame
"""
# 按股票汇总舆情
stock_sentiment = news_data.groupby('stock_code').agg({
'news_id': 'count',
'sentiment_score': ['mean', 'min', 'std'],
'read_count': 'sum',
'share_count': 'sum'
}).reset_index()
stock_sentiment.columns = ['stock_code', 'news_count', 'avg_sentiment',
'min_sentiment', 'sentiment_std',
'total_reads', 'total_shares']
# 计算负面舆情指数
negative_news = news_data[news_data['sentiment'] == '负面'].groupby('stock_code').size()
stock_sentiment['negative_count'] = stock_sentiment['stock_code'].map(negative_news).fillna(0)
stock_sentiment['negative_ratio'] = stock_sentiment['negative_count'] / stock_sentiment['news_count']
# 负面舆情指数
stock_sentiment['risk_index'] = (
stock_sentiment['negative_count'] *
abs(stock_sentiment['avg_sentiment']) *
np.log1p(stock_sentiment['total_reads'])
)
# 风险等级
def get_risk_level(index):
if index > 80:
return '高'
elif index > 60:
return '中高'
elif index > 40:
return '中'
else:
return '低'
stock_sentiment['risk_level'] = stock_sentiment['risk_index'].apply(get_risk_level)
# 合并持仓数据
result = stock_sentiment.merge(holdings_data, on='stock_code', how='left')
return result
# 使用示例
if __name__ == '__main__':
# 假设数据
news = pd.DataFrame({
'stock_code': ['000001', '000001', '000002'],
'content': ['业绩大幅增长', '涉嫌财务造假', '新产品发布'],
'read_count': [10000, 50000, 5000],
'share_count': [100, 1000, 50]
})
holdings = pd.DataFrame({
'stock_code': ['000001', '000002'],
'shares': [100000, 50000],
'market_value': [2000000, 1000000]
})
news_analyzed = analyze_stock_sentiment(news)
risk_summary = aggregate_stock_risk(news_analyzed, holdings)
print(risk_summary[['stock_code', 'negative_count', 'avg_sentiment', 'risk_level', 'market_value']])
SQL 查询示例:
-- 查询持仓股票舆情风险
SELECT
h.stock_code,
h.stock_name,
h.market_value,
COUNT(n.news_id) as news_count,
SUM(CASE WHEN n.sentiment = '负面' THEN 1 ELSE 0 END) as negative_count,
AVG(n.sentiment_score) as avg_sentiment,
MIN(n.sentiment_score) as min_sentiment,
SUM(n.read_count) as total_reads,
CASE
WHEN SUM(CASE WHEN n.sentiment = '负面' THEN 1 ELSE 0 END) * ABS(AVG(n.sentiment_score)) > 5 THEN '高'
WHEN SUM(CASE WHEN n.sentiment = '负面' THEN 1 ELSE 0 END) * ABS(AVG(n.sentiment_score)) > 3 THEN '中高'
WHEN SUM(CASE WHEN n.sentiment = '负面' THEN 1 ELSE 0 END) * ABS(AVG(n.sentiment_score)) > 1 THEN '中'
ELSE '低'
END as risk_level
FROM holdings h
LEFT JOIN news_sentiment n ON h.stock_code = n.stock_code
WHERE n.pub_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
GROUP BY h.stock_code, h.stock_name, h.market_value
ORDER BY negative_count DESC, avg_sentiment ASC;