ARTICLE DETAIL

资讯详情

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

OpenClaw+Tushare:一句话自动下载股票日线数据

OpenClaw+Tushare:一句话自动下载股票日线数据 如果你也像我一样每天开盘前要手动去跑一遍股票数据脚本大概率能体会这种感受Tushare的Python脚本写得再顺手日子一长还是会烦——今天忘了跑、明天输出路径改了、后天换了个股票代码又要改参数。我最后的状态是把OpenClaw这个开源AI代理框架拉进了工作流把下载股票数据从手动脚本彻底变成了一句自然语言指令的事。这篇文章不是单独讲OpenClaw也不是单独讲Tushare而是把两者串成一条完整可复现的链路OpenClaw负责理解你的需求、调度技能、执行任务Tushare负责提供免费且结构化的A股日线行情。内容适合已经会用Python、想自己拉数据做回测或自建看板的人也适合刚接触AI代理、想找一个真实落地场景的读者。下文涉及的环境是Windows WSL2 Node.js Python如果你在别的平台思路同样能迁移。1. OpenClaw到底解决了什么问题从手动拉数到一句话执行1.1 OpenClaw是什么一个能自己跑任务的AI代理框架先给没接触过OpenClaw的朋友一个定位。它本质上是一个开源的AI代理框架核心能力是理解自然语言指令 → 调用注册好的能力skill→ 完成任务并返回结果。你可以把它理解成一个会使用工具的实习生你不用告诉它每一步怎么按只要说清楚目标它自己去匹配对应的技能包然后执行。这个定位和普通的命令行工具、定时脚本有本质区别。命令行工具是你给它精确参数它才动少一个参数就报错OpenClaw则是你把意图告诉它它负责把意图翻译成一串可执行的调用。放在股票数据的场景里就是以前你写一个python download.py 000001.SZ 20240101 20241231每次都要手动敲参数现在你对着OpenClaw说帮我把平安银行2024年的日线数据下载到data目录它会自己拼参数、调脚本、告诉你结果。OpenClaw的模型后端可以自由切换。既可以用Ollama等本地推理服务也可以接兼容OpenAI格式的云端API所以它不是什么封闭产品而是一个代理外壳 模型后端 技能包的组合。这种架构最大的好处是模型负责理解和拆解需求具体的脏活累活爬数据、算指标、写文件全部交给你自己写的Python脚本既灵活又可控。1.2 为什么数据源选Tushare免费额度、稳定性与边界在数据源这件事上我其实对比过好几条路最后长期用的是Tushare。原因有三条都很实际。第一免费。Tushare的基础接口对个人用户是免费开放的注册之后拿到token就能调。对于不需要Level2逐笔成交、不需要高频分钟线的普通回测场景免费额度完全够用。第二稳定。它的数据经过了清洗和结构化管理返回的是规整的DataFrame字段命名统一文档也相对齐全。这点对自动化流程特别重要——因为一旦接入定时任务你就没法天天人肉检查数据质量。第三有明确的权限体系。Tushare用积分来控制接口访问比如拉日线行情的daily接口需要一定积分门槛。这听起来是缺点实际上恰恰是它比非官方接口靠谱的原因有门槛意味着有人维护、有版本迭代接口不会突然人间蒸发。我也试过热搜里提到的东财股票数据API。它不需要token、数据也全但是属于非官方接口前端接口的字段和返回结构说变就变今天能用的解析代码明天可能就废了。如果你做的是长期定时任务我不建议把核心链路建立在随时可能失效的接口上。Tushare这类有正式文档、有积分体系的平台更适合作为自动化数据管道的地基。1.3 整条链路怎么串起来意图、技能、脚本三层OpenClaw Tushare这套方案本质上是一个三层结构意图层你对OpenClaw说一句自然语言比如把贵州茅台近一年的日线行情下载下来技能层OpenClaw根据语义匹配到预先写好的get_stock_data技能包解析出股票代码、时间范围、输出路径执行层技能包里的Python脚本拿着参数去调Tushare接口把数据写成CSV或者SQLite再把执行结果反馈给OpenClaw最后由OpenClaw用一句话汇报给你。这个结构的好处是每一层都可以独立替换。今天你觉得某个模型理解能力太弱换一个模型后端就行明天你想把CSV改成SQLite只动执行层的脚本后天你想增加K线图生成加一个技能包就行不用推翻整套架构。下面我会按照这个结构一步步搭建。2. 部署前的环境准备先修好WSL2再装OpenClaw2.1 无法安全验证WSL2环境的排查与修复我在Windows上装OpenClaw时第一次启动就撞上了热搜里那个典型问题无法安全验证WSL2环境请在PowerShell中运行 wsl --status 解决报告的问题。这个提示相当误导人我第一次看到还以为是OpenClaw坏了其实问题几乎都出在Windows的WSL2环境本身。先说排查路径。打开PowerShell依次跑这三条命令wsl --status wsl --version wsl --list --verbose重点看三件事wsl --status里是否显示默认版本为2wsl --version是否有版本号输出没有说明内核组件缺失或版本过老wsl --list --verbose里你装的发行版是不是显示为2如果显示为1说明这个发行版还跑在WSL1上。我遇到的情况是第三种发行版跑在WSL1上OpenClaw检测到环境不满足要求直接拒绝启动。修复方法# 以管理员身份运行PowerShell启用虚拟机平台 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /norestart # 启用WSL功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /norestart # 重启电脑后更新WSL内核 wsl --update # 把默认版本设为2 wsl --set-default-version 2 # 再把具体发行版迁移到WSL2 wsl --set-version 发行版名称 2跑完wsl --set-version后系统会做一次完整的磁盘格式转换耐心等它走完。转换完成后重新执行wsl --status一切正常的话OpenClaw就不会再报这个错了。如果你装的是纯Docker Desktop模式同样要确认Docker引擎跑在WSL2后端否则自动化脚本的执行环境可能不稳定。2.2 Node.js与OpenClaw的安装澄清一个热搜词热搜词里有一条是node.js官网下载openclaw这里我得纠正一个理解偏差OpenClaw本体不是从Node.js官网下载的Node官网下载的是运行时也就是OpenClaw运行所依赖的Node.js环境。操作顺序是去nodejs.org下载LTS版本长期支持版一路默认安装用npm全局安装OpenClawnpm install -g openclaw初始化项目目录openclaw init my-stock-agent cd my-stock-agent这三个步骤里最常见的问题是npm安装源慢或者网络超时。在国内环境下我建议先把npm源切换成可用的镜像源再执行安装速度会快很多。不同版本的OpenClawCLI命令措辞可能不一样如果init命令不存在直接敲openclaw --help看当前版本的用法不用死记命令。2.3 算力来源Ollama本地模型还是云端API搜热词里还有一条很典型OpenClaw只能用接入API的方式使用算力吗——答案是否定的。OpenClaw是完全支持本地推理的而且对于拉股票数据这种结构化任务本地小模型完全够用。我当前的配置是 Ollama Qwen2.5 7B 这样的本地小模型。拉数据这个任务没有太多自由发挥空间关键是把用户想要什么股票、什么时间段准确解析成参数7B参数量级的模型在指令遵循上已经做得不错。本地跑的另一个好处是隐私和成本——所有请求都在自己机器里转token不经过第三方服务长期用下来也没有按量计费的心疼。如果你觉得本地模型解析参数偶尔不准或者机器性能跑不动大模型可以退而求其次给OpenClaw接一个兼容OpenAI格式的API接口。我把两种模式放在表格里对比方便你选对比项Ollama本地模型兼容OpenAI的云端API成本完全免费电费自理按token计费有免费额度但要注册隐私数据不出本机指令会发到远端服务响应速度取决于显卡/内存7B模型通常几秒网络往返通常1-3秒部署难度需装Ollama拉模型镜像只需填API Key适合场景定时任务、结构化参数解析复杂的语义理解、长对话我的建议是优先尝试Ollama本地方案。先ollama pull qwen2.5:7b再在OpenClaw配置文件里把模型端点指向http://localhost:11434/v1剩下的让OpenClaw去适配。这套方案对股票数据任务来说是性价比最高的。3. Tushare免费数据链路Token、Python脚本与数据落地3.1 注册与Token免费额度的正确打开方式Tushare的注册流程很直观在官网注册账号进入个人主页就能看到你的token一串四十位左右的字符串。这个token就是你的身份凭证Python脚本里通过ts.set_token(你的token)来绑定。但要注意积分门槛。Tushare几乎所有接口都有积分要求新注册用户的积分通常不到120分而日线行情接口daily需要120分。如果直接调用会收到权限不足的错误。提升积分的方式包括完善个人信息、在社区发文、参与平台任务等这部分按官方指引操作即可。我的建议是先确认积分到位再往下走否则会卡在第一步。还有一个血的教训token不要硬编码写死在公开仓库里。因为token代表你的账号身份泄露之后别人可以拿你的配额去刷数据。我是用一个.env文件单独存放tokenPython脚本里用os.getenv(TUSHARE_TOKEN)读取这样既安全又不影响使用。3.2 最小可用的数据脚本拉取指定股票日线先看一个最简可用的Python脚本这是整个链路的地基import os import pandas as pd import tushare as ts # 读取token并初始化 ts.set_token(os.getenv(TUSHARE_TOKEN)) pro ts.pro_api() def download_daily(ts_code: str, start_date: str, end_date: str, output: str): 下载日线行情并保存为CSV ts_code: 股票代码如 000001.SZ start_date/end_date: YYYYMMDD 格式 output: 输出CSV路径 df pro.daily( ts_codets_code, start_datestart_date, end_dateend_date ) if df is None or df.empty: print(f没有拉到数据检查股票代码和日期范围{ts_code} {start_date}~{end_date}) return # Tushare默认按日期倒序这里按日期正序排好 df df.sort_values(trade_date).reset_index(dropTrue) df.to_csv(output, indexFalse) print(f已保存 {len(df)} 条记录到 {output}) return df if __name__ __main__: download_daily(000001.SZ, 20240101, 20241231, data/000001_daily_2024.csv)这个脚本做的事情很简单调用pro.daily拉指定区间日线排序后存成CSV。有两个容易被忽视的点我提一下。第一是接口返回的日期是字符串形式的YYYYMMDD排序时直接按字符串排序即可因为格式恰好保证了字典序等于时间序。第二是空返回的处理——新股上市晚于开始日期、停牌期间无记录、代码写错都可能返回空DataFrame脚本里必须打印明确提示否则OpenClaw只能干巴巴地告诉你没拉到数据你根本不知道是哪里出了问题。实际运行前先装依赖pip install tushare pandas python-dotenv3.3 数据落地设计CSV还是SQLite数据落地方式会影响后续所有环节我给三个建议按场景选只做一次性回测直接存CSV简单直观Excel能打开pandas读起来也快。要做增量更新用SQLite因为你每天只追加新日期全量重写CSV很浪费。数据量大、要做特征工程考虑parquet格式压缩率高、读取快但生态稍微重一点。我自己日常用的是SQLite。建表语句大致这样CREATE TABLE IF NOT EXISTS daily ( ts_code TEXT, trade_date TEXT, open REAL, high REAL, low REAL, close REAL, pre_close REAL, change REAL, pct_chg REAL, vol REAL, amount REAL, PRIMARY KEY (ts_code, trade_date) );以(ts_code, trade_date)作为联合主键天然去重重复拉取同一交易日的数据不会产生脏记录。你可能会问OpenClaw在这一层扮演什么角色它的角色是调度大脑数据落库的细节它不关心但它要知道脚本执行后有没有成功、影响了几行数据这样它才能汇报结果。所以脚本的print输出要尽可能结构化方便OpenClaw理解执行状态。4. 把数据能力封装成OpenClaw Skill目录、配置与联动4.1 Skill的目录结构与配置写法OpenClaw的skill机制是它最实用的部分。一个skill就是一个自包含的能力包通常长这样skills/ get_stock_data/ SKILL.md # 技能描述给模型看触发条件和参数说明 download.py # 实际执行数据下载的Python脚本 requirements.txt # Python依赖清单 .env.example # 环境变量模板SKILL.md是这个技能包的说明书模型靠它来判断什么时候该用这个技能、参数怎么填。我写的SKILL.md大概是这样--- name: get_stock_data description: 下载A股日线行情数据。当用户要求下载股票数据拉取日线获取某只股票行情时使用。 args: ts_code: type: string description: 股票代码交易所后缀不能省略如 000001.SZ、600519.SH required: true start_date: type: string description: 开始日期格式 YYYYMMDD默认20200101 required: false end_date: type: string description: 结束日期格式 YYYYMMDD默认今天 required: false output: type: string description: 输出文件路径默认data/daily_{ts_code}.csv required: false ---注意description字段的写法。模型触发技能靠的是语义匹配如果你写得过于宽泛比如处理股票相关需求模型可能在用户问今天股市怎么样时也触发它导致误调用。写清楚下载日线行情数据这个狭窄范围反而准确。4.2 让OpenClaw调用Python脚本的参数传递SKILL.md定义好之后OpenClaw拿到自然语言指令会解析出args里的参数然后调用Python脚本。为了配合这种调用方式脚本入口要改成能从命令行读取参数比如import argparse def main(): parser argparse.ArgumentParser() parser.add_argument(--ts_code, requiredTrue) parser.add_argument(--start_date, default20200101) parser.add_argument(--end_date, defaultdatetime.today().strftime(%Y%m%d)) parser.add_argument(--output, defaultdata/daily.csv) args parser.parse_args() download_daily(args.ts_code, args.start_date, args.end_date, args.output) if __name__ __main__: main()这里有个经验调用方OpenClaw传递参数时不一定严格按顺序而是按关键字传参所以脚本里用--参数名这种形式而不是裸位置参数能最大程度减少解析错误。另外默认值要设计得聪明——用户只说下载平安银行日线没说日期OpenClaw就把开始日期默认成20200101、结束日期默认今天不至于因为缺参数而报错。4.3 实战对话测试从一句指令到一份CSV装好skill之后用一句话做端到端测试。我当时的指令是把平安银行000001.SZ2024年全年的日线数据下载下来存到data目录。OpenClaw的处理过程大致是这样的语义匹配命中get_stock_data技能参数解析ts_code000001.SZstart_date20240101end_date20241231outputdata/000001_daily_2024.csv执行脚本进入skill目录跑python download.py --ts_code 000001.SZ --start_date 20240101 --end_date 20241231 --output data/000001_daily_2024.csv捕获输出脚本打印已保存242条记录到data/000001_daily_2024.csvOpenClaw把这句话整理成对用户的回复。整个过程不需要你打开终端手动敲命令也不需要你记住脚本参数。第一跑通的时候我还专门看了下输出文件确认是242条记录和交易日历一致数据没问题。这一步成功就说明OpenClaw Tushare的核心链路已经跑通了。5. 实测运行中必踩的坑与解决链路5.1 WSL2状态问题的完整排查链路续第一节提过WSL2环境检测的问题这里把完整的排查链路展开讲因为这类问题最容易在换了机器、重装了系统、升级了Windows之后反复出现。完整链路是OpenClaw报无法安全验证WSL2环境先不要动OpenClaw配置打开PowerShell跑wsl --status确认默认版本是否为2如果显示版本不是2跑wsl --list --verbose看具体发行版状态如果发行版是1跑wsl --set-version 名称 2升级如果发行版状态是Stopped或者显示正在安装卡住跑wsl --shutdown重启WSL服务升级完成后再跑wsl --version能显示版本号才算真正就绪最后重启OpenClaw让它的环境检测重新执行。这七步里最容易忽视的是第五步。很多时候WSL2发行版处于一种半启动半卡死的状态表面上看已经安装了实际服务没起来。wsl --shutdown这个命令能强制清理所有WSL进程类似重启大法解决这类玄学问题非常有效。5.2 定时任务的选型Windows计划任务还是WSL cron数据链路跑通以后下一个需求通常就是每天早上自动拉数据。定时方案我对比过两个各有适用场景对比项Windows计划任务WSL cron触发稳定性依赖Windows休眠策略笔记本容易漏跑只要WSL发行版在运行就稳定触发配置难度图形界面但参数填错不易发现一条crontab命令直观环境变量需要手动配置Python路径直接用WSL内的Python环境适合场景偶尔手动任务每天固定执行的数据管道我自己最终选了WSL cron因为OpenClaw本来就跑在WSL2里同一套Python环境不需要跨环境传参数。配置方式是crontab -e加一行40 8 * * 1-5 /usr/bin/python3 /home/user/my-stock-agent/skills/get_stock_data/download.py --ts_code 000001.SZ --start_date 20240101 --end_date 20241231 --output /home/user/data/daily.csv /home/user/logs/daily.log 21注意几个细节。日期范围建议写成动态计算——end_date用今天、start_date用一年前的今天可以在脚本里用Python的datetime计算不要硬编码。日志重定向必须加上否则cron的执行结果你看不到出错了都不知道。另外 WSL2 的cron服务默认不随开机自启需要在.bashrc或者Windows启动项里加一行sudo service cron start否则重启电脑后定时任务不会自动恢复。如果你机器经常休眠Windows计划任务反而是更可靠的方案因为Windows在休眠唤醒后能补跑错过的任务。但配置的时候一定记得选不管用户是否登录都要运行并且把Python解释器的绝对路径写清楚两个细节能避免大半的计划任务看起来配了但没跑的问题。5.3 Tushare限频与增量更新避免天天全量拉免费接口不可能没限制。Tushare对调用频率有控制不同积分对应不同阈值。初期积分不高的时候连续大量调用很容易触发限频报错信息通常是抱歉您每分钟最多访问该接口X次。我的做法是批量下载多只股票时在for循环里主动sleepimport time ts_codes [000001.SZ, 600519.SH, 300750.SZ] for code in ts_codes: download_daily(code, start, end, fdata/{code}.csv) time.sleep(1.5) # 主动限速避免触发接口频控time.sleep(1.5)这个间隔是经验值。3000多只股票全量跑一遍要一个多小时但作为每日增量任务不需要全量所以完全够用。增量更新更重要。具体思路是每次拉数据前先查SQLite里已有的最大日期只拉max_date之后到昨天的数据def get_max_date(ts_code: str, conn) - str: cur conn.execute(SELECT MAX(trade_date) FROM daily WHERE ts_code ?, (ts_code,)) return cur.fetchone()[0] or 00000000然后用这个日期作为start_date去调daily接口。这样每天新增的数据量很小60秒内能全部跑完也不会触发限频。这个增量逻辑配合SQLite的主键去重数据管道才算真正闭环每天早上跑一遍新数据入库老数据不重不漏。这个内容后续要扩展的话方向其实很多加个技术指标计算的skill让OpenClaw把均线、MACD直接算好入库或者让它每天收盘后生成一份摘要文件告诉你今日XX板块涨幅靠前的是哪些再或者对接一个可视化看板工具让数据从躺在本地的CSV变成看得见的图表。但不管往哪个方向走OpenClaw Tushare这套基础链路已经足够稳定剩下的就是在上面叠你想要的能力了。
返回列表