AI写量化策略原来这么简单
摘要: AI能高效生成量化交易策略,但需正确调教。常见错误是模糊指令(如"写小市值策略")导致代码无法运行。正确方法:1)需求解构:让AI细化策略逻辑并调整参数;2)策略构建:提供平台API文档(如ptrade),强制AI参考规范;3)测试修正:AI自查错误并迭代。案例中,经半小时调教生成的策略最终成功回测。AI大幅降低开发门槛,但需结构化输入与持续优化。
前几天我发了一篇文章,里面提到用AI进行量化交易,很多朋友私下和我说他用AI写出来的策略在ptrade上面根本不能运行,错误百出。
其实AI还是好工具,只是这些朋友还没有用对方法。
想要AI能听你的话,按平台API写策略,你得掌握我今天分享的几个办法。
错误案例
首先我们来看看用AI写策略的反面教材
我相信大多数朋友都像图中这样,直接一句话甩给AI,让AI写

接下来我们把AI写的策略拿去ptrade上面回测运行,果不其然,无法运行

有人说那我继续让AI自己改可不可以呢?你可以试试看绝对会把你累死,改了100遍都不一定能改好
因为你这种方式从一开始就错了!后面再怎么改也是徒劳无功!
其实这也不能怪AI,你的指令就一句话:“写一个小市值策略”,太粗略了,给谁写都无法精准地写出来
想要AI写出有效的量化交易代码,你得做好以下工作。
AI写策略应该这么调教
基本逻辑
想要AI能理解你的意图,你得尽量说得详细
根据我多年的经验总结,要让AI写好一个量化策略,得经过以下几个流程:

需求解构
想让AI写策略得让AI知道你的需求具体是怎么样的
但是很多朋友自己其实对一些策略并不懂,
比如在上面的例子中,只知道小市值策略这个概念。不知道如何具体实现的
遇到这种情况你可以让AI先给一个具体方案,比如让他从监控标的,买卖规则等方面来阐述,如下图所示

可以看到AI给了我一个比较详细的小市值投资方案,那如果你有自己的想法,你就可以在此基础上修改,比如把里面的10%改成20%
策略构建
在明确需求后,我们就可以让AI写代码了
在这里有构建的一步就是要给AI看你的量化交易平台的资料,因为不同平台的量化函数是不同的
我经常用的是ptrade平台,所以我把ptrade的API文档给了AI,形成了资料库

这样AI写出来的代码才能符合平台规则,能运行的概率才会变大
接下来我们来输入提示词让AI写具体的代码,为了保险,代码中可以让AI强制参考资料库里面的文档写,并且再给他强调平台的编写规则和简单案例
就像教小孩一样,给了AI规则和参考他才能写出正确的代码

测试修正
AI写完后别急着用,可以让AI自己再检查一遍,扫描规避 API 误用与结构错误,修复大模型幻觉

经历过上面几轮的调教后我们得到以下代码:
# 小市值策略实现
# 选择A股市场中流通市值最低的前10%股票作为交易标的
def initialize(context):
"""
初始化函数,设置全局变量和定时任务
"""
g.stocks = [] # 存储每日筛选的股票池
set_universe([]) # 初始化空股票池
# 设置每日定时任务(14:50执行交易逻辑)
run_daily(context, handle_data, time='14:50')
def before_trading_start(context, data):
"""
盘前处理:每日9:10运行,筛选当日小市值标的
"""
try:
# 获取A股全量代码(带尾缀)
ashare_list = get_Ashares()
if not ashare_list:
log.info("未获取到A股列表")
return
market_caps = []
# 遍历股票计算流通市值
for stock in ashare_list:
# 获取行情快照(需要带尾缀的代码)
snapshot = get_snapshot(stock)
if not snapshot:
continue
# 获取流通股数和最新价(注意字段名称与文档一致)
circulation_amount = snapshot.get('circulation_amount', 0)
price = snapshot.get('price', 0)
if circulation_amount <= 0 or price <= 0:
continue
# 计算流通市值
market_caps.append((stock, price * circulation_amount))
# 按流通市值升序排序
market_caps.sort(key=lambda x: x[1])
n = len(market_caps)
# 确保至少选1只股票
top_n = max(1, int(n * 0.1))
g.stocks = [stock for stock, _ in market_caps[:top_n]]
# 更新策略股票池(参数类型检查通过)
set_universe(g.stocks)
log.info("当日小市值股票池构建完成,共%d只" % len(g.stocks))
except Exception as e:
log.info("盘前处理异常:%s" % str(e))
def handle_data(context, data):
"""
盘中处理:每日14:50执行交易逻辑
"""
try:
# 获取当前持仓(Portfolio对象属性检查通过)
current_positions = context.portfolio.positions
current_stocks = list(current_positions.keys())
# 1. 卖出不在当日股票池的持仓
for stock in current_stocks:
if stock not in g.stocks:
order_target(stock, 0) # 使用命名参数
log.info("卖出剔除股票:%s" % stock)
# 2. 买入新入选股票
if not g.stocks:
return
# 计算资金分配
available_cash = context.portfolio.cash # Portfolio属性检查通过
if available_cash <= 0:
return
# 每只股票分配资金
position_count = len(g.stocks)
cash_per_stock = available_cash / position_count
# 买入新股票
for stock in g.stocks:
if current_positions.get(stock) is None:
order_value(stock, cash_per_stock) # 使用命名参数
log.info("新建仓股票:%s" % stock)
except Exception as e:
log.info("交易执行异常:%s" % str(e))
接下来我们把策略放到ptrade平台上去试试,结果还是报错了,原来是用的函数不支持回测

看不懂没关系,直接复制给AI,让他自己改

改完后,在ptrade上面就可以成功运行了,回测结果如下,仅供参考:

绩效优化与实战
上面的操作已经写出来了一个可以实际运行的代码,全程只花了半个小时左右,比你从头学起可节省太多时间了,要不怎么说AI是生产力呢
有了可以运行的代码可以通过回测或者模拟运行来看看效果,
在之后也可以持续对策略进行改进,比如把阈值10%进行修改
总之有新的思路和需求都可以按上面的方式交给AI去写,去优化
更多推荐

所有评论(0)