最近,AI领域再次掀起了一股热潮,热度之高,连我老家那些从未接触过AI的朋友都开始向我打听,为什么DeepSeek注册不上。
想必关注这个号的朋友们,大多早已将AI融入到日常生活中了吧?我自己也是如此。
在写代码时,我早已习惯了借助AI的力量来辅助编程;撰写文章时,我也常常请AI帮忙润色,将一些生僻的词汇替换掉,让文章的语气更加柔和,读起来更加自然。最近,我更是尝试让AI帮我编写回测代码,结果一试之下,才发现AI在策略代码生成方面的表现令人惊艳,完全超出了我的预期!
在深入探讨之前,先简单明确一些概念。编写投资策略,本质上是把你的投资思路转化为数字化的形式;而策略回测,则是将你的策略应用到历史数据中,进行统计分析。回测的关键作用在于帮你筛除掉那些不切实际的想法,需要清楚,靠谱的策略核心在于其底层逻辑是否完备,而并非取决于回测结果的好坏。
前几天,我在一个量化投资相关的公众号上,看到了一个号称“10年20倍”的策略。它的逻辑如下:
第一步:每天打开行情软件;
第二步:比较创业板与纳指100过去20天涨幅;
第三步:买入涨幅更快的那个,如果两个都跌,就持有债券。
这个策略不算新颖,之前流行过的大小盘轮动策略,和它就有点类似,只不过对应的标的是沪深500和沪深300;这个策略换为创业板和纳指,似乎有点全球也有点科技,但更多的还是动量。今天我们主要探讨如何用AI写策略,所以暂不深入分析这个策略的逻辑。总之,我觉得它有点意思,就想动手尝试一下。
下面是我和某AI的互动过程:
我:可以利用joinquant的API来写joinquant的策略吗?
AI:你想问的或许是能否利用聚宽(JoinQuant)的API来编写量化交易策略,答案是可以的,聚宽提供了丰富的API接口,能够帮助用户方便地实现各类量化交易策略。下面为你详细介绍相关内容:
可行性分析:聚宽的API涵盖了数据获取、交易下单、策略回测等多个方面的功能,用户可以借助这些API进行历史数据查询、实时行情获取、指标计算等操作,进而构建并回测量化交易策略。
编写步骤示例:以下以一个简单的双均线策略为例,展示如何使用聚宽API编写量化交易策略:(具体代码略)
代码解释:(具体略)编写好策略代码后,你可以在聚宽平台上进行策略回测,评估策略的性能。如果策略表现良好,你还可以将其用于实盘交易。在进行实盘交易时,需要注意聚宽API的实盘交易接口的使用规则和风险控制。通过以上步骤,你就可以利用聚宽的API编写量化交易策略了。当然,实际应用中,你可以根据自己的需求和市场情况,对策略进行更加复杂和精细的设计。
我:实现一个聚宽的策略,比较创业板与纳指100过去20天涨幅。如果创业板指涨幅高则全仓买入159915,如果纳指100涨幅高,买入513100,如果两个都跌,则买入511260。
AI:给出了具体的策略。
我在聚宽将AI给出来的策略放上去,运行了一下。发现AI使用'NDX.GI’来获取纳指的历史行情,但聚宽是无法获得这个标的行情的。
我:聚宽无法获得'NDX.GI'的数据,用513100的净值来做替代。
AI:给出了相应的改进。
新代码我看出来一点小错误,AI误用了513100的场内价格,因为有溢价的原因,不能像净值那样更接近于纳指的真实涨幅(用净值也是有一个汇率相关的差别,但是加上汇率之后进行比较也许才更符合策略的原始逻辑)。
我:获得纳指涨幅时,采用基金的净值,而不是场内交易的价格。
AI:给出了相应的改进。
我在聚宽运行后,看交易记录,发现交易有点频繁,猜原因是策略每天会先卖出,再选择标的并买入,看代码确认如此。
我:如果当前持仓就是目标ETF,则不用先清仓再买入。
AI:给出了相应的改进。
以下是本次与AI交互后给出的最终版:
import jqdata
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 过滤掉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')
# 定义相关标的
g.chuangyeban = '399006.XSHE'# 创业板指
g.etf_nasdaq100 = '513100.XSHG'# 纳指100 ETF
g.etf_chuangyeban = '159915.XSHE'# 创业板ETF
g.etf_monetary = '511260.XSHG'#
# 运行函数,每天开盘前计算涨幅并决定交易
run_daily(calculate_and_trade, time='before_open', reference_security='000300.XSHG')
# 获取创业板指过去20天的收盘价
cyb_prices = attribute_history(g.chuangyeban, 20, '1d', ['close'])
# 计算创业板指涨幅
cyb_gain = (cyb_prices['close'][-1] - cyb_prices['close'][0]) / cyb_prices['close'][0]
# 获取纳指100 ETF(513100)过去20天的基金净值数据
ndx_net_values = get_extras('acc_net_value', [g.etf_nasdaq100], count=20, end_date=context.current_dt, df=False)
ndx_net_values = ndx_net_values[g.etf_nasdaq100]
# 计算纳指100 ETF基于净值的涨幅
ndx_gain = (ndx_net_values[-1] - ndx_net_values[0]) / ndx_net_values[0]
# 获取当前可用现金
cash = context.portfolio.available_cash
if cyb_gain > ndx_gain and cyb_gain > 0:
target_etf = g.etf_chuangyeban
elif ndx_gain > cyb_gain and ndx_gain > 0:
target_etf = g.etf_nasdaq100
else:
target_etf = g.etf_monetary
current_position = context.portfolio.positions.keys()
if target_etf notin current_position:
# 先清空所有持仓
for security in current_position:
order_target(security, 0)
# 买入目标ETF
order_value(target_etf, cash)
log.info(f"买入 {target_etf}")
else:
log.info(f"当前持仓就是 {target_etf},无需操作")
这份最终的代码,在聚宽顺利回测,结果如下图:
可以看到,从2014 - 01 - 01到2025 - 01 - 02共11年,累计收益331.33%,年化收益14.63%。虽然没有原文号称的那么厉害,但也是一个可以用小资金尝试一下的动量策略。
从这次与AI交互编写策略的过程来看,对于一个完全不懂代码的人来说,想要顺利完成可能会有一些难度,但也并非完全做不到。只要仔细观察回测的交易情况,还是比较容易发现AI出现的小错误;而对于有编程经历的人,哪怕不懂Python(以我的经验,有编程经历的人,大概半天就能学会Python;如果没有编程经历,只要喜欢钻研,估计花一周到一个月左右的时间,也能掌握基本用法,满足需求),应该都能轻松上手。
投资的世界充满了无限可能,而AI的出现,无疑为我们开启了一扇全新的大门。不要被代码和技术吓倒,大胆迈出尝试的第一步。无论是有经验的投资老手,还是初涉投资领域的小白,都能在与AI的协作中,找到属于自己的投资灵感与策略。说不定,下一个创造惊人收益的策略,就诞生于你和AI的奇妙互动之中。快行动起来,让AI成为你投资路上的得力助手,一起在投资的海洋中乘风破浪,收获属于自己的财富硕果!
想必关注这个号的朋友们,大多早已将AI融入到日常生活中了吧?我自己也是如此。
在写代码时,我早已习惯了借助AI的力量来辅助编程;撰写文章时,我也常常请AI帮忙润色,将一些生僻的词汇替换掉,让文章的语气更加柔和,读起来更加自然。最近,我更是尝试让AI帮我编写回测代码,结果一试之下,才发现AI在策略代码生成方面的表现令人惊艳,完全超出了我的预期!
在深入探讨之前,先简单明确一些概念。编写投资策略,本质上是把你的投资思路转化为数字化的形式;而策略回测,则是将你的策略应用到历史数据中,进行统计分析。回测的关键作用在于帮你筛除掉那些不切实际的想法,需要清楚,靠谱的策略核心在于其底层逻辑是否完备,而并非取决于回测结果的好坏。
前几天,我在一个量化投资相关的公众号上,看到了一个号称“10年20倍”的策略。它的逻辑如下:
第一步:每天打开行情软件;
第二步:比较创业板与纳指100过去20天涨幅;
第三步:买入涨幅更快的那个,如果两个都跌,就持有债券。
这个策略不算新颖,之前流行过的大小盘轮动策略,和它就有点类似,只不过对应的标的是沪深500和沪深300;这个策略换为创业板和纳指,似乎有点全球也有点科技,但更多的还是动量。今天我们主要探讨如何用AI写策略,所以暂不深入分析这个策略的逻辑。总之,我觉得它有点意思,就想动手尝试一下。
下面是我和某AI的互动过程:
我:可以利用joinquant的API来写joinquant的策略吗?
AI:你想问的或许是能否利用聚宽(JoinQuant)的API来编写量化交易策略,答案是可以的,聚宽提供了丰富的API接口,能够帮助用户方便地实现各类量化交易策略。下面为你详细介绍相关内容:
可行性分析:聚宽的API涵盖了数据获取、交易下单、策略回测等多个方面的功能,用户可以借助这些API进行历史数据查询、实时行情获取、指标计算等操作,进而构建并回测量化交易策略。
编写步骤示例:以下以一个简单的双均线策略为例,展示如何使用聚宽API编写量化交易策略:(具体代码略)
代码解释:(具体略)编写好策略代码后,你可以在聚宽平台上进行策略回测,评估策略的性能。如果策略表现良好,你还可以将其用于实盘交易。在进行实盘交易时,需要注意聚宽API的实盘交易接口的使用规则和风险控制。通过以上步骤,你就可以利用聚宽的API编写量化交易策略了。当然,实际应用中,你可以根据自己的需求和市场情况,对策略进行更加复杂和精细的设计。
我:实现一个聚宽的策略,比较创业板与纳指100过去20天涨幅。如果创业板指涨幅高则全仓买入159915,如果纳指100涨幅高,买入513100,如果两个都跌,则买入511260。
AI:给出了具体的策略。
我在聚宽将AI给出来的策略放上去,运行了一下。发现AI使用'NDX.GI’来获取纳指的历史行情,但聚宽是无法获得这个标的行情的。
我:聚宽无法获得'NDX.GI'的数据,用513100的净值来做替代。
AI:给出了相应的改进。
新代码我看出来一点小错误,AI误用了513100的场内价格,因为有溢价的原因,不能像净值那样更接近于纳指的真实涨幅(用净值也是有一个汇率相关的差别,但是加上汇率之后进行比较也许才更符合策略的原始逻辑)。
我:获得纳指涨幅时,采用基金的净值,而不是场内交易的价格。
AI:给出了相应的改进。
我在聚宽运行后,看交易记录,发现交易有点频繁,猜原因是策略每天会先卖出,再选择标的并买入,看代码确认如此。
我:如果当前持仓就是目标ETF,则不用先清仓再买入。
AI:给出了相应的改进。
以下是本次与AI交互后给出的最终版:
import jqdata
初始化函数,设定基准等等
def initialize(context):# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 过滤掉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')
# 定义相关标的
g.chuangyeban = '399006.XSHE'# 创业板指
g.etf_nasdaq100 = '513100.XSHG'# 纳指100 ETF
g.etf_chuangyeban = '159915.XSHE'# 创业板ETF
g.etf_monetary = '511260.XSHG'#
# 运行函数,每天开盘前计算涨幅并决定交易
run_daily(calculate_and_trade, time='before_open', reference_security='000300.XSHG')
计算涨幅并决定交易的函数
def calculate_and_trade(context):# 获取创业板指过去20天的收盘价
cyb_prices = attribute_history(g.chuangyeban, 20, '1d', ['close'])
# 计算创业板指涨幅
cyb_gain = (cyb_prices['close'][-1] - cyb_prices['close'][0]) / cyb_prices['close'][0]
# 获取纳指100 ETF(513100)过去20天的基金净值数据
ndx_net_values = get_extras('acc_net_value', [g.etf_nasdaq100], count=20, end_date=context.current_dt, df=False)
ndx_net_values = ndx_net_values[g.etf_nasdaq100]
# 计算纳指100 ETF基于净值的涨幅
ndx_gain = (ndx_net_values[-1] - ndx_net_values[0]) / ndx_net_values[0]
# 获取当前可用现金
cash = context.portfolio.available_cash
if cyb_gain > ndx_gain and cyb_gain > 0:
target_etf = g.etf_chuangyeban
elif ndx_gain > cyb_gain and ndx_gain > 0:
target_etf = g.etf_nasdaq100
else:
target_etf = g.etf_monetary
current_position = context.portfolio.positions.keys()
if target_etf notin current_position:
# 先清空所有持仓
for security in current_position:
order_target(security, 0)
# 买入目标ETF
order_value(target_etf, cash)
log.info(f"买入 {target_etf}")
else:
log.info(f"当前持仓就是 {target_etf},无需操作")
这份最终的代码,在聚宽顺利回测,结果如下图:
可以看到,从2014 - 01 - 01到2025 - 01 - 02共11年,累计收益331.33%,年化收益14.63%。虽然没有原文号称的那么厉害,但也是一个可以用小资金尝试一下的动量策略。
从这次与AI交互编写策略的过程来看,对于一个完全不懂代码的人来说,想要顺利完成可能会有一些难度,但也并非完全做不到。只要仔细观察回测的交易情况,还是比较容易发现AI出现的小错误;而对于有编程经历的人,哪怕不懂Python(以我的经验,有编程经历的人,大概半天就能学会Python;如果没有编程经历,只要喜欢钻研,估计花一周到一个月左右的时间,也能掌握基本用法,满足需求),应该都能轻松上手。
投资的世界充满了无限可能,而AI的出现,无疑为我们开启了一扇全新的大门。不要被代码和技术吓倒,大胆迈出尝试的第一步。无论是有经验的投资老手,还是初涉投资领域的小白,都能在与AI的协作中,找到属于自己的投资灵感与策略。说不定,下一个创造惊人收益的策略,就诞生于你和AI的奇妙互动之中。快行动起来,让AI成为你投资路上的得力助手,一起在投资的海洋中乘风破浪,收获属于自己的财富硕果!
0
@commontiger
第一,凭直觉这个策略可能会盈利吗?第二,如果直觉告诉你世界上没有这种好事的话,那么很可能出在程序中引入了未来函数。这个例子中get_extra函数明显引入未来函数。一个好的程序员可以让AI成为有用工具,但让一个没经验的程序员用AI写出好的程序是不可能的,至少在现阶段。牛!这里的确有未来。