尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

用Python雪球接口pysnowball搭建个人投资数据监控:一份含踩坑记录的新手完整实战指南

用Python雪球接口pysnowball搭建个人投资数据监控:一份含踩坑记录的新手完整实战指南 用Python雪球接口pysnowball搭建个人投资数据监控一份含踩坑记录的新手完整实战指南【免费下载链接】pysnowball雪球股票数据接口 python edition项目地址: https://gitcode.com/gh_mirrors/py/pysnowball先问个扎心的问题你每天花在行情软件上来回翻页、挨个查自选股、再打开基金APP记净值的时间加起来够不够看两集电视剧我过去就是这样。收盘后掏出手机从自选股列表第一只翻到最后一只截图、手抄到Excel里隔几天还要去翻财报数据算指标。坚持了两个月Excel开了七八个Sheet真正用上的信息不到两成还经常因为漏记某天的净值把曲线画断。直到我发现了 pysnowball——一个把雪球股票数据接口封装成几十个Python函数的开源库从此我的盘后流程从手动两小时变成了脚本十秒。这篇文章不是教程搬运而是我用它搭完一套真实在跑的投资体检机器人之后把从零到能用的完整过程、踩过的坑、以及几个值得深挖的原理一次性讲清楚。你读完可以直接照着搭一套属于自己的版本。pysnowball 是什么一句话说完它的价值pysnowball 是雪球股票数据接口的 Python 版本项目描述就一句话——雪球股票数据接口 python edition但干起活来毫不含糊。它把雪球、蛋卷基金等多个数据源里零散的 HTTP 接口整理成了按业务划分的 Python 函数你不需要研究 cookie、签名、分页参数一个ball.xxx()就把数据拿回来了。它的能力清单大致长这样模块代表函数能拿到什么实时行情quotec/quote_detail/pankou/kline批量报价、个股详情、十档盘口、多周期K线财务报表indicator/income/balance/cash_flowROE、营收利润、资产负债、现金流资金动向capital_flow/capital_history/margin资金流向、融资融券、大宗交易F10 资料top_holders/bonus/skholderchg十大股东、分红送配、股东变动基金数据fund_info/fund_nav_history/fund_growth基金基本信息、净值历史、业绩走势其他扩展convertible_bond/index_*/northbound_shareholding_*可转债、指数、北向资金一句话总结股票、基金、指数、可转债、港股通你能想到的常见数据面这里基本都有口子。所有函数名都定义在项目的 pysnowball/init.py 里导入即用。完整实战给我自己写一个盘后投资体检机器人下面进入正题。我的目标很朴素每天收盘后自动完成三件事——扫一遍自选股行情、给持仓股票做一轮财务体检、记录基金的净值变化最后输出一份 Markdown 报告。这套流程跑通后我再也没手动翻过行情软件。第一步装库配 token先踩第一个坑安装没什么好说的pip install pysnowball真正的坑在 token。pysnowball 调用雪球接口需要在请求头里带上你的登录凭证代码里通过set_token注入import pysnowball as ball # token 形如 xq_a_token一串字符;u一串数字 # 获取方式登录雪球网页版用浏览器开发者工具在任意接口请求的 Cookie 里找到这两项 ball.set_token(xq_a_tokenxxxxxxxx;uxxxxxxxx)这里有个小坑值得提醒set_token本质是把 token 写进进程环境变量XUEQIUTOKEN源码见 pysnowball/token.py所以它只在当前进程内有效。你今天设了 token 关掉终端明天再跑脚本如果忘了设置就会直接抛异常Exception: 未设置TOKEN别问我怎么知道的。所以我的建议是别把 token 硬编码在脚本里用环境变量或独立配置文件管理写个小工具函数统一处理import os import pysnowball as ball def init_ball(): 优先读环境变量其次读本地 token 文件保证每次运行都能正确初始化 token os.environ.get(XUEQIUTOKEN) if not token: # 自己维护一个 .xq_token 文件不提交到代码仓库 with open(os.path.expanduser(~/.xq_token)) as f: token f.read().strip() ball.set_token(token) # 顺手验证一下用无需 token 的批量行情接口做连通性检查 data ball.quotec(SH000001) assert data[error_code] 0, token 无效或网络异常 print([OK] 初始化完成)为什么这么设计因为未设置TOKEN这个错出现得极其高频把初始化收敛成一个函数脚本每个入口先调它能省掉大量排查时间。第二步一行代码扫完整个自选股这是 pysnowball 最让我惊喜的地方。quotec支持逗号分隔批量传入一次请求就能拿回一组股票的实时报价import pysnowball as ball init_ball() # 自选股上证 深证注意代码前缀 SH/SZ 不能省 watchlist [SH600519, SZ000858, SH600036, SZ300750, SH601318] quotes ball.quotec(,.join(watchlist)) for q in quotes[data]: print(f{q[symbol]:10} 现价 {q[current]:8} 涨跌 {q[percent]:6.2f}% f成交额 {q[amount]/1e8:.2f}亿 总市值 {q[market_capital]/1e8:.0f}亿)输出类似SH600519 现价 1458.0 涨跌 0.85% 成交额 42.13亿 总市值 18319亿 SZ000858 现价 168.0 涨跌 -1.23% 成交额 35.67亿 总市值 2108亿为什么要这样写因为逐个调用的话5 只股票要发 5 次请求30 只就是 30 次既慢又容易触发限流。批量接口一次搞定脚本执行时间从秒级直接压到毫秒级。字段含义也很直白current现价、percent涨跌幅、amount成交额、market_capital总市值配合pankou十档盘口和quote_detail含市盈率、市净率、换手率的完整详情可以拼出很丰富的看板。第三步给持仓做一次财务体检光看价格没用我每季度还会用财务报表数据给持仓打个分。pysnowball 的finance模块把雪球的财务接口封装得特别顺手indicator业绩指标、income利润表、balance资产负债表、cash_flow现金流量表各管一摊还支持is_annals1只看年报、count控制返回条数import pysnowball as ball def financial_check(symbol, name): 对单只股票做财务体检返回评分明细 # 业绩指标重点看 ROE、毛利率返回结构里每个指标是 [数值, 同比变动] ind ball.indicator(symbol, is_annals1, count5) rows ind[data][list] latest rows[0] roe latest[avg_roe][0] # 加权ROE gross latest[gross_selling_rate][0] # 毛利率 np_ps latest[np_per_share][0] # 每股净利润 # 资产负债表看资产负债率 bal ball.balance(symbol, is_annals1, count5) debt_ratio bal[data][list][0][asset_liab_ratio][0] * 100 # 现金流量表看经营现金流是否为正 cf ball.cash_flow(symbol, is_annals1, count5) ocf cf[data][list][0][ncf_from_oa][0] score 0 score 2 if roe 15 else 1 if roe 8 else 0 score 2 if gross 30 else 1 score 2 if debt_ratio 50 else 1 if debt_ratio 70 else 0 score 2 if ocf 0 else 0 print(f[{name}] ROE{roe:.1f}% 毛利率{gross:.1f}% f负债率{debt_ratio:.1f}% 经营现金流{ocf/1e8:.2f}亿 → 评分 {score}/8) return score这里有个特别贴心的细节indicator返回的每个指标都是[当前值, 同比变化率]的二元组结构等于数据和同比变动一次拿齐我连二次计算都省了。财务体检的价值在于把感觉这公司不错变成ROE 连续三年高于 15%、负债率低于 50%、经营现金流为正这种可比较的数字。第四步把基金净值也纳入监控我的组合里还有几只基金。pysnowball 的基金接口走的是蛋卷基金的通道相关 URL 定义见 pysnowball/api_ref.py 的fund_*部分fund_info拿基本信息fund_nav_history拉历史净值组合起来就能画收益曲线import pysnowball as ball from datetime import datetime def track_fund(code): 抓取基金净值历史返回最近 N 期的 (日期, 单位净值) 列表 info ball.fund_info(code) name info[data][fd_name] nav ball.fund_nav_history(code, page1, size30) items nav[data][items] records [] for it in items: # 蛋卷接口返回的净值日期是毫秒时间戳 day datetime.fromtimestamp(it[nav_date] / 1000).strftime(%Y-%m-%d) records.append((day, it[unit_nav])) latest, prev records[0], records[-1] ret (latest[1] / prev[1] - 1) * 100 print(f[{name}] 最新净值 {latest[1]:.4f} 近{len(records)}期收益 {ret:.2f}%) return records track_fund(008975)这一步的坑在于单位净值日期是毫秒时间戳直接打印会得到一串天书数字必须除以 1000 再转换。我第一版脚本就是忘了这茬报告里全是1714396800000排查了半天。第五步组装成定时任务让脚本替你打工把上面几段拼成一个daily_report.py输出 Markdown 报告再用 cron 在每周五收盘后自动跑# daily_report.py 主流程 def main(): init_ball() lines [# 投资体检报告, f生成时间{datetime.now():%Y-%m-%d %H:%M}, ] lines.append(## 行情速览) for q in ball.quotec(,.join(WATCHLIST))[data]: lines.append(f- {q[symbol]} 现价 {q[current]} 涨跌 {q[percent]}%) lines.append(## 财务体检) for code, name in HOLDINGS.items(): financial_check(code, name) lines.append(## 基金跟踪) for code in FUNDS: track_fund(code) with open(report.md, w) as f: f.write(\n.join(lines)) print(报告已生成report.md) if __name__ __main__: main()# crontab -e每周五 15:30 自动执行 30 15 * * 5 cd /path/to/your/project python daily_report.py cron.log 21至此那个每天手动翻两小时的习惯彻底退役了。脚本跑完后我只需要花五分钟读报告剩下的时间去看书。进阶专题一搞懂 token 机制从此不再被未设置TOKEN折磨前面说了 token 会写进环境变量这里再往深挖一层因为理解它对你排查问题帮助极大。看 pysnowball/utls.py 的源码会发现所有请求都经过一个fetch函数它做三件事拼上伪装成雪球 iPhone 客户端的请求头、从token.get_token()读 cookie、发请求并校验状态码。关键就在这行response requests.get(url, headersHEADERS)HEADERS 里长这样HEADERS {Host: host, Accept: application/json, Cookie: token.get_token(), User-Agent: Xueqiu iPhone 14.15.1, ...}也就是说pysnowball 的本质是一个把模拟雪球客户端请求这件事封装好的 HTTP 客户端。它没有偷偷替你登录而是把登录凭证的注入责任交给你。两个细节值得记住部分接口不需要 token。比如quotec走的是fetch_without_token不带头部 cookie 也能返回数据。这意味着你哪怕 token 配错了行情接口也可能正常但quote_detail、pankou这类接口会失败——排查时要先确认问题出在哪个接口上。token 有有效期。雪球的 cookie 隔一段时间会失效表现就是脚本昨天还好好的今天突然报错或者返回异常数据。解法是写个连通性自检像我在init_ball里做的那样一旦失败就提示重新抓 token而不是让脚本带病运行。进阶专题二用多周期 K 线做一次最简单的均线策略kline是另一个值得玩透的接口。它的第二个参数period支持day日K、week周K、month月K、60m60分钟、30m30分钟、1m1分钟第三个参数count控制返回条数接口定义在 pysnowball/realtime.pydef kline(symbol, periodday, count284): return utls.fetch(api_ref.kline.format(symbol, int(time.time()*1000), period, count))默认返回 284 条而且注意 URL 里 count 是负号——雪球接口用负数表示向前取 N 根。返回的item是一个二维数组每行依次是[时间戳, 开盘, 收盘, 最高, 最低, 成交量, 成交额, ...]。利用它30 行代码就能算出一条均线信号import pysnowball as ball from datetime import datetime def ma_signal(symbol, short5, long20): 基于日K收盘价判断 5 日/20 日均线的金叉死叉 data ball.kline(symbol, periodday, countlong 5) closes [row[2] for row in data[data][item]] # 每行第3列是收盘价 ma_short sum(closes[-short:]) / short ma_long sum(closes[-long:]) / long prev_short sum(closes[-short-1:-1]) / short prev_long sum(closes[-long-1:-1]) / long if prev_short prev_long and ma_short ma_long: return f{symbol} 今日金叉信号 if prev_short prev_long and ma_short ma_long: return f{symbol} 今日死叉信号 return f{symbol} 无信号 (MA{short}{ma_short:.2f}, MA{long}{ma_long:.2f}) for code in [SH600519, SZ000858, SH600036]: print(ma_signal(code))这段代码的价值在于展示了一条完整链路接口封装帮你把发请求、带 token、解析 JSON全干掉你只需要关心数据处理本身。从想要数据到拿到可计算的收盘价序列中间只有一行调用。五个高频问题与我的解法Q1报错未设置TOKEN但明明设过了多半是换了终端或重启了进程环境变量丢了。回到进阶专题一token 只在当前进程生效写个init_ball()统一初始化每次运行先调它。Q2返回结果里error_code不是 0 怎么办说明请求本身没通比如参数格式错了、股票代码前缀写反了。先检查代码格式A股必须带SH/SZ前缀基金用纯数字代码。再检查 token 是否过期。Q3quotec和quote_detail有什么区别用哪个quotec是轻量批量接口支持多只股票逗号拼接适合快速刷屏quote_detail返回单只股票的完整信息市盈率、市净率、52周高低点、分红率等字段更全但一次只能查一只。场景不同选不同的工具。Q4请求发多了会不会被封会。我在测批量循环时把脚本写岔过短时间连发几百次请求直接被限流。建议在循环里加time.sleep()控制频率批量数据能合并成一次请求的比如quotec就绝不拆开。Q5基金接口拿到的数据结构和股票不一样对基金的fund_*系列走的是蛋卷基金通道返回结构和股票接口完全不同而且单位也各不同净值日期是毫秒时间戳。写解析代码前先print()一次原始返回看清楚结构再动手别凭猜。收尾从两小时到十秒这笔账很划算最后算一笔直观的账。改造前我每个交易日的盘后流程是打开雪球挨个看 5 只自选股约 15 分钟→ 翻持仓的财务数据约 30 分钟→ 查 3 只基金净值并更新 Excel约 15 分钟→ 汇总整理约 30 分钟。加起来 90 分钟起步还经常忘。改造后项目改造前改造后单日耗时约 90 分钟手动操作脚本 10 秒 读报告 5 分钟数据完整度常漏记、靠记忆行情财务基金全量落盘出错概率手抄错行、漏更净值脚本稳定token 自检兜底沉淀价值数据散落在 ExcelMarkdown 报告可追溯、可对比如果你也在做个人投资记录、量化策略研究或者只是懒得天天翻软件pysnowball 值得你花一个晚上搭一套自己的监控脚本。安装、初始化、调通第一个接口总共不超过 30 分钟剩下的就是让数据开始替你说话。克隆项目仓库后照着跑起来git clone https://gitcode.com/gh_mirrors/py/pysnowball cd pysnowball pip install -r requirements.txt配合 README.md 里的接口示例实时行情、K线、财务、资金流向都有现成代码很快你也能拥有一套属于自己的数据自动化流水线。【免费下载链接】pysnowball雪球股票数据接口 python edition项目地址: https://gitcode.com/gh_mirrors/py/pysnowball创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表