使用AI编写量化交易策略:从入门到实战
使用AI编写量化交易策略:从入门到实战
在量化交易领域,人工智能的应用正在变得越来越普及。本文将通过一个具体的案例,展示如何使用抖音旗下的人工智能大模型豆包和量化交易平台聚宽来编写量化交易策略。从让AI学习模板策略到最终实现一个ETF动量追涨轮动策略,整个过程将被详细记录下来。
准备工具
- 豆包:抖音旗下的人工智能大模型
- 聚宽:量化交易平台
基本思路
- 让AI先学习一个样板策略
- 提出一个交易逻辑让AI帮写新的量化策略
- AI写的策略往往都有错误,需要把错误丢给AI让他自己改正
- 策略只要能运行,那就可以慢慢增加交易细节
第一步:和AI打个招呼
提示词:
如何使用现在流行的AI来帮自己写量化交易策略代码,并能完美的在聚宽joinquant上运行不出错?有很多投资者使用券商的QMT或者ptrade,只需要把问题中的聚宽换成QMT或者ptrade就可以了。后文以聚宽来举例说明。
第二步:让AI学习聚宽的模板策略
提示词:
请学习以下聚宽的量化交易策略代码:
# 导入函数库
from jqdata import *
# 初始化函数,设定基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 输出内容到日志 log.info()
log.info('初始函数开始运行且全局只运行一次')
# 过滤掉order系列API产生的比error级别低的log
# log.set_level('order', 'error')
### 股票相关设定 ###
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
# 开盘前运行
run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
# 开盘时运行
run_daily(market_open, time='open', reference_security='000300.XSHG')
# 收盘后运行
run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')
## 开盘前运行函数
def before_market_open(context):
# 输出运行时间
log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))
# 给微信发送消息(添加模拟交易,并绑定微信生效)
# send_message('美好的一天~')
# 要操作的股票:平安银行(g.为全局变量)
g.security = '000001.XSHE'
## 开盘时运行函数
def market_open(context):
log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
security = g.security
# 获取股票的收盘价
close_data = get_bars(security, count=5, unit='1d', fields=['close'])
# 取得过去五天的平均价格
MA5 = close_data['close'].mean()
# 取得上一时间点价格
current_price = close_data['close'][-1]
# 取得当前的现金
cash = context.portfolio.available_cash
# 如果上一时间点价格高出五天平均价1%, 则全仓买入
if (current_price > 1.01*MA5) and (cash > 0):
# 记录这次买入
log.info("价格高于均价 1%%, 买入 %s" % (security))
# 用所有 cash 买入股票
order_value(security, cash)
# 如果上一时间点价格低于五天平均价, 则空仓卖出
elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
# 记录这次卖出
log.info("价格低于均价, 卖出 %s" % (security))
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
## 收盘后运行函数
def after_market_close(context):
log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
# 得到当天所有成交记录
trades = get_trades()
for _trade in trades.values():
log.info('成交记录:'+str(_trade))
log.info('一天结束')
log.info('##############################################################')
第三步,向AI描述自己的交易逻辑
提示词:
请把要交易的标的设定为沪深300ETF和创业板ETF,并各按50%的资金来分配给两个标的。当20日均线上穿60日均线的时候买入,当20日均线下穿60日均线的时候卖出。
第四步:代码错误的修正
试着编译运行,报错了。复制报错的部分直接丢给AI,然后AI自动帮修正错误的代码,还告诉你为什么错了。然后继续复制修改好的代码到聚宽,并编译。又报错了。然后继续把错误的提示内容复制粘贴给AI。OK,能正常运行了。
以下是能正常运行的”ETF双均线策略“代码:
第五步:策略回测看效果
下面是24年的回测结果:
发现10年期都不赚钱来着,不行,咱得换个姿势。
第六步:修改新的标的和新的交易逻辑
提示词:
把交易标的扩展为纳指ETF、黄金ETF、上证50ETF、创业板ETF合计四只。并把20日均线和60日均线的交易逻辑改为10日均线和20日均线的关系,如:10日均线上穿20日均线的时候买入,10日均线下穿20日均线的时候卖出。每日开盘前计算一次,只要符合要求的则按剩余资金均仓买入。
编译没问题。
下面是24年的运行情况:
还不错的样子,看看交易明细:
发现跑不赢沪深300哟,交易逻辑估计还是不够强。那咱们把均线交易改为动量追涨的逻辑咧!
提示词:
把均线交易逻辑改为动量逻辑,哪个品种的20日动量最强就买哪个。并加入止盈止损部分来减小策略波动:收益曲线持续上涨,从最高点回落5%的时候强制空仓10个交易日,若是开仓后没有往上涨,则按开仓成本价往下3%的时候止损。
OK,编译,能通过。
下面是24年的回测结果:
捏,十年期回测终于是年化10个点以上了。
风险提示
投资有风险,入市需谨慎。本文内容仅供参考,不构成任何投资建议。在进行量化交易或任何投资活动时,请务必根据自身的风险承受能力做出理性决策。