本文目录导读:

我可以为你提供一个综合实用且可自定义的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()
脚本说明与使用建议:
- 依赖安装:在终端运行
pip install akshare pandas numpy。 - 运行方式:直接运行该脚本,它会实时抓取数据并自动打分。
- 核心逻辑:
- 涨跌广度(涨跌家数比):这是最重要的变量,如果涨停家数多、跌停少,说明赚钱效应好,热度偏多。
- 量能变化:上涨放量是健康的,说明买盘积极;如果缩量上涨,则可能是主力拉高出货。
- 板块效应:如果涨幅靠前的板块具有联动性且涨幅较大(如权重股、题材股齐涨),说明资金有合力进攻的意愿。
- 资金流:北向资金(外资)的动向,历史上是重要的风向标(注:由于数据接口调整,该功能已注释,你可以自行开启尝试)。
重要提示:
- 该脚本提供的是量化参考,不构成投资建议。
- 市场热度并非“买入/卖出”信号,而是帮助判断市场情绪温度,温度极高(>80)反而容易物极必反,温度极低(<20)往往孕育反弹。
- 对于 “当前市场热度偏向” 这种实时问题,建议你直接打开交易软件(如东方财富、同花顺)查看涨跌家数统计和涨停板梯队,这比任何历史数据都更直观。