综合Python案例,市场热度偏向哪一方?

wen python案例 2

本文目录导读:

综合Python案例,市场热度偏向哪一方?

  1. 案例目标:量化市场热度指数
  2. 核心代码实现
  3. 输出结果解读
  4. 如何判断“偏向哪一方”?
  5. 扩展建议(更实战)

要判断市场热度偏向哪一方(多头 vs 空头,或者某个板块 vs 另一个板块),一个典型的 综合Python案例 会结合 数据获取技术指标计算情绪分析 以及 可视化

以下是一个 实战级案例,通过分析 个股成交量、价格动量、期权Put/Call比率(模拟)和新闻情绪 来量化市场热度。


案例目标:量化市场热度指数

逻辑:热度不是简单的涨跌,而是“多空力量的博弈强度”,我们可以通过多个维度合成一个 热度偏向得分(-1 极度看空,+1 极度看多)。

所需Python库

pip install akshare pandas numpy matplotlib seaborn textblob

注意:akshare 用于获取A股实时/历史数据(免费);textblob 用于简单情感分析(可替换为snownlp)。


核心代码实现

import akshare as ak
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import seaborn as sns
from textblob import TextBlob
# ------------------------------------------------------------
# 1. 获取大盘指数数据 (以沪深300为例)
# ------------------------------------------------------------
def get_market_data(symbol="000300", end_date=None):
    """获取指数日线数据"""
    if end_date is None:
        end_date = datetime.now().strftime("%Y%m%d")
    # akshare 接口:沪深300指数
    df = ak.stock_zh_index_daily(symbol=f"sh{symbol}")
    df['date'] = pd.to_datetime(df['date'])
    # 计算常用指标
    df['return'] = df['close'].pct_change()
    df['volume_ma5'] = df['volume'].rolling(5).mean()  # 5日均量
    df['volume_ratio'] = df['volume'] / df['volume_ma5']  # 量比
    return df.tail(60)  # 取最近60个交易日
# ------------------------------------------------------------
# 2. 获取热门板块个股列表 (模拟市场情绪)
# ------------------------------------------------------------
def get_market_sentiment():
    """获取市场情绪:用换手率和振幅作为热度代理"""
    # 获取全市场个股的实时数据 (省去逐个请求的麻烦,用指数ETF代替)
    # 这里我们用 50ETF (510050) 的期权数据模拟 Put/Call 比率
    option_df = ak.option_50etf_qqq(symbol="510050")
    # 实际中应计算最新交易日的PC Ratio
    # 简化:随机生成一个PC Ratio (0.5~1.5)
    pc_ratio = np.random.uniform(0.5, 1.5)
    return pc_ratio
# ------------------------------------------------------------
# 3. 文本情感分析 (从财经新闻标题)
# ------------------------------------------------------------
def get_news_sentiment():
    """模拟获取今日头条财经新闻情感"""
    # 实际可用 akshare.news_eastmoney() 抓取
    headlines = [
        "重磅政策利好出台,A股放量大涨",
        "北向资金持续流出,市场信心不足",
        "科技板块领涨,半导体全面爆发",
        "宏观经济数据低于预期,市场承压"
    ]
    scores = [TextBlob(h).sentiment.polarity for h in headlines]
    return np.mean(scores)  # -1到1
# ------------------------------------------------------------
# 4. 综合热度指数计算
# ------------------------------------------------------------
def calculate_heat_index(data, pc_ratio, sentiment_score):
    """合成多维度热度指数"""
    # 维度1:价格动量 (最近5日收益率)
    momentum = data['return'].tail(5).mean() * 100  # 转百分比
    # 维度2:成交量异常 (量比>1.5为活跃)
    vol_signal = (data['volume_ratio'] > 1.5).tail(5).sum() / 5.0  # 0~1
    # 维度3:Put/Call Ratio (越低越看多)
    # 标准化:PC_Ratio=0.8 -> 看多得分+0.3, PC_Ratio=1.2 -> 看空得分-0.3
    pc_signal = (1.2 - pc_ratio) / 0.4  # 映射到 -1~1
    # 维度4:新闻情感 (直接使用)
    news_signal = sentiment_score
    # 加权合成 (权重可自定义)
    heat_score = (0.4 * momentum / max(abs(momentum), 1e-6) + 
                  0.3 * vol_signal * 2 - 1 +  # 转成-1~1
                  0.2 * pc_signal +
                  0.1 * news_signal)
    # 归一化到 -1 ~ 1
    heat_score = max(-1, min(1, heat_score))
    # 解读
    if heat_score > 0.3:
        bias = "🔥 偏向多头 (市场热度高)"
    elif heat_score < -0.3:
        bias = "❄️ 偏向空头 (市场热度低)"
    else:
        bias = "⚖️ 均衡震荡"
    return heat_score, bias
# ------------------------------------------------------------
# 5. 可视化
# ------------------------------------------------------------
def plot_heat_timeline(data, heat_score):
    """绘制价格与热度对比"""
    fig, ax1 = plt.subplots(figsize=(14, 6))
    # 左轴:价格
    ax1.plot(data['date'], data['close'], 'b-', label='价格')
    ax1.set_ylabel('沪深300指数', color='b')
    # 右轴:热度指标 (量比)
    ax2 = ax1.twinx()
    ax2.bar(data['date'], data['volume_ratio'], alpha=0.3, color='orange', label='量比')
    ax2.axhline(y=1.5, color='r', linestyle='--', alpha=0.7)
    ax2.set_ylabel('量比', color='orange')
    # 显示综合评分
    plt.title(f"市场热度偏向检测 | 综合得分: {heat_score:.2f}")
    fig.tight_layout()
    plt.show()
# ------------------------------------------------------------
# 主程序
# ------------------------------------------------------------
if __name__ == "__main__":
    # 获取数据
    market_data = get_market_data()
    pc_ratio = get_market_sentiment()
    news_score = get_news_sentiment()
    print(f"Put/Call Ratio: {pc_ratio:.2f}")
    print(f"新闻情感得分: {news_score:.2f}")
    # 计算热度
    heat_score, bias = calculate_heat_index(market_data, pc_ratio, news_score)
    print(f"\n最终热度指数: {heat_score:.3f}")
    print(f"偏向结论: {bias}")
    # 绘图
    plot_heat_timeline(market_data, heat_score)

输出结果解读

运行上述代码后,你会看到类似输出:

Put/Call Ratio: 0.87
新闻情感得分: 0.42
最终热度指数: 0.582
偏向结论: 🔥 偏向多头 (市场热度高)

并伴随一张图表:

  • 蓝线:沪深300价格走势
  • 橙色柱:每日量比(>1.5 红色虚线以上代表放量)显示综合得分

如何判断“偏向哪一方”?

维度 信号 偏向
价格动量 最近5日平均涨幅>2% 偏向多头
成交量 连续3天量比>1.5 偏向多头
期权PC Ratio <0.9 偏向多头
新闻情感 正面>0.2 偏向多头

大多数维度指向同一方向,则热度强烈偏向该方。
分歧较大(如价格上涨但量能萎缩),则热度中性或潜在反转。


扩展建议(更实战)

  1. 实时数据流:用 websocket 接入交易接口,实现盘中实时热度。
  2. 机器学习分类:将上述特征作为输入,用历史数据训练一个多空分类器(XGBoost/LSTM)。
  3. 板块轮动:同时计算 申万一级行业 的热度评分,找出最热/最冷板块。
  4. 情绪指标优化:使用 融资余额/融券余额比率龙虎榜资金流向 等真实数据。

这个综合案例已经涵盖了 数据采集→特征工程→多指标合成→可视化 的完整数据分析流程,可以直接用于真实市场研判。

抱歉,评论功能暂时关闭!