如何用 AI 写 PTrade 代码:从搭建知识库到实战

✍️ 听雨量化 ·

如何用 AI 写 PTrade 代码:从搭建知识库到实战

股票的量化交易,自然是选择 PTrade 和 QMT 两个平台。QMT 我个人用得比较多,但 PTrade 给客户写得也比较多。给客户写策略,很多都是 PTrade 的代码。

这篇聊的是怎么用 AI 来写 PTrade 代码。不是什么高大上的教程,就是我自己日常用的方法,分享出来给需要的人。PTrade 的门槛确实不低,各种函数的坑也比较多,如果你看完还是拿不准,别硬扛,找我来代写就行。


一、PTrade 简单介绍

PTrade 是恒生电子的量化交易系统,部署在券商服务器上,代码在服务器端运行,通过 API 下单到交易所

  • 支持股票、可转债、ETF、期货、融资融券
  • Python 3.11 环境,预装了 275 个第三方库(numpy、pandas、TA-Lib 等)
  • 交易模式下最低 3 秒级别的 tick 策略
  • 回测和实盘共用一套代码框架

核心优势:代码在券商机房执行,延迟远低于本地电脑下单。

但要注意:代码运行在券商的封闭服务器上,不能访问外部网络,不能调用需要联网的 API(比如 tushare、akshare 等),也不能读取你本地电脑的文件。 所有数据和逻辑都必须在服务器内部完成。

关于 PTrade 的具体使用,我之前写了一篇详细的入门教程,从第一行代码到实盘运行,感兴趣的可以翻翻看。


二、AI 写代码的问题

很多人试过用 ChatGPT 或者 Claude 来写 PTrade 代码,体验大概是这样的:

你问 AI:“帮我写一个 PTrade 的双均线策略。”

AI 写得很快,看起来也挺像那么回事。

你复制粘贴到 PTrade 里跑一下——报错了。

再问 AI,AI 改了几个地方,又跑一下——这次不报错了,但回测结果不对。

仔细一看:include=True 用错了,把盘中的最新价当日线收盘价用了;order_target 在交易模式下重复下单了;停牌的数据没过滤……

AI 写 PTrade 代码,最大的问题不是写不出来,是”假装完成”。

AI 会给你一个看起来完整的代码,跑起来也不报错,但逻辑上有细微的错误——参数用反了、函数的行为理解错了、回测和实盘的差异忽略了。这些错误不会直接报错,但会让你的策略在不知不觉中出错。

所以,AI 写的代码必须经过完整测试和人工审核,不能直接拿来跑实盘。

那怎么让 AI 写出更靠谱的代码呢?核心就一件事:给 AI 足够好的上下文


三、搭建知识库:让 AI “读懂” PTrade 文档

AI 知识库搭建

问题在哪?

AI 之所以写不对 PTrade 代码,根本原因是它没看过 PTrade 的官方文档。PTrade 是一个小众平台,通用大模型的训练数据里几乎没有 PTrade 的 API 文档,它只能靠”猜”——猜出来的结果自然不太靠谱。

解决方案:RAG(检索增强生成)

RAG 原理

RAG 的原理很简单:把 PTrade 的官方文档存到一个数据库里,AI 写代码之前先从数据库里搜索相关文档,根据文档内容来写代码

这样说可能有点抽象,看个具体的对比:

方式一:直接问 AI(没有知识库)

你:帮我写一个 PTrade 获取过去 10 天收盘价的代码

AI:df = get_price('600570.SS', count=10, frequency='1d', field='close')

看起来没问题?实际上 get_price 的参数名是 start_date/end_date,不是 countcountget_history 的参数。AI 把两个函数搞混了。

方式二:先搜索文档,再让 AI 写(有知识库)

先用 RAG 搜索 get_history 的文档,得到:

get_history(count, frequency, field, security_list, fq, include, fill, is_dict)

  • count: K 线数量,大于 0
  • frequency: 支持 1m/5m/15m/30m/60m/120m/1d/1w/mo
  • include: 是否包含当前周期,默认 False

再让 AI 基于这段文档写代码:

AI:df = get_history(10, '1d', 'close', security_list=['600570.SS'], include=False)

这次就对了。

实测对比:RAG 搜索 vs 直接阅读文档

我自己的做法是用一个知识库项目(knowledge-crawler),把 PTrade 的官方文档全部爬下来、切块、存入向量数据库。写代码前先 RAG 搜索,让 AI 基于真实文档来生成代码。

来做个实测。

场景:搜索 “PTrade order_target 持仓同步问题”

RAG 搜索结果(约 2 秒):

来源: api-股票交易函数.md (score=0.982)
order_target - 指定目标数量买卖
注意事项:
该接口的使用有场景限制,回测可以正常使用,交易谨慎使用。
回测场景下撮合是引擎计算的,因此成交之后持仓信息的更新是瞬时的,
但交易场景下信息的更新依赖于柜台数据的返回,无法做到瞬时同步,
可能造成重复下单。

来源: 例子/基于协整的配对策略.py (score=0.983)
注意事项:策略中调用的 order_target、order_target_value 接口的使用有
场景限制,回测可以正常使用,交易谨慎使用...

直接阅读文档:需要先找到 PTrade 文档目录,打开 api-股票交易函数.md,滚动到 order_target 部分,阅读注意事项。大概需要 1-2 分钟。

RAG 的优势

  • 速度快:精确搜索 2 秒出结果,不用翻文档
  • 定位准:直接找到最相关的段落,不用通读整篇文档
  • 覆盖广:一次搜索能命中多个相关文档(API 文档 + 示例代码 + 注意事项)
  • 不会遗漏:人读文档容易跳过”注意事项”部分,RAG 会把相关段落全部返回

RAG 的劣势

  • 可能断章取义:文档被切块后,有时会丢失上下文。比如搜索到一个函数的参数说明,但没搜到它的使用限制
  • 需要额外搭建:你得先把文档爬下来、切块、入库,有一定前期成本

我的做法:RAG 搜索 + 关键文档直接阅读,两者配合使用。 RAG 用来快速定位,阅读用来确认细节。

怎么搭建自己的 PTrade 知识库

搭建知识库的核心步骤就三步:

第一步:收集文档

把 PTrade 的官方文档(API 文档、使用说明、策略示例等)保存到本地目录。文档格式可以是 Markdown、PDF、HTML 都行。

第二步:文档切块

把文档切分成小块(通常 512~1024 个 token 一块),每块就是一个可搜索的单元。切块时要有一定的重叠(比如 100 个 token),避免关键信息被切断。

第三步:向量化 + 存储

用 Embedding 模型把每块文档转成向量,存入向量数据库(如 LanceDB、Chroma 等)。搜索时,把你的问题也转成向量,在数据库里找最相似的文档块。

市面上现成的 RAG 工具很多:haiku-rag、LlamaIndex、LangChain 都支持。我自己用的是基于 LanceDB + SiliconFlow bge-m3 的方案,搜索速度和准确度都不错。


四、Prompt 撰写要点

知识库搭好了,怎么写 prompt 才能让 AI 输出靠谱的 PTrade 代码?几个关键点:

1. 明确告诉 AI 使用哪些函数

不要说”帮我写一个均线策略”,要说:

请使用 PTrade 的以下函数来实现:
- get_history(count, frequency, field, security_list, fq, include)
- order(security, amount, limit_price)
- get_position(security)

AI 在没有具体函数签名的情况下会瞎编。你告诉它用哪个函数、参数是什么,它就不容易搞错。

2. 给出正确的函数行为描述

尤其要注意那些容易出错的参数。比如 include

注意:get_history 的 include 参数默认为 False,表示不包含当前周期。
在分钟线策略中调用日线数据时,必须使用 include=False,
否则会拿到盘中最新价作为"收盘价",产生未来数据。

3. 明确约束条件

约束条件:
1. 代码运行在券商服务器,不能访问外部网络
2. 只能使用 PTrade 内置的 275 个第三方库
3. 不能 import tushare、akshare 等需要联网的库
4. 股票代码尾缀:上海 .SS,深圳 .SZ
5. order_target 在交易模式下有持仓同步延迟,慎用

4. 要求输出完整可运行代码

要求:
1. 输出完整的 PTrade 策略代码,包含 initialize 和 handle_data
2. 不要用省略号"...",每个函数都要完整实现
3. 添加中文注释说明每一步的逻辑
4. 标注可能的风险点

5. 给出测试 checklist

AI 写完代码后,让它自己列一个检查清单:

请检查以下项目并说明是否满足:
1. get_history 的 include 参数是否正确?
2. 日线数据是否避免了未来数据?
3. 下单函数是否考虑了交易模式的限制?
4. 价格精度是否符合品种要求?
5. 是否有遗漏的全局变量初始化?

6. 分步写,不要一次写完

复杂的策略不要让 AI 一次写完。分步骤来:

第一步:先写 initialize 函数,设定参数和股票池
第二步:写数据获取逻辑(get_history 的调用)
第三步:写交易信号判断
第四步:写下单逻辑
第五步:写风控和异常处理

每步确认没问题再进行下一步,这样不容易出大错。

Prompt 撰写要点


五、实战示例:用 AI 写一个简单的 RSI 策略

AI 策略实战

第一步:RAG 搜索相关文档

搜索 “RSI 指标 get_RSI get_history”:

RAG 返回:

  • get_RSI 函数签名:get_RSI(close, n=6),输入 numpy 数组,返回 numpy 数组
  • get_history 用法:get_history(count, frequency, field, security_list, fq, include)
  • 策略示例中 RSI 的典型用法

第二步:组织 prompt

请基于以下 PTrade API 文档,写一个 RSI 超卖买入策略。

API 信息:
- get_RSI(close, n=6):输入收盘价 numpy 数组,返回 RSI 值 numpy 数组
- get_history(count, frequency, field, security_list, fq, include=False)
  count: K 线数量
  frequency: '1d' 日线
  field: ['close','high','low']
  include=False: 不包含当前周期
- order(security, amount):正数买入,负数卖出
- order_target(security, amount):调整到目标数量
- get_position(security).amount:当前持仓数量
- 股票代码尾缀:上海 .SS,深圳 .SZ

策略逻辑:
1. 获取过去 60 天的收盘价
2. 计算 RSI(6)
3. RSI 低于 20 时买入(超卖)
4. RSI 高于 80 时卖出(超买)
5. 每次买入 100 股

约束:
- 使用 order 而非 order_target 下单
- include 参数必须为 False
- 输出完整可运行代码
- 添加中文注释

第三步:AI 生成的代码

import numpy as np

def initialize(context):
    # 设置标的:恒生电子
    g.security = '600570.SS'
    # 每次交易数量
    g.trade_amount = 100
    # RSI 参数
    g.rsi_n = 6
    # RSI 阈值
    g.rsi_buy = 20    # 超卖买入线
    g.rsi_sell = 80   # 超买卖出线
    # 设定股票池
    set_universe(g.security)

def handle_data(context, data):
    security = g.security

    # 获取过去 60 天的收盘价(include=False,不含当天)
    h = get_history(60, '1d', 'close', security, fq='dypre', include=False)
    close_array = h['close'].values

    # 计算 RSI(6)
    rsi_array = get_RSI(close_array, g.rsi_n)
    current_rsi = rsi_array[-1]

    # 当前持仓
    position = get_position(security)
    current_amount = position.amount

    # RSI 低于 20,超卖买入
    if current_rsi < g.rsi_buy and current_amount == 0:
        order(security, g.trade_amount)
        log.info('RSI=%.1f 买入 %s %s 股' % (current_rsi, security, g.trade_amount))

    # RSI 高于 80,超买卖出
    elif current_rsi > g.rsi_sell and current_amount > 0:
        order(security, -current_amount)
        log.info('RSI=%.1f 卖出 %s 全部持仓' % (current_rsi, security))

第四步:人工审核 checklist

检查项结果说明
include 参数✅ False正确,不含当天数据
下单函数✅ order未使用 order_target,避免重复下单
股票代码尾缀✅ .SS上海股票
全局变量初始化✅ initialize 中全部在 initialize 中初始化
未来数据风险✅ 无get_history 用 include=False
风控逻辑⚠️ 缺失没有止损、最大持仓等风控
停牌处理⚠️ 缺失没有过滤停牌股

发现两个问题:缺少风控逻辑和停牌处理。这就是人工审核的价值——AI 写出了能跑的代码,但缺失了一些重要的细节。

第五步:补充修改

def handle_data(context, data):
    security = g.security

    # 检查是否停牌(成交量为 0 表示停牌)
    h_volume = get_history(2, '1d', 'volume', security, include=False)
    if h_volume['volume'].values[-1] == 0:
        return  # 停牌日不交易

    # ...原有逻辑不变...

    # 风控:单只股票最多持有 1000 股
    if current_amount + g.trade_amount > 1000:
        return  # 超过最大持仓限制,不买入

这就是完整流程:RAG 搜索 → 组织 prompt → AI 生成 → 人工审核 → 补充修改


六、一周 AI 量化训练营

训练营

如果你觉得上面的内容有意思,但又觉得一个人摸索太慢,我准备搞一个一周 AI 量化训练营

不教编程基础,不教金融理论,就教你一件事:怎么用 AI 来写量化代码,并且写出来的代码能跑、能赚钱。

你会学到什么

大语言模型基础

什么是大语言模型?ChatGPT、Claude、GLM 这些工具有什么区别?哪个适合写代码?怎么写 prompt 才能让 AI 输出你想要的结果?

Agent 的概念和使用

不只是”一问一答”,而是让 AI 成为一个能自主搜索文档、写代码、测试、修改的”助手”。Claude Code、Cursor 这些 AI 编程工具怎么用?怎么和 PTrade 结合?

Harness 是什么

Harness 是一个代码验证框架——AI 写完代码后,自动跑测试、检查语法、验证逻辑是否正确。不用你一行行 review,Harness 帮你把关。

如何用 AI 写代码

从零开始,让 AI 根据你的交易逻辑生成 PTrade 策略代码。关键在于怎么给 AI 足够的上下文(就是前面说的知识库),让它写出来的代码不是”看起来对”,而是”真的对”。

注意事项和常见坑

AI 写代码最容易出现的问题:参数搞混、函数行为理解错、回测和实盘差异忽略。哪些地方必须人工审核,哪些可以放心交给 AI。

如何用 AI 调试和调整代码

策略跑出来不对怎么办?怎么告诉 AI “这里有问题”让它自己定位和修复?怎么让 AI 帮你优化策略参数?


一周时间,每天 1-2 小时,学完你能做到:

  • 独立用 AI 写出一个能回测的 PTrade 策略
  • 知道 AI 写的代码哪里容易出错,怎么检查
  • 会用 Agent 工具让 AI 自主完成”搜索文档 → 写代码 → 测试”的全流程
  • 遇到问题知道怎么让 AI 帮你调试

量化交易的核心不是写代码,是交易逻辑。代码的事交给 AI,你只需要把交易逻辑想清楚。


💼 AI 量化培训 · 策略生成 · 代码代写 —— 微信 traderByAI 联系。