1. 为什么先做数据获取,而不是先写策略
很多人一上手就想让 Claude Code 直接吐出一个「明天买什么」的结论,结果卡在第一步:模型不知道今天的龙虎榜长什么样。股票交易 Skill v1.0 的定位很明确——它不是一个预测黑箱,而是一条可复现的数据流水线。你给它一个交易日,它把当天龙虎榜的原始明细落到本地 CSV,再顺手打印一份摘要。后面无论是算席位胜率还是生成信号,都从这份 CSV 出发。
这个思路对两类人特别有用。一类是刚接触 Claude Code Skill 机制、想找个真实项目练手的开发者;另一类是有交易经验但不想每天手动复制粘贴龙虎榜表格的散户。AKShare 在这里扮演数据搬运工的角色,它把公开的财经数据封装成 Python 函数,你不需要维护爬虫,也不用处理反爬。Claude Code 则负责把「需求描述」翻译成「可执行的 Skill 文件 + 脚本」,并在你运行报错时帮你定位。
我试过把需求直接丢给模型让它一次性生成完整交易系统,结果它会在数据字段名上反复猜错。所以第六章刻意把范围收窄:v1.0 只做需求拆解和数据获取,分析逻辑留到下一版。这样每一步都能验证,出错也知道是哪一层的问题。
2. TaoToken 前置:给 Claude Code 接上稳定的模型通道
Claude Code 本身是一个命令行里的编码代理,它需要调用大模型来完成「读需求、写 Skill、改脚本」这些动作。如果你直接用它默认的通道,可能会遇到响应慢或者额度不稳定的情况。我的做法是先把模型接入层换成 TaoToken,再让 Claude Code 指向这个入口。
TaoToken 是一个模型 API 聚合服务,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。它兼容常见的 OpenAI 风格调用方式,所以 Claude Code 这类工具配置起来不复杂。你需要在控制台创建一个 API Key,然后把它写进 Claude Code 的环境变量或配置文件。
具体操作路径:先打开 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 生成 Key,再参考 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里的接入说明完成配置。如果你更习惯用 Anthropic 官方的 Claude Code 客户端,也可以看 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 这份对接指引。
配置完成后,你可以先在模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 发一句「你好」确认通道通畅,再回到终端里跑 Claude Code。这一步别跳过,否则后面脚本报错时你分不清是模型没连上还是代码写错了。
3. 可复制配置:Skill 目录骨架与 AKShare 依赖
3.1 项目目录结构
先把骨架搭出来。打开终端,执行下面这组命令。Windows 用户把source venv/bin/activate换成venv\Scripts\activate即可。
mkdir stock-trade-skill && cd stock-trade-skill python -m venv venv source venv/bin/activate pip install akshare pandas numpy mkdir -p .claude/skills src data目录建好后长这样:
stock-trade-skill/ ├── .claude/ │ └── skills/ │ └── stock-data.md ├── src/ │ └── fetch_lhb.py ├── data/ └── venv/.claude/skills/是 Claude Code 识别 Skill 的默认位置,src/放 Python 脚本,data/存每天拉下来的 CSV。这个分层的好处是 Skill 描述和实现代码解耦,你改脚本不会影响 Skill 的触发逻辑。
3.2 编写 stock-data Skill 描述文件
在.claude/skills/stock-data.md里写入以下内容。这份文件的作用是告诉 Claude Code:当用户提到龙虎榜相关意图时,应该调用哪个脚本、传什么参数、输出什么格式。
# 股票数据获取 Skill ## 描述 获取 A 股龙虎榜数据,为后续分析提供原始数据。 ## 适用场景 - 用户说 "获取龙虎榜" - 用户说 "今天哪些股票上榜" - 用户说 "主力买了什么" ## 依赖 - Python 3.8+ - akshare - pandas ## 执行步骤 1. 询问用户要查询的日期(默认:最近交易日) 2. 运行 `python src/fetch_lhb.py --date YYYYMMDD` 3. 脚本自动保存到 `data/lhb_YYYYMMDD.csv` 4. 输出数据摘要(上榜股票数量、总买入金额、总卖出金额) ## 输出格式 龙虎榜数据获取完成 日期:YYYYMMDD 上榜股票:N 只 数据已保存至:data/lhb_YYYYMMDD.csv ## 注意事项 - 交易日 16:00 后数据才完整 - 非交易日返回最近交易日数据 - AKShare 接口可能变动,需捕获异常这里有个细节:Skill 描述里写的是「运行 python src/fetch_lhb.py --date YYYYMMDD」,所以脚本必须支持--date参数。如果你只写死默认日期,Claude Code 在用户指定日期时就无法传参。参数化是让 Skill 真正可用的关键。
3.3 龙虎榜取数脚本
在src/fetch_lhb.py里写入完整实现。这段代码做了四件事:解析日期参数、回退到最近交易日、调用 AKShare 拉取龙虎榜明细、保存 CSV 并打印摘要。
"""龙虎榜数据获取模块""" import argparse import os from datetime import datetime, timedelta import akshare as ak import pandas as pd def get_recent_trade_date(date_str: str = None) -> str: """获取最近交易日,简单跳过周末""" if date_str: return date_str today = datetime.now() weekday = today.weekday() if weekday >= 5: today = today - timedelta(days=weekday - 4) return today.strftime("%Y%m%d") def fetch_lhb_data(date_str: str) -> pd.DataFrame: """获取指定日期的龙虎榜数据""" try: df = ak.stock_lhb_detail_daily_sina( start_date=date_str, end_date=date_str ) if df is None or df.empty: print(f"警告:{date_str} 无龙虎榜数据") return pd.DataFrame() df.columns = [str(col).strip() for col in df.columns] return df except Exception as exc: print(f"获取数据失败: {exc}") return pd.DataFrame() def save_lhb_data(df: pd.DataFrame, date_str: str) -> str: """保存龙虎榜数据到 CSV""" os.makedirs("data", exist_ok=True) filepath = f"data/lhb_{date_str}.csv" df.to_csv(filepath, index=False, encoding="utf-8-sig") print(f"数据已保存: {filepath}") return filepath def print_summary(df: pd.DataFrame, date_str: str) -> None: """打印数据摘要""" if df.empty: print("无数据") return stock_count = df["代码"].nunique() if "代码" in df.columns else len(df) print("=" * 50) print("龙虎榜数据获取完成") print(f"日期: {date_str}") print(f"上榜股票: {stock_count} 只") print("=" * 50) print("前 10 条数据:") print(df.head(10).to_string(index=False)) def main(): parser = argparse.ArgumentParser(description="获取 A 股龙虎榜数据") parser.add_argument("--date", default=None, help="日期格式 YYYYMMDD") args = parser.parse_args() date_str = get_recent_trade_date(args.date) print(f"正在获取 {date_str} 的龙虎榜数据...") df = fetch_lhb_data(date_str) if not df.empty: save_lhb_data(df, date_str) print_summary(df, date_str) else: print("未获取到数据") if __name__ == "__main__": main()注意encoding="utf-8-sig"这个参数。A 股数据里股票名称是中文,用普通 utf-8 保存后,Excel 打开会乱码。加-sig让 Excel 能正确识别 BOM 头,这是踩过的坑里最常见的一个。
4. 验证请求:跑通数据获取链路
4.1 命令行直接运行
先不经过 Claude Code,直接跑脚本确认 AKShare 能拿到数据:
source venv/bin/activate python src/fetch_lhb.py --date 20260603如果 20260603 不是交易日,脚本会返回空数据并打印警告。你可以换成最近一个交易日,或者不传--date让脚本自动回退到最近工作日。预期输出类似:
正在获取 20260603 的龙虎榜数据... 数据已保存: data/lhb_20260603.csv ================================================== 龙虎榜数据获取完成 日期: 20260603 上榜股票: 45 只 ================================================== 前 10 条数据: 代码 名称 买入金额 卖出金额 净买入 ... 000001 平安银行 120000000 80000000 40000000 ...4.2 通过 Claude Code 触发 Skill
脚本单独能跑通后,回到 Claude Code 里输入「获取今天的龙虎榜」。它应该读取stock-data.md的描述,识别出要执行python src/fetch_lhb.py,然后把结果摘要返回给你。如果它没有触发 Skill,检查两点:一是.claude/skills/路径是否在项目根目录下,二是 Skill 文件里的「适用场景」是否包含你用的关键词。
4.3 检查落盘文件
运行结束后确认data/目录下生成了对应日期的 CSV:
ls -lh data/ head -3 data/lhb_20260603.csvCSV 里应该包含代码、名称、买入金额、卖出金额、净买入等列。如果列名和预期不一致,说明 AKShare 接口字段有调整,这时候把实际列名打印出来,再决定后续分析脚本怎么取数。
5. 本篇常见错排查
5.1 AKShare 安装后 import 报错
最常见的是ModuleNotFoundError: No module named 'akshare'。九成原因是虚拟环境没激活,或者你在系统 Python 里装了包但脚本用的是 venv。先执行which python确认当前解释器路径在venv/bin/下,再pip list | grep akshare看包在不在。如果包在但还报错,试试pip install --upgrade akshare,老版本接口名可能已经废弃。
5.2 返回空 DataFrame
stock_lhb_detail_daily_sina返回空通常有三种情况:日期不是交易日、当天数据还没更新、或者 AKShare 上游接口临时变动。交易日 16:00 之前数据往往不完整,建议收盘后再拉。如果连续多个交易日都返回空,去 AKShare 的更新日志里确认接口名是否改了,必要时换用stock_lhb_detail_em等其他龙虎榜接口。
5.3 CSV 中文乱码
用df.to_csv(filepath, index=False)不带编码参数时,Windows 上默认可能是 gbk,Mac 上可能是 utf-8。统一写成encoding="utf-8-sig"能解决大部分 Excel 打开乱码的问题。如果你用 pandas 读回来,pd.read_csv(filepath, encoding="utf-8-sig")即可。
5.4 Claude Code 不触发 Skill
Skill 没被识别,先看文件名是不是.md结尾、是否放在.claude/skills/下。其次看描述文件里的「适用场景」是否太窄,比如只写了「获取龙虎榜」,用户说「今天哪些股票上榜」就不会命中。把常见说法都列进去,命中率会高很多。如果还是不行,在 Claude Code 里直接说「使用 stock-data skill 获取龙虎榜」,强制指定。
5.5 日期参数格式不对
脚本里--date要求YYYYMMDD八位数字。如果你传2026-06-03,AKShare 可能不报错但返回空。在get_recent_trade_date里加一层格式校验会更稳,比如用datetime.strptime(date_str, "%Y%m%d")试解析,失败就提示用户改格式。
6. 下一步:把数据链路接进 Coding Plan
v1.0 跑通后,你手里有了每天落盘的龙虎榜 CSV。接下来 v1.1 要做的是席位胜率统计,v1.2 才是信号生成。这些迭代会涉及大量脚本修改和调试,如果你打算长期用 Claude Code 来开发这套 Skill,建议把模型调用切到 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。它针对编码场景做了额度优化,适合这种需要反复改代码、跑测试的长期项目。
如果你只是想先验证模型能不能正确理解龙虎榜字段,可以到模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 贴一段 CSV 表头,让它帮你写 pandas 聚合逻辑。确认思路没问题后,再回到 Claude Code 里落地成 Skill。数据获取这一环稳了,后面的分析才有意义。