一、期货因子分析
1.1 创建流程
在官网顶部导航栏的<AI工作流>中新建一个空白的工作流,然后使用AI助手来创建工作流.在对话框中输入如下内容:
帮我⽣成⼀个期货因⼦分析的框架;因⼦是关于量价⽅⾯的,在2024-2025年分析,并 给出分析结果
如上图所示,等待一会,就会生成因子分析流程图.
1.2 学习公式含义
第一个节点里面有很多公式,内容如下:
RANK(RETURNS(VOLUME,5)) + RANK(RETURNS(VOLUME,20)) + RANK((RETURNS(CLOSE,5)+RETURNS(CLOSE,20))RETURNS(VOLUME,5)) - RANK((RETURNS(CLOSE,5)+RETURNS(CLOSE,20))-RETURNS(VOLUME,5)) + RANK(CORR(RETURNS(CLOSE,1),RETURNS(VOLUME,1),20)) + RANK(CORR(RETURNS(CLOSE,1),RETURNS(VOLUME,1),60))
假如我们不清楚含义,可以复制下来,咨询deepseek、千问这些,
咨询千问
提示词如下:
帮我解释下pandaai的公式,公式如下RANK(RETURNS(VOLUME,5)) + RANK(RETURNS(VOLUME,20)) + RANK((RETURNS(CLOSE,5)+RETURNS(CLOSE,20))RETURNS(VOLUME,5)) - RANK((RETURNS(CLOSE,5)+RETURNS(CLOSE,20))-RETURNS(VOLUME,5)) + RANK(CORR(RETURNS(CLOSE,1),RETURNS(VOLUME,1),20)) + RANK(CORR(RETURNS(CLOSE,1),RETURNS(VOLUME,1),60)).官方有因子编写与函数参考手册,参考链接为:https://www.pandaai.online/community/article/72
我使用的是千问,解释如下图:
咨询pandaai
当然作为要一直用pandaai的我们,肯定要用pandaai自己的工具啦.使用方法,在画布中单独创建一个python节点,问完之后删除即可.
点击python节点的 “代码” 进入代码助手,进行提问.
如上图,可以看出,pandaai的代码助手回答的也是很好的.
1.3 启动工作流进行回测
点击页面右上角的 <启动工作流> ,等待一会就能回测完成.
1.4 查看回测结果
部分截图如下:
1.5 注意事项
这个因子分析,目前暂时不支持实盘和仿真.如果应用实盘,报错如下:
二、期货策略回测
1.1 创建流程
在官网顶部导航栏的<AI工作流>中新建一个空白的工作流,然后使用AI助手来创建工作流.在对话框中输入如下内容:
帮我⽣成⼀个期货策略回测的框架,策略逻辑是布林带突破,在沪银主⼒合约上测 试,时间范围2025年。
如上图所示,等待一会,就会生成因子分析流程图.
1.2 理解⼯作流结构与代码逻辑
点击 <Python代码输⼊> 节点,将弹出一个代码编辑框,左侧是源代码,右侧是AI代码助手.我们先大概看下代码,如果有不懂的可以在右侧进行提问.示例如下图:
右侧代码解释很详细,新手也能看得懂.
如果你除了源码之外还有别的不懂,也可以直接问,比如专业术语,如下图:
还可以让AI代码助手给你总结下这个策略,如下图:
1.3 修改与调试⼯作流
1.3.1 增加⽌损条件,亏损超过4.4%平仓
直接跟AI代码助手说出自己的想法,然后等待它的修改,如下图:
大致看一遍它给出的代码,认为没问题就点击 应用 按钮,如下图:
然后再点击左侧代码框里面的 应用,然后点击 保存 即可,如下图:
1.3.2 将回测时间改为20250601到20260201
直接将想法跟AI代码助手说,如下图:
再次回测
再次点击右上角的 启动工作流 ,如下图:
如上图,工作流报错,现在还可以点击 “AI智能修复” 按钮快捷修复.点击后会自动跳转到AI代码助手,并回发送 “根据运行日志修复错误” ,这个错误日志在系统里面是有保存的,底层通过一些工具将日志拼接到提示词里面,然后AI助手就可以快速修复了,不需要我们手动复制日志报错.是不是很方便?如下图:
如果不使用上图的 AI智能修复,我们点击python节点,弹出编辑框后,右下角也会自动提示上次运行报错,这里也可以使用 AI智能修复,如下图:
修改后发现还是不行,经过几次调试,发现是回测时的时间问题,回测结束时间为20260122还是能回测成功的(当前日期为2026年2月27日),但是改为20260123及之后就不行了,应该是数据有问题,回头将问题提交上去,看看是不是bug.
正常运行如下图:
报错如下图:
1.3.3 将测试合约从沪银改为沪金
直接跟AI代码助手说出自己的想法,然后等他修改,如下图:
然后进行回测和查看结果.
三、连接仿真实盘
1.1 创建实盘账号
点击左侧导航栏 <超级图表> ,按下图红色标记操作,先点击 “实盘”,然后点击 “账号管理”,如下图
然后点击 创建仿真盘账号,如下图
然后输入账号名称,这个字母加数字都可以,然后点击 确认添加 ,如下图
然后点击创建实盘,如下图:
然后填写实盘名称,运行工作流这个,选择刚刚保存的工作流,实盘账号,选择刚刚创建的仿真盘账号,如下图:
运行成功,如下图:
四、未解决的问题
我写的期货策略,周期是天,然后我应用因为周期比较久,我就想把运行周期改为1分钟,我的做法是将回测频率从1d改为1M,然后关闭实盘重新启动,发现会找不到对应的主力合约.我就修改了个周期,如下图:
上面是夜盘测试的,现在我在白天又重新启动了下,发现不报找不到对应主力合约了,但是就开始打印了些日志,后面好几分钟过去了,也没新的日志.截图的时候是2026-2-28 09:48,已经过去20分钟了.如下图:
在回测里面是正常的,每一分钟都能打印出来,我调试了几次,实盘都没正常.后续再调试下,然后也让官方帮我看看.回测如下图:
后来我写了个特别简单的示例,在 def handle_data(context, bar) 这个方法里面,只打印K线信息,发现回测时不管是1M还是1d都是好的,但是在实盘中,还是启动的时候打印几条日志,后面无论多久都没有日志了.
from panda_backtest.api.api import *
from panda_backtest.api.stock_api import *
import panda_data
def initialize(context):
"""策略初始化:只做数据遍历,不做任何交易"""
# 虽然不下单,但需设置期货账号字段以防框架访问
context.account = "5588"
# 回测区间(供日志使用,真正的起止日期由回测引擎配置)
context.start_date = "20260201"
context.end_date = "20260205"
# 预先查询整个回测区间内沪银(品种代码 AG)的主力合约映射
dominant_df = panda_data.get_future_dominant(
underlying_symbol=["AG"],
start_date=context.start_date,
end_date=context.end_date,
)
# 构建 {date: symbol} 映射,date 统一为字符串格式 YYYYMMDD
context.ag_dominant_map = {}
if dominant_df is not None and not dominant_df.empty:
for _, row in dominant_df.iterrows():
trade_date = str(row["date"])
symbol = row["symbol"] # 例如 "AG2602.SHF"
context.ag_dominant_map[trade_date] = symbol
print("初始化完成: 预加载沪银主力合约映射条数 = {}".format(len(context.ag_dominant_map)))
def handle_data(context, bar):
"""每分钟回调:仅打印当前时间点沪银主力合约的分钟K线信息,不做任何交易"""
# 当前回测日期(YYYYMMDD)
trade_date = str(context.now)
# trade_time 有的环境为字符串,有的为 datetime;统一转成 HHMMSS 字符串
trade_time_raw = getattr(context, "trade_time", None)
trade_time = ""
if trade_time_raw is not None:
# 如果是 datetime 类型,提取时间再格式化
try:
# datetime 或带 time() 方法
if hasattr(trade_time_raw, "strftime"):
trade_time = trade_time_raw.strftime("%H%M%S")
else:
# 其他类型,一律转字符串
trade_time = str(trade_time_raw)
except Exception:
trade_time = str(trade_time_raw)
# 根据日期获取当日沪银主力合约
symbol = context.ag_dominant_map.get(trade_date)
if not symbol:
print(f"{trade_date} 无沪银主力合约映射,跳过该分钟")
return
# 从 bar 对象中获取该合约的当前分钟行情
try:
future_bar = bar[symbol]
except Exception:
# 有可能该分钟还没有该合约的行情
print(f"{trade_date} {trade_time} 无行情: {symbol}")
return
# 组装一个可读的时间戳
ts = trade_date
if trade_time and len(str(trade_time)) == 6:
tt = str(trade_time)
ts = f"{trade_date} {tt[:2]}:{tt[2:4]}:{tt[4:6]}"
# 打印分钟K线信息:时间戳、合约、开高低收、成交量
print(
"[沪银主力分钟K线] 时间: {ts}, 合约: {symbol}, 开: {o}, 高: {h}, 低: {l}, 收: {c}, 成交量: {v}, 持仓量: {oi}, 成交额: {amt}".format(
ts=ts,
symbol=symbol,
o=future_bar.open,
h=future_bar.high,
l=future_bar.low,
c=future_bar.close,
v=future_bar.volume,
oi=getattr(future_bar, "oi", 0),
amt=getattr(future_bar, "turnover", 0.0),
)
)
# 不进行任何交易操作
return