用Pythonaksharepandas打造极简涨停复盘工具5分钟生成Excel报表每天收盘后面对市场上几十只甚至上百只涨停个股手动整理数据不仅耗时耗力还容易遗漏关键信息。作为一名白天忙于工作的投资者如何在有限时间内高效完成复盘本文将介绍一套基于Python的自动化解决方案只需5分钟即可生成包含涨停个股详细数据的Excel报表。1. 环境准备与数据获取1.1 安装必要库首先确保你的Python环境已安装以下库pip install akshare pandas xlsxwriter注意akshare是一个免费、开源的金融数据接口库数据来源于公开市场信息使用时请遵守相关数据使用协议。1.2 获取涨停板数据使用akshare的stock_zt_pool_em函数可以轻松获取当日涨停板数据import akshare as ak import pandas as pd # 设置pandas显示选项 pd.set_option(display.max_rows, None) pd.set_option(display.max_columns, None) pd.set_option(display.width, None) pd.set_option(display.max_colwidth, 50) # 获取当日涨停数据日期格式为YYYYMMDD date 20240509 # 替换为实际日期 df ak.stock_zt_pool_em(date)2. 数据清洗与格式化原始数据通常需要简单处理才能满足分析需求# 流通市值单位转换为亿元 df[流通市值] round(df[流通市值]/100000000) # 换手率取整 df[换手率] round(df[换手率]) # 选择需要的列 selected_columns [代码, 名称, 最新价, 流通市值, 换手率, 连板数, 所属行业] df df[selected_columns]关键点说明流通市值转换为亿元单位更符合国内投资者的阅读习惯换手率取整后更直观也可保留小数根据个人偏好调整列选择可根据实际需求增减如添加涨停时间等字段3. 多维度数据分析3.1 按连板数排序连板数反映了个股的持续强势程度# 按连板数降序排列 sorted_by_continuation df.sort_values(by连板数, ascendingFalse)3.2 按行业统计排序行业分析有助于把握市场热点方向# 创建副本避免修改原数据 industry_df df.copy() # 计算各行业涨停数量 industry_count industry_df[所属行业].value_counts().to_dict() industry_df[行业涨停数] industry_df[所属行业].map(industry_count) # 按行业涨停数、行业名称、连板数排序 sorted_by_industry industry_df.sort_values( by[行业涨停数, 所属行业, 连板数], ascending[False, True, False] ) # 删除临时列 sorted_by_industry sorted_by_industry.drop([行业涨停数], axis1)4. 自动化报表生成4.1 导出原始数据# 导出原始涨停数据 raw_output_path f./{date}_涨停原始数据.xlsx df.to_excel(raw_output_path, enginexlsxwriter)4.2 导出排序后数据# 导出按连板数排序数据 continuation_output_path f./{date}_涨停连板数排序.xlsx sorted_by_continuation.to_excel(continuation_output_path, enginexlsxwriter) # 导出按行业排序数据 industry_output_path f./{date}_涨停行业排序.xlsx sorted_by_industry.to_excel(industry_output_path, enginexlsxwriter)4.3 报表美化可选使用xlsxwriter可以进一步美化Excel报表# 创建美化后的Excel文件 with pd.ExcelWriter(f./{date}_涨停分析报告.xlsx, enginexlsxwriter) as writer: # 写入各工作表 df.to_excel(writer, sheet_name原始数据, indexFalse) sorted_by_continuation.to_excel(writer, sheet_name连板数排序, indexFalse) sorted_by_industry.to_excel(writer, sheet_name行业排序, indexFalse) # 获取workbook和worksheet对象 workbook writer.book # 设置格式 header_format workbook.add_format({ bold: True, text_wrap: True, valign: top, fg_color: #D7E4BC, border: 1 }) # 应用格式 for sheet_name in writer.sheets: worksheet writer.sheets[sheet_name] for col_num, value in enumerate(df.columns.values): worksheet.write(0, col_num, value, header_format) worksheet.autofit()5. 进阶优化与自动化5.1 封装为可执行脚本将上述代码保存为zt_analysis.py添加命令行参数支持import argparse def main(): parser argparse.ArgumentParser(description涨停板分析工具) parser.add_argument(date, typestr, help分析日期格式YYYYMMDD) args parser.parse_args() # 在此调用前面的分析代码 # 使用args.date代替硬编码的日期 print(f正在分析{args.date}的涨停数据...) if __name__ __main__: main()5.2 设置定时任务对于Windows用户可以使用任务计划程序Linux/macOS用户可以使用cron# 每天15:30运行分析脚本假设收盘后 30 15 * * * /usr/bin/python3 /path/to/zt_analysis.py $(date %Y%m%d)5.3 添加邮件通知功能使用smtplib自动发送分析报告import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.text import MIMEText from email import encoders def send_email_with_report(date): msg MIMEMultipart() msg[From] your_emailexample.com msg[To] recipientexample.com msg[Subject] f{date}涨停分析报告 body f附件为{date}涨停分析报告请查收。 msg.attach(MIMEText(body, plain)) filename f./{date}_涨停分析报告.xlsx attachment open(filename, rb) part MIMEBase(application, octet-stream) part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header(Content-Disposition, fattachment; filename {filename}) msg.attach(part) server smtplib.SMTP(smtp.example.com, 587) server.starttls() server.login(your_emailexample.com, your_password) text msg.as_string() server.sendmail(your_emailexample.com, recipientexample.com, text) server.quit()6. 实际应用中的注意事项数据更新频率akshare的数据通常在收盘后30分钟到1小时内更新过早运行脚本可能获取不到当日数据节假日处理添加简单的日期验证避免在非交易日运行from datetime import datetime def is_trading_day(date_str): date_obj datetime.strptime(date_str, %Y%m%d) # 简单的周末判断实际应用中需要结合节假日日历 return date_obj.weekday() 5 # 0-4表示周一到周五错误处理添加适当的异常处理使脚本更健壮try: df ak.stock_zt_pool_em(date) if df.empty: print(f{date}无涨停数据或数据尚未更新) exit() except Exception as e: print(f获取数据失败: {e}) exit()数据存储考虑将历史数据保存到数据库以便长期分析import sqlite3 def save_to_db(df, date): conn sqlite3.connect(zt_analysis.db) df[date] date # 添加日期列 df.to_sql(zt_data, conn, if_existsappend, indexFalse) conn.close()这套工具在实际使用中可以根据个人需求不断扩展比如添加自定义涨停原因标注、结合技术指标筛选、与自选股列表对比等功能。对于时间紧张的投资者来说这种自动化解决方案可以节省大量手动整理数据的时间把更多精力放在分析决策上。