import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
from matplotlib import rcParams
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
def get_limit_up_data(days=30):
"""获取最近N天的涨停板数据"""
end_date = datetime.now().strftime('%Y%m%d')
start_date = (datetime.now() - timedelta(days=days)).strftime('%Y%m%d')
# 获取每日涨停板数据
limit_data = pd.DataFrame()
date_range = pd.date_range(start=start_date, end=end_date)
for date in date_range:
date_str = date.strftime('%Y%m%d')
try:
daily_data = ak.stock_zt_pool_em(date=date_str)
if not daily_data.empty:
daily_data['日期'] = date_str
limit_data = pd.concat([limit_data, daily_data])
except Exception as e:
print(f"获取{date_str}涨停数据失败: {e}")
continue
return limit_data
def analyze_limit_up(limit_data):
"""分析涨停板数据"""
if limit_data.empty:
return pd.DataFrame()
# 按日期统计
daily_stats = limit_data.groupby('日期').agg({
'代码': 'count', # 涨停数量
'成交额': 'sum' # 涨停总成交额
}).rename(columns={'代码': '涨停数量', '成交额': '涨停总成交额'})
return daily_stats
def plot_limit_up(stats_data):
"""绘制涨停板统计图表"""
if stats_data.empty:
print("无有效数据可绘制")
return
plt.figure(figsize=(15, 8))
# 涨停数量图表
plt.subplot(2, 1, 1)
plt.bar(stats_data.index, stats_data['涨停数量'], color='red', alpha=0.6)
plt.title('每日涨停数量', fontsize=14)
plt.ylabel('数量', fontsize=12)
plt.grid(True, axis='y', linestyle='--', alpha=0.6)
# 涨停总成交额图表
plt.subplot(2, 1, 2)
plt.bar(stats_data.index, stats_data['涨停总成交额']/1e8, color='green', alpha=0.6)
plt.title('每日涨停总成交额', fontsize=14)
plt.ylabel('成交额(亿元)', fontsize=12)
plt.grid(True, axis='y', linestyle='--', alpha=0.6)
plt.tight_layout()
plt.savefig('limit_up_stats.png', dpi=300, bbox_inches='tight')
plt.show()
if __name__ == '__main__':
# 获取最近30天涨停板数据
limit_data = get_limit_up_data(days=200)
if not limit_data.empty:
# 分析数据
stats = analyze_limit_up(limit_data)
# 绘制图表
plot_limit_up(stats)
else:
print("未能获取涨停板数据,请检查网络连接或数据源")
![]()