综合实用脚本,市场热度偏向哪一方?

wen 实用脚本 2

本文目录导读:

综合实用脚本,市场热度偏向哪一方?

  1. 脚本说明与使用建议:
  2. 重要提示:

我可以为你提供一个综合实用且可自定义的Python脚本框架,用于计算A股或港美股市场的“热度偏向”,这个脚本会综合涨跌家数、成交量变化、涨停/跌停数量、板块轮动等指标,来评估当前市场是偏多还是偏空。

你可以将此脚本保存为 .py 文件,并在本地(需要安装 pandas, numpy, akshare)运行。akshare 是免费的开源财经数据接口库。

# -*- coding: utf-8 -*-
"""
综合市场热度偏向分析脚本(适用于A股)
核心逻辑:通过多维度数据加权,判断市场做多/做空情绪。
数据源:AkShare(开源免费)
运行前请安装依赖:pip install akshare pandas numpy
"""
import akshare as ak
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# --- 1. 获取市场概览数据 ---
def get_market_breadth():
    """
    获取全市场涨跌家数(涨跌广度)
    Returns: dict with 上涨家数, 下跌家数, 平盘家数, 涨停数, 跌停数
    """
    try:
        # 获取实时行情快照(包含所有A股)
        df = ak.stock_zh_a_spot_em()
        # 计算涨跌幅
        df['涨跌幅'] = df['涨跌幅'].astype(float)
        df['成交额'] = df['成交额'].astype(float)
        # 涨停判断(默认为主板10%,创业板/科创板20%,这里简化处理按19.9%以上和9.9%以上)
        limit_up = df[df['涨跌幅'] > 9.8]  # 粗略统计涨停(含ST股5%和20%的极端情况)
        limit_down = df[df['涨跌幅'] < -9.8]
        # 严格区分:主板10%,创业板/科创板20%
        # 这里简化:将涨幅超过9.9%视为涨停(主要针对主板)
        # 如果你需要精确,可以按代码前缀区分,但示例代码保持简洁
        up_count = (df['涨跌幅'] > 0).sum()
        down_count = (df['涨跌幅'] < 0).sum()
        flat_count = (df['涨跌幅'] == 0).sum()
        # 计算涨跌比
        breadth_ratio = up_count / max(down_count, 1)
        return {
            "上涨家数": up_count,
            "下跌家数": down_count,
            "平盘家数": flat_count,
            "涨停家数": len(limit_up),
            "跌停家数": len(limit_down),
            "涨跌比": round(breadth_ratio, 2)
        }
    except Exception as e:
        print(f"获取市场广度数据失败: {e}")
        return None
# --- 2. 获取成交额趋势 ---
def get_volume_trend():
    """
    获取今日与昨日大盘成交额,比较量能变化
    """
    try:
        # 获取上证指数历史数据(用于计算昨日成交额,这里简化为直接获取大盘指数)
        today = datetime.now().strftime("%Y%m%d")
        end_date = datetime.now().strftime("%Y%m%d")
        start_date = (datetime.now() - timedelta(days=5)).strftime("%Y%m%d")
        # 获取上证指数日线
        stock_zh_index_daily = ak.stock_zh_index_daily(symbol="sh000001")
        # 最近两天的成交额
        recent_2_days = stock_zh_index_daily.tail(2)
        if len(recent_2_days) == 2:
            today_vol = recent_2_days.iloc[-1]['amount']  # 今日成交额(元)
            yesterday_vol = recent_2_days.iloc[-1 - 1]['amount']  # 昨日成交额
            vol_change = (today_vol - yesterday_vol) / yesterday_vol * 100
            return {
                "今日总成交额": round(today_vol / 1e8, 2),  # 单位:亿
                "昨日成交额": round(yesterday_vol / 1e8, 2),
                "成交额变化%": round(vol_change, 2)
            }
        return None
    except Exception as e:
        print(f"获取成交额数据失败: {e}")
        return None
# --- 3. 获取板块热度(行业板块涨跌幅排行)---
def get_sector_performance(top_n=10):
    """
    获取申万一级行业板块涨幅前10名,判断主流资金进攻方向
    """
    try:
        df = ak.stock_board_industry_name_em()
        df = df.sort_values('涨跌幅', ascending=False).head(top_n)
        sectors = df[['板块名称', '涨跌幅']].values.tolist()
        return sectors
    except Exception as e:
        print(f"获取板块数据失败: {e}")
        return None
# --- 4. 获取资金流向(北向资金 & 大盘主力资金)---
def get_money_flow():
    """
    获取北向资金净流入(近期已调整数据接口,需注意可用性)
    """
    try:
        # 尝试获取沪深港通资金流向(部分接口可能会失效)
        north_fund = ak.stock_hsgt_fund_flow_summary_em()
        # 只保留北向资金数据(东方财富接口可能不公开实时,这里仅作参考)
        # 如果获取失败,返回None
        return north_fund[['资金方向', '成交净买额']].to_dict('records')
    except:
        # 备用:获取大盘主力资金流
        try:
            df = ak.stock_individual_fund_flow_rank(indicator="quot;)
            total_main_net = df['主力净流入-净额'].astype(float).sum() / 1e8  # 亿元
            return [{"资金方向": "全市场主力", "成交净买额": round(total_main_net, 2)}]
        except:
            return None
# --- 5. 综合评估热度偏向 ---
def evaluate_sentiment():
    """
    综合所有指标,打分判定市场热度(0-100分,50为中性,>60偏多,<40偏空)
    """
    print("正在获取市场实时数据...")
    score = 50  # 初始中性
    reasons = []
    # 1. 涨跌广度评分
    breadth = get_market_breadth()
    if breadth:
        ratio = breadth['涨跌比']
        # 涨跌比大于1偏向多头,大于2强势多头,小于0.8偏空
        if ratio >= 2:
            score += 15
            reasons.append(f"涨跌比极高({ratio}),多头氛围浓厚")
        elif ratio >= 1.2:
            score += 10
            reasons.append(f"涨跌比偏强({ratio})")
        elif ratio >= 1:
            score += 5
            reasons.append(f"涨跌比中性偏多({ratio})")
        elif ratio < 0.5:
            score -= 15
            reasons.append(f"涨跌比极低({ratio}),空头主导")
        elif ratio < 0.8:
            score -= 10
            reasons.append(f"涨跌比偏弱({ratio})")
        else:
            score -= 5
            reasons.append(f"涨跌比中性偏空({ratio})")
        # 涨停跌停对比
        limit_diff = breadth['涨停家数'] - breadth['跌停家数']
        if limit_diff > 50:
            score += 10
            reasons.append(f"涨停({breadth['涨停家数']})远大于跌停({breadth['跌停家数']})")
        elif limit_diff > 20:
            score += 5
            reasons.append(f"涨停({breadth['涨停家数']})> 跌停({breadth['跌停家数']})")
        elif limit_diff < -20:
            score -= 10
            reasons.append(f"跌停({breadth['跌停家数']})远大于涨停({breadth['涨停家数']})")
    # 2. 成交量能评分(量增价增是健康,量缩价涨需警惕)
    volume = get_volume_trend()
    if volume:
        vol_change = volume['成交额变化%']
        if vol_change > 10:
            score += 5
            reasons.append(f"成交量放大(+{vol_change}%),资金活跃")
        elif vol_change > 0:
            score += 3
            reasons.append(f"成交量小幅放大(+{vol_change}%)")
        elif vol_change < -10:
            score -= 5
            reasons.append(f"成交量萎缩({vol_change}%),观望情绪重")
        elif vol_change < 0:
            score -= 2
            reasons.append(f"成交量小幅缩量({vol_change}%)")
    # 3. 板块联动
    sectors = get_sector_performance(5)
    if sectors:
        # 检查是否有明确的主攻方向(前5名板块平均涨幅)
        avg_gain = np.mean([float(x[1]) for x in sectors])
        if avg_gain > 3:
            score += 8
            reasons.append(f"领涨板块涨幅大(平均+{round(avg_gain,2)}%),做多意愿强")
        elif avg_gain > 1:
            score += 4
            reasons.append(f"领涨板块温和上涨(平均+{round(avg_gain,2)}%)")
        else:
            score -= 2
            reasons.append(f"板块轮动弱,无明确主线")
    # 4. 资金流向(可选)
    # money = get_money_flow()
    # if money:
    #     for m in money:
    #         if '北向' in m.get('资金方向',''):
    #             if m['成交净买额'] > 0:
    #                 score += 5
    #                 reasons.append("北向资金净流入")
    #             else:
    #                 score -= 5
    #                 reasons.append("北向资金净流出")
    # 最终得分裁剪
    final_score = max(0, min(100, score))
    # --- 输出结果 ---
    print("\n" + "="*40)
    print("📊 市场热度综合评估报告")
    print("="*40)
    if breadth:
        print(f"\n📈 市场广度数据:")
        print(f"   上涨: {breadth['上涨家数']} 家 | 下跌: {breadth['下跌家数']} 家 | 平盘: {breadth['平盘家数']} 家")
        print(f"   涨停: {breadth['涨停家数']} 家 | 跌停: {breadth['跌停家数']} 家")
        print(f"   涨跌比: {breadth['涨跌比']}")
    if volume:
        print(f"\n💹 量能分析:")
        print(f"   今日总成交额: {volume['今日总成交额']} 亿 | 昨日: {volume['昨日成交额']} 亿")
        print(f"   量能变化: {volume['成交额变化%']}%")
    if sectors:
        print(f"\n🔥 板块热点 TOP5:")
        for sec in sectors[:5]:  # 只展示前5
            print(f"   {sec[0]}: {sec[1]:.2f}%")
    if reasons:
        print(f"\n🔍 分析要点:")
        for r in reasons:
            print(f"   • {r}")
    print(f"\n⚖️ 综合热度评分:** {final_score} / 100 **")
    # 最终偏向判断
    if final_score >= 70:
        conclusion = "极度亢奋,多头主导风险偏好高,注意高位回调风险"
    elif final_score >= 60:
        conclusion = "偏强多头,市场热度偏向做多方向,可保持积极但需注意追高风险"
    elif final_score >= 45:
        conclusion = "中性震荡,多空平衡,建议轻仓观察或做结构性行情"
    elif final_score >= 35:
        conclusion = "偏弱空头,市场热度偏向防守,建议降低仓位、控制回撤"
    else:
        conclusion = "极度低迷,恐慌情绪较重,建议观望等待企稳信号"
    print(f"\n📌 市场热度偏向:{conclusion}")
    print("="*40 + "\n")
if __name__ == "__main__":
    evaluate_sentiment()

脚本说明与使用建议:

  1. 依赖安装:在终端运行 pip install akshare pandas numpy
  2. 运行方式:直接运行该脚本,它会实时抓取数据并自动打分。
  3. 核心逻辑
    • 涨跌广度(涨跌家数比):这是最重要的变量,如果涨停家数多、跌停少,说明赚钱效应好,热度偏多。
    • 量能变化:上涨放量是健康的,说明买盘积极;如果缩量上涨,则可能是主力拉高出货。
    • 板块效应:如果涨幅靠前的板块具有联动性且涨幅较大(如权重股、题材股齐涨),说明资金有合力进攻的意愿。
    • 资金流:北向资金(外资)的动向,历史上是重要的风向标(注:由于数据接口调整,该功能已注释,你可以自行开启尝试)。

重要提示:

  • 该脚本提供的是量化参考,不构成投资建议。
  • 市场热度并非“买入/卖出”信号,而是帮助判断市场情绪温度,温度极高(>80)反而容易物极必反,温度极低(<20)往往孕育反弹。
  • 对于 “当前市场热度偏向” 这种实时问题,建议你直接打开交易软件(如东方财富、同花顺)查看涨跌家数统计涨停板梯队,这比任何历史数据都更直观。

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