ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

akshare+PyQt5 打造涨停股池复盘工具,联动通达信本地数据

akshare+PyQt5 打造涨停股池复盘工具,联动通达信本地数据 1. 复盘场景与数据链路拆解akshare 涨停股池怎么落到桌面工具里做短线复盘的人大多有个共同痛点收盘后打开行情软件涨停列表能看但想按「首板 / 二连板 / 三连板及以上」分类统计、想批量看涨停原因、想双击直接跳到 K 线往往要在好几个软件之间来回切。我试过用 Excel 手动导一天两天还行连续一周就坚持不下去了。所以这篇就聊一个能自己跑起来的小工具用 akshare 拉当日涨停股池用 PyQt5 做桌面复盘界面再读取通达信本地行情文件做联动展示。先把「是什么、能做什么、适合谁」说清楚。akshare 是一个开源的金融数据接口库stock_zt_pool_em这类接口能直接返回当日涨停股池字段包含代码、名称、涨跌幅、封单资金、首次封板时间、最后封板时间、炸板次数、连板数、所属行业等。PyQt5 是 Python 的桌面 GUI 框架QTableWidget做表格、QLineEdit做筛选、QTextEdit做详情区都很成熟。通达信本地数据则是很多人电脑里已经存好的日线、分钟线文件路径一般在安装目录的vipdoc下。三者串起来就是一个「数据拉取 → 界面展示 → 本地行情联动」的闭环。适合谁适合有一点 Python 基础、想自己掌控复盘流程的散户或量化入门者。你不需要会写复杂前端PyQt5 的控件拖一拖、信号槽连一连就能出效果。整个工具的核心逻辑其实就三块数据层akshare 请求 通达信文件读取、界面层PyQt5 表格与筛选、联动层单击显示详情、双击调起通达信。下面按可跟做的顺序拆开讲每一步都给可复制的代码和参数。需要提醒的是akshare 接口返回的是当日盘中/收盘后的数据字段名偶尔会随版本调整所以代码里我建议用.get()或先打印columns核对别硬编码下标。通达信文件是二进制格式读取要用struct解析路径和文件名规则后面会给全。工具本身不涉及任何行情预测只是把公开数据和本地文件整理到一个界面里方便你自己看。2. TaoToken 前置准备给工具接一个稳定的模型调用入口这个复盘工具本身不依赖大模型也能跑但如果你想在界面里加一个「涨停原因自动归纳」或者「复盘笔记润色」的小功能就需要一个模型调用入口。我用的是 TaoToken它的定位是给开发者提供统一的模型 API 接入官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。下面这部分是前置准备跟后面的 akshare、PyQt5 主逻辑是解耦的你可以先跳过等主工具跑通再回来接。先说清楚它解决什么问题。你在本地写 Python 脚本调模型最烦的是不同模型厂商的 Base URL、鉴权头、请求体格式都不一样换一个模型就要改一遍代码。TaoToken 把这些统一成 OpenAI 兼容格式你只要改base_url和model两个字段其余请求代码不用动。对于这个复盘工具来说意味着你可以在「涨停原因归纳」按钮里固定一套请求逻辑想换模型只改配置。接入步骤很直接。第一步去控制台创建 API Key地址是 https://taotoken.net/console/api-keys 登录后在 API Keys 页面新建一个复制出来保存好注意它只显示一次。第二步确认你要用的模型 ID可以在模型对话页面 https://taotoken.net/models 先试一下对话确认模型可用、响应正常再写进代码。第三步把 Base URL 填成https://taotoken.net/api注意结尾不要多加/v1之外的路径OpenAI 兼容客户端一般会自动补/chat/completions。这里给一个最小可运行的 Python 调用片段用的是openai官方 SDK装好pip install openai即可from openai import OpenAI client OpenAI( api_key你的_TaoToken_API_Key, base_urlhttps://taotoken.net/api ) resp client.chat.completions.create( model你控制台里确认可用的模型ID, messages[ {role: system, content: 你是A股复盘助手用一句话归纳涨停原因。}, {role: user, content: 股票某某股份行业半导体连板数2} ], temperature0.3 ) print(resp.choices[0].message.content)如果你更习惯用配置文件管理可以建一个config.json把 Key 和模型 ID 放进去代码里读取避免硬编码泄露。这个文件记得加进.gitignore。对于长期做编码和 Agent 类任务的人TaoToken 也有 Coding Plan 可以看 https://taotoken.net/coding-plan 不过这个复盘工具用按量调用就够了不必上套餐。踩过的坑提醒一句如果你在 PyQt5 界面里直接同步调模型界面会卡住因为请求是阻塞的。正确做法是把模型调用放到QThread子线程里通过信号槽把结果传回主线程更新QTextEdit。这个后面在联动部分会再提。另外Key 不要写进打包后的 exe 里明文暴露建议运行时从环境变量或外部配置文件读。3. 可复制配置akshare 涨停接口 PyQt5 表格 通达信目录参数这一节是全文的核心给全可复制的代码和配置。先装依赖pip install akshare pyqt5 pandasakshare 拉当日涨停股池的调用很简洁接口是stock_zt_pool_em参数date传YYYYMMDD格式不传默认取最近交易日。返回的是 DataFrame字段包括代码、名称、涨跌幅、最新价、成交额、流通市值、总市值、换手率、封板资金、首次封板时间、最后封板时间、炸板次数、涨停统计、连板数、所属行业。注意连板数是判断首板/二连板/三连板及以上的关键字段。import akshare as ak import pandas as pd def fetch_zt_pool(date_strNone): # date_str 形如 20240628None 则取最近交易日 df ak.stock_zt_pool_em(datedate_str) if date_str else ak.stock_zt_pool_em() # 打印字段核对akshare 版本不同字段可能微调 print(df.columns.tolist()) # 统一连板数类型避免字符串比较出错 df[连板数] pd.to_numeric(df[连板数], errorscoerce).fillna(1).astype(int) return df拿到 DataFrame 后按连板数分类连板数 1是首板 2是二连板 3是三连板及以上。界面用QTabWidget分四个页签全部、首板、二连板、三连板及以上。每个页签里放一个QTableWidget列就取代码、名称、涨跌幅、封板资金、首次封板时间、连板数、所属行业。PyQt5 表格配置的关键参数setEditTriggers(QAbstractItemView.NoEditTriggers)禁止编辑setSelectionBehavior(QAbstractItemView.SelectRows)整行选中setSelectionMode(QAbstractItemView.SingleSelection)单选horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)列宽自适应。筛选控件用一个QLineEdittextChanged信号连到过滤函数按名称或代码模糊匹配。通达信本地数据目录参数默认安装路径下是C:\new_tdx\vipdoc里面按市场分sh上海和sz深圳再分lday日线、minline分钟线。日线文件名规则是sh600000.day、sz000001.day即市场前缀 6 位代码 .day。每个.day文件由若干条 32 字节记录组成解析用struct.unpack格式字符串是IIIIIfII依次是日期、开、高、低、收、成交额、成交量、保留。日期是YYYYMMDD整数价格需要除以 100。import struct, os TDX_DIR rC:\new_tdx\vipdoc def read_tdx_day(code): # code 形如 600000 或 000001 market sh if code.startswith((6, 9)) else sz path os.path.join(TDX_DIR, market, lday, f{market}{code}.day) if not os.path.exists(path): return [] bars [] with open(path, rb) as f: buf f.read() for i in range(0, len(buf), 32): rec struct.unpack(IIIIIfII, buf[i:i32]) bars.append({ date: rec[0], open: rec[1] / 100, high: rec[2] / 100, low: rec[3] / 100, close: rec[4] / 100, amount: rec[5], volume: rec[6], }) return bars把这三块拼起来主窗口逻辑就是启动时调fetch_zt_pool填充四个表格单击某行把该行代码和名称写到右侧QTextEdit同时调read_tdx_day读最近 30 根日线做简单展示双击某行用QProcess或os.startfile调起通达信并传入代码。通达信支持命令行参数-stock跳转但不同版本参数名有差异稳妥做法是双击时把代码复制到剪贴板并弹提示或者用pywinauto做窗口自动化这部分按你本地版本调。4. 验证请求与成功结果跑通一次当日复盘并核对字段代码写完别急着打包先跑一次验证。第一步单独测 akshare 接口确认能拿到数据、字段名对得上df fetch_zt_pool() print(df.shape) print(df.head(3).to_string()) print(df[连板数].value_counts())正常输出应该是一个几十到上百行的 DataFrame连板数的分布里 1 占大多数2 和 3 及以上依次减少。如果报错KeyError或返回空先检查是不是非交易日或者 akshare 版本太旧pip install -U akshare升级。如果字段名变了用print(df.columns.tolist())看实际列名把代码里的中文列名替换掉。第二步验证通达信文件读取。挑一只你确定本地有数据的股票比如600000调read_tdx_day(600000)打印最后 5 条bars read_tdx_day(600000) for b in bars[-5:]: print(b)成功的话你会看到日期递增、价格在合理区间比如浦发银行个位数到十几块。如果返回空列表八成是路径不对去C:\new_tdx\vipdoc\sh\lday下确认文件名是不是sh600000.day或者你的通达信装在别的盘改TDX_DIR即可。如果价格明显偏大 100 倍说明该版本没做除以 100把/100去掉。第三步启动 PyQt5 界面确认四个页签都有数据、筛选框输入代码能过滤、单击行右侧详情更新、双击能触发联动。这一步的「成功结果」是界面不卡顿、表格数据与 akshare 返回一致、详情区显示的代码与选中行一致。我建议在fetch_zt_pool后加一行日志把行数和抓取时间写到log.txt方便排查「今天为什么没数据」。第四步字段核对。重点核对连板数、首次封板时间、封板资金三个字段。首次封板时间是HHMMSS格式的整数或字符串展示时格式化成09:35:00更好读。封板资金单位是元展示时除以 1e8 转成「亿」。核对方法随便挑一只当天涨停的票去行情软件里对一下封单和连板数一致就说明数据链路没问题。如果你在界面里接了模型做涨停原因归纳验证时先点一只票看QTextEdit是否在 1-2 秒内返回文本。如果界面卡死说明模型调用没放子线程回到第 2 节的QThread方案改。如果返回 401检查 Key 是否复制完整、有没有多余空格如果返回模型不存在回控制台确认模型 ID 拼写。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节把最容易撞的报错集中列一下都是真实会遇到的。401 Unauthorized出现在模型调用时原因通常是 API Key 错误或没带上。检查三点Key 是否从 https://taotoken.net/console/api-keys 完整复制、代码里api_key字段有没有写错、请求头有没有被其他库覆盖。如果你用环境变量确认os.environ.get(TAOTOKEN_KEY)能取到值。401 不会因为模型 ID 错而触发模型错一般是 404 或 400。local proxy failed / connection error这个报错说明请求根本没发出去通常是本地网络环境或代理配置问题。先确认你的base_url写的是https://taotoken.net/api没有多余斜杠或拼错。如果你本地有系统代理Python 的requests/httpx可能读到了错误的代理设置可以在代码里显式传proxies{http: None, https: None}排除。另外检查防火墙有没有拦 Python 进程。这个错跟 Key 无关别去反复重建 Key。reading choices / KeyError choices出现在解析响应时说明返回的 JSON 结构里没有choices字段。常见原因是请求被网关拦截返回了 HTML 错误页或者模型名写错返回了错误对象。排查方法先把原始响应打印出来print(resp)或print(resp.model_dump())看实际返回什么。如果是错误对象里面会有error.message告诉你原因。别直接resp.choices[0]先判断hasattr(resp, choices)。OAuth / 鉴权失败如果你用的是某些需要 OAuth 流程的客户端比如 Claude Code 这类报 OAuth 相关错误通常是认证方式没配对。这类工具一般要求填 Base URL、API Key、Model ID 三件套缺一不可。以 Claude Code 为例需要设置ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY模型 ID 填控制台确认可用的那个。如果你用 CC Switch 或 Cline 的 MCP 配置同样要写全这三项Base URL 用https://taotoken.net/apiKey 用控制台生成的Model ID 别留空。Codex 的auth.json里也是这三项字段名按各工具文档来值别写错。akshare 返回空 / 字段缺失非交易日、接口临时调整、版本过旧都可能。先pip install -U akshare再确认当天是不是交易日。字段缺失就用columns.tolist()核对别硬编码。通达信文件读不出路径错、文件名规则不符、权限不足。确认vipdoc下sh/sz目录存在文件名是sh600000.day这种格式。如果通达信正在运行文件可能被占用先关掉再读。PyQt5 界面卡死所有网络请求和文件读取都别放主线程。用QThread或QRunnable通过pyqtSignal回传结果。模型调用尤其要注意它比 akshare 慢得多。6. 把工具用起来从当日复盘到长期编码的接入路径工具跑通之后日常用法就是收盘后双击 exe等几秒数据加载四个页签扫一遍重点看三连板及以上的票和所属行业分布单击看详情双击跳 K 线。如果你想把「涨停原因归纳」也自动化就在详情区加一个按钮触发模型调用把股票名称、行业、连板数拼成 prompt 发过去结果写回QTextEdit。这套请求逻辑固定下来后换模型只改配置里的 Model ID代码不用动。对于想把这个工具继续做大的比如加历史涨停回溯、加板块热度统计、加复盘笔记导出模型调用的部分会越来越重。这时候可以看看 TaoToken 的 Coding Plan https://taotoken.net/coding-plan 它更适合长期、高频的编码和 Agent 类任务。如果你只是想先验证某个模型在涨停原因归纳上的效果直接去模型对话页面 https://taotoken.net/models 试几句确认输出风格符合预期再写进代码。接入文档在 https://taotoken.net/doc 里面有各语言 SDK 的示例照着改base_url和model就行。最后说个实用技巧打包成 exe 时config.json和log.txt不要打进包内放在 exe 同级目录用sys.executable的路径去定位这样换机器不用重新打包。通达信路径也做成可配置项写在config.json里避免硬编码C:\new_tdx。这样你的复盘工具就能在别人的电脑上也跑起来只需要改一下通达信安装路径。
返回列表