[原创] 从直觉到数据:期货交易决策辅助系统设计与实现

一个真实的场景

早上开盘9点,你刷着大盘看到螺纹钢下跌3%。心跳加速,手指悬在"下单"按钮上方。脑子里闪过无数念头:

  • "现在不抄底就晚了!"
  • "基差怎么样?算了,来不及看了"
  • "我账户还有多少保证金?管他呢,先做再说"

点下按钮。结果瞬间暴跌5%,保证金不足被强平。

这就是90%期货散户的日常。我也是,直到搭建了这个工具。

核心思路:在冲动和下单之间加一道闸

这个工具做的事情很简单:

你的交易冲动 → 强制写下理由 → AI冷静分析 → 给出可执行方案 → 记录成长轨迹

关键在于三个独特设计:

1. 强制写下"为什么"

表单必须填写"交易思路"。当你试图用文字描述"为什么要做这笔交易"时,很多冲动就自然消退了。

❌ 模糊的冲动:"感觉要涨"
✅ 具体的理由:"突破60日均线+MACD金叉+成交量放大+基差收窄50点"

2. AI用多个维度验证你的逻辑

系统会自动收集4类数据并进行综合分析:

数据收集

持仓信息 ──┐
期现价差 ──┼──→ 数据合并 → AI分析
技术指标 ──┤
交易思路 ──┘

AI分析的4个维度:

  • 0️⃣ 交易思路验证(最重要):找出认知偏差,验证逻辑是否成立
  • 1️⃣ 技术信号验证:MACD/RSI/ATR/OBV是否支持你的判断
  • 2️⃣ 基本面验证:期现价差、基差结构是否支持方向
  • 3️⃣ 入场时机判断:现在能进还是等回调/突破

输出多个字段的完整分析:

{
  "思路原文": "跌了50个点,应该到底了",
  "思路评价": "不合理",
  "致命缺陷": "锚定效应——下跌50点不代表充分",
  "验证结果": "MACD=-213深度空头,RSI=31无底背离,基差扩大至-80",
  "执行建议": "放弃交易",
  "建议入场价格": "不建议入场",
  "止损价格": "3050",
  "止盈目标1_价格": "3150",
  // ...
}

3. 用交易日志记录你的成长轨迹

每次交易灵感分析自动存入CSV文件,一个月后打开你会看到:

日期 思路评价 致命缺陷 执行建议
9/1 不合理 追涨杀跌 放弃
9/5 不合理 忽视基差结构 放弃
9/8 部分合理 止损设置过宽 等待
9/12 合理 无明显缺陷 立即执行

这就是你从冲动到理性的进化过程

系统架构

完整流程图

工作流触发 → 表单输入 → 空值判断 → [数据收集] → 数据整理 → AI分析 → 存储 → 导出CSV
                            ↓
               ┌────────────┼────────────┐
               ↓            ↓            ↓
           持仓信息      期现价差     技术指标

第1层:交易灵感捕获

节点名称: 输入交易火花
类型: Wait节点(表单模式)

// 表单字段配置
{
  "交易品种": "text",      // 如rb2505(螺纹钢2505合约)
  "交易方向": "下拉框选择",  // LONG/SHORT/COVERLONG/COVERSHORT
  "交易数量": "number",    // 如10手
  "交易思路": "text"       // 核心!必须填写理由
}

关键设计:

  • 表单后接Switch节点判断是交易火花是否存在,存在进行下一步AI分析
  • 品种代码遵循期货市场标准(如rb2505、FG601、ag2512)

第2层:数据收集

路径1:收集持仓信息

节点名称: 收集持仓信息
类型: accountInfo节点

// 查询当前品种持仓
symbol: "{{ $json['交易品种'] }}"  // 如rb2505
operation: "getPosition"

// 输出示例
{
  "symbol": "rb2505",  // 持仓品种
  "amount": 5,         // 持仓数量(正数多仓,负数空仓)
  "price": 3080        // 持仓均价
}

路径2:收集期现价差数据

节点名称: HTTP 请求 → AI 智能体
类型: HTTP Request + AI Agent

第一步:获取期现数据

// API接口
url: "https://www.datadata.cn/api/v1/query/API-KEY/data"
method: "GET"
queryParameters: {
  "product_code": "{{ $json['交易品种'].replace(/[^a-zA-Z]/g, '').toUpperCase() }}"
  // rb2505 → RB, i2505 → I, ag2512 → AG
}

// 返回数据格式
[
  ["日期", "现货价格", "期货价格", "基差"],
  ["2025-07-25", 8873.67, 8933.0, 59.33],
  ["2025-10-11", 11150.7, 11213.0, 62.3],
  ...
]

为什么期现价差重要?
这是散户和机构最大的信息差之一:

  • 基差收窄(期货价格>现货价格缩小):做多信号
  • 基差扩大(期货价格>现货价格扩大):做空信号
  • 升贴水结构:反映市场对未来供需的预期
  • 套利机会:当基差偏离合理区间时存在跨市场套利

本节点API可以通过优宽量化的“数据探索”模块进行设置获取。

第二步:AI提取市场情绪

原始的期现价差数据是这样的:

[["日期", "现货价格", "期货价格", "基差"],
 ["2025-07-25", 8873.67, 8933.0, 59.33],
 ["2025-10-11", 11150.7, 11213.0, 62.3]]

对于小白用户来说,很难直接从这些数字中判断:

  • 基差变化意味着什么?
  • 价格走势是强是弱?
  • 对当前交易方向有什么指导意义?

所以这里用AI节点将原始数据"翻译"成易懂的市场情绪判断:

{
  "shortTermSentiment": {
    "category": "积极",
    "score": 0.65,
    "rationale": "近3个交易日现货价格从9927上涨至11150.7,期货同步上涨,市场呈现强劲上行态势"
  },
  "longTermSentiment": {
    "category": "积极",
    "score": 0.55,
    "rationale": "从7月至10月,现货价格从8873.67稳步上涨至11150.7,整体呈现稳定上升通道"
  }
}

这样后续的AI分析节点就能直接使用"积极/消极"、"0.65分"这样的结论,而不需要重新解读原始数据。

路径3:计算技术指标

节点名称: 信号指标计算
类型: tradingPlugin节点

function main(inputData) {
    const symbol = inputData  // 直接使用品种代码,如rb2601
    const records = exchange.GetRecords(symbol)
    
    // 数据校验
    if (records.length <= 10) {
        Log("Error: 数据不足");
        return null;
    }
    
    // 计算技术指标(使用talib库)
    const macd = talib.MACD(records);
    const rsi = talib.RSI(records, 14);
    const atr = talib.ATR(records, 14);
    const obv = talib.OBV(records);

    // 获取最近10个值
    function getLast10Values(arr) {
        if (!arr || arr.length === 0) return [];
        return arr.slice(-10);
    }

    return {
        MACD: {
            macd: getLast10Values(macd[0]),
            signal: getLast10Values(macd[1]), 
            histogram: getLast10Values(macd[2])
        },
        RSI: getLast10Values(rsi),
        ATR: getLast10Values(atr),
        OBV: getLast10Values(obv)
    };
}

返回的技术指标:

  • MACD(趋势指标):金叉/死叉/背离
  • RSI(振荡指标):超买(>70)/超卖(<30)
  • ATR(波动率):用于动态止损,适应期货高波动
  • OBV(成交量):资金流向,识别主力动向

路径4:交易意图本身

直接从表单传递,包含品种、方向、数量、交易思路

第3层:数据整理

节点名称: 数据整理
类型: Code节点(JavaScript)

// 初始化容器
let posData = null;
let contentData = null;
let technicalIndicators = null;
let tradeIdea = null;

// 遍历合并节点的所有输入
for (const item of items) {
    // =============== 持仓数据 ===============
    if (item.json.operation === 'getPosition' && item.json.result !== undefined) {
        posData = item.json.result;
        // 关键转换:数值→易读文本
        posData.amount = posData.amount == 0 ? "无持仓" : 
                         posData.amount > 0 ? "多仓" : "空仓";
    }

    // =============== 期现价差情感分析结果 ===============
    if (item.json.output !== undefined) {
        try {
            contentData = JSON.parse(item.json.output);
        } catch (e) {
            contentData = item.json.output;
        }
    }

    // =============== 技术指标数据 ===============
    if (item.json.MACD !== undefined || item.json.RSI !== undefined) {
        technicalIndicators = {
            "趋势指标MACD": item.json.MACD,
            "振荡指标RSI": item.json.RSI,
            "波动性指标ATR": item.json.ATR,
            "成交量分析OBV": item.json.OBV
        };
    }

    // =============== 交易意图 ===============
    if (item.json["交易品种"] !== undefined) {
        tradeIdea = {
            "交易品种": item.json["交易品种"],
            "交易方向": item.json["交易方向"],
            "交易数量": item.json["交易数量"],
            "交易思路": item.json["交易思路"]  // 核心!
        };
    }
}

// =============== 返回汇总结果 ===============
return [{
    json: {
        "持仓数据": posData,
        "情感分析": contentData,
        "技术指标": technicalIndicators,
        "交易意图": tradeIdea
    }
}];

为什么需要这个节点?

  • 四路数据格式不统一,需要规范化
  • 持仓数值需要转换成易读文本
  • 技术指标加上中文描述,方便AI理解
  • 期现价差数据需要结构化处理

第4层:AI决策分析(核心中的核心)

节点名称: AI 交易火花鉴定
类型: Agent节点

这是整个系统的灵魂。Prompt设计了严格的大宗商品期货分析框架:

分析框架(4维度):

0️⃣ 交易思路验证(优先级最高)
   - 该理由是否成立?(用技术指标+期现价差+情绪数据验证)
   - 是否存在认知偏差?(忽视基差结构/追涨杀跌/过度关注短期波动)
   - 风险收益比是否合理?(至少1.5:1)
   - 期现货价差是否支持该方向?(基差收敛/扩大趋势)

1️⃣ 技术信号验证
   - MACD方向是否支持交易方向?
   - RSI是否超买/超卖?
   - OBV与价格是否背离?
   - ATR波动率处于什么水平?

2️⃣ 基本面验证
   - 短期情绪分数(0-1)与价格走势是否匹配?
   - 长期情绪分数是否支持趋势延续?
   - 现货价格与期货价格关系?(正套/反套/基差收敛)
   - 基差变化趋势?(升贴水结构分析)

3️⃣ 入场时机判断
   - 当前价位是否在合理区间?
   - 是否需要等待回调/突破?
   - 持仓数据显示"无持仓"时,首次建仓风险控制策略?

输出要求:完整分析字段

{
  "分析时间": "2025-10-11T10:30:00.000Z",
  "交易品种": "rb2505",
  "交易方向": "LONG",
  "交易数量": "10",
  
  "思路原文": "跌了50个点,应该到底了",
  "思路评价": "不合理",
  "验证结果": "MACD=-213深度空头,RSI=31无底背离,OBV持续流出,基差扩大至-80",
  "致命缺陷": "锚定效应——下跌50点不构成反转理由;忽视基差扩大的空头信号",
  
  "执行建议": "放弃交易",
  "信心度": "高",
  "依据_思路验证": "交易逻辑存在严重缺陷,忽视基差结构",
  "依据_技术面": "MACD/RSI/OBV均显示空头趋势未结束",
  "依据_基差结构": "基差扩大至-80,期货贴水加深,现货疲软",
  "依据_风险点": "盲目抄底可能遭遇二次探底,潜在亏损150点+",
  
  "建议入场价格": "不建议入场",
  "建议入场条件": "交易思路存在重大缺陷",
  "建议入场时间": "放弃当前计划",
  "止损价格": "3650元/吨",
  "止损理由": "跌破关键支撑位",
  "止盈目标1_价格": "3750元/吨",
  "止盈目标1_仓位": "50%",
  "止盈目标1_理由": "回测阻力位",
  "止盈目标2_价格": "3820元/吨",
  "止盈目标2_仓位": "剩余仓位",
  "止盈目标2_理由": "关键整数关口",
  
  "核心风险": "当前处于下跌趋势中段,抄底过早可能遭遇止损",
  "风险收益比": "0.5:1",
  "潜在收益空间": "100,约2.7%",
  "最大回撤空间": "200,约5.4%",
  "风险等级": "高风险",
  
  "期现套利机会": "基差扩大至-80,存在反套机会,但需等待基差见顶",
  "波动率评估": "ATR=45,处于高波动,止损应设置在1.5倍ATR约67点",
  "资金流向判断": "OBV持续流出,主力资金离场明显",
  
  "操作摘要": "放弃抄底计划,等待MACD金叉+RSI底背离+基差收窄",
  "决策有效期": "直到技术面出现明确反转信号",
  "复核条件": "MACD金叉或RSI形成底背离或基差收窄至-40以内"
}

商品期货特有字段分析:

  • 依据_基差结构: 期现价差对交易方向的支持度
  • 期现套利机会: 判断是否存在跨市场套利空间
  • 波动率评估: ATR对止损位和仓位管理的影响
  • 资金流向判断: OBV变化反映的主力动向

第5层:结果存储和导出

节点1:AI分析整理存储

类型: Code节点

const rawData = $input.first().json.output;

// 提取JSON内容的函数(处理可能的markdown包裹)
function extractJSON(outputString) {
  try {
    // 首先尝试直接解析
    return JSON.parse(outputString);
  } catch (e) {
    // 如果失败,尝试从markdown代码块中提取
    const jsonMatch = outputString.match(/```json\n([\s\S]*?)\n```/);
    
    if (jsonMatch && jsonMatch[1]) {
      return JSON.parse(jsonMatch[1]);
    }
    
    // 尝试匹配没有language标识的代码块
    const codeMatch = outputString.match(/```\n([\s\S]*?)\n```/);
    if (codeMatch && codeMatch[1]) {
      return JSON.parse(codeMatch[1]);
    }
    
    throw new Error("无法从output中提取JSON内容: " + e.message);
  }
}

const result = extractJSON(rawData);
Log("本次交易分析:", JSON.stringify(result, null, 2));

// 使用_G全局存储函数(关键!)
let tradelog = _G('tradelog') || [];  // 初始化兜底

// 添加最新记录
tradelog.push(result);

// 持久化保存
_G('tradelog', tradelog);

Log("交易日志已更新,当前共有 " + tradelog.length + " 条记录");

return tradelog;

_G函数的价值:

  • 数据持久化存储,重启工作流后依然存在
  • 可以跨工作流共享数据
  • 非常适合记录历史交易决策

节点2:转换文件

类型: convertToFile节点

把JSON数组转换成CSV格式,包含所有字段。

节点3:存储交易日志

类型: writeFile节点

保存到本地tradelog.csv

CSV文件的长期价值:

这个文件记录了你的交易思维演变过程:

第1周: 10次想法 → 7次"不合理" → 认知偏差:追涨杀跌、忽视基差
第2周: 8次想法 → 5次"不合理" → 开始意识到期现价差的重要性
第4周: 6次想法 → 3次"不合理" → 学会等待技术信号+基差确认
第8周: 5次想法 → 1次"不合理" → 思路开始成熟
第12周: 4次想法 → 全部"合理" → 但2次建议"等待"

最大的改变: 不是交易频率减少了,而是每次下单前我知道期现价差在说什么,技术指标在说什么,主力资金在说什么

局限性(必须说清楚)

这个工具不是万能的:

❌ 不能预知黑天鹅: 政策突变、极端天气等无法预测
❌ 不能替代盘感: 老期货的"感觉"很难量化
❌ 不能保证盈利: 只能提高决策质量,不保证每笔都赚
❌ 不能对抗逼仓行情: 市场疯狂时,理性分析可能反而吃亏
❌ 期现数据有延迟: 现货价格数据可能存在1-2天延迟

但它能做到:
✅ 让你知道每笔交易的风险
✅ 帮你识别认知偏差
✅ 提醒你关注期现价差
✅ 用ATR科学设置止损
✅ 记录你的成长轨迹
✅ 避免最低级的错误

改进方向

短期优化:

  • 接入更多现货价格源
  • 增加库存数据、宏观情绪新闻
  • 优化基差分析算法
  • 增加历史回测模块

后续完善:

  • 对接CTP接口实现半自动下单
  • 多个AI Agent投票(激进派vs保守派)
  • 根据品种特性调整权重(黑色/有色/化工/农产品)
  • 增加跨品种套利分析

快速开始(5分钟)

第1步:导入工作流

复制文章末尾策略链接,进行策略复制。

第2步:配置API密钥

需要配置2个API:

  1. AI模型:在两个OpenAI模型节点配置
  2. 交易所API(持仓查询):交易所板块设置(实盘需要)

期现价格数据API(已配置):

  • 使用现货公开接口(数据探索模块配置)
  • 支持主流期货品种(螺纹钢RB、铁矿石I、白银AG等)

第3步:测试运行

  1. 点击"定时触发器"节点
  2. 填写表单测试:
    • 品种:rb2505(螺纹钢2505合约)
    • 方向:LONG
    • 数量:10
    • 思路:"基差收窄+MACD金叉,做多"
  3. 等待AI分析,查看分析结果并储存
  4. 查看本地生成的tradelog.csv
# 1. 进入托管者日志目录
cd ~/logs/storage

# 2. 找到你的策略ID目录
cd 策略ID/files

# 3. 查看交易日志
cat tradelog.csv

第4步:自我驯化

每次有交易冲动就填表单,让AI帮你冷静分析。建议每周末打开tradelog.csv复盘一次,看看自己最常犯哪些错误(追涨杀跌?盲目抄底?),持续使用1-2个月后,你会清晰看到自己从冲动到理性的进化轨迹。

最后想说的

这个工具最大的价值,不是帮你赚了多少钱,而是:

它逼着你在每次下单前问自己三个问题:

  1. 我为什么要做这笔交易?(交易思路)
  2. 期现价差在说什么?(基差结构)
  3. 技术指标和资金流向支持吗?(MACD/RSI/OBV)
  • 如果你答不上来 → 这就是**
  • 如果你答得上来但AI指出缺陷 → 这是学习
  • 如果你和AI都认为合理但还是亏了 → 这是正常的试错

期货交易的终极目标,不是打败市场,而是理解自己。理解自己的贪婪、恐惧、和自以为是。

这个交易日志文件,就是你的自我认知之路。

技术支持: 欢迎在评论区讨论
免责声明: 工具仅供学习,期货交易有风险,请谨慎决策

策略链接 :https://www.youquant.com/strategy/409371
注意 :本框架只是初步实现,需要优化更多Bug处理和功能完善

 

免责声明:信息仅供参考,不构成投资及交易建议。投资者据此操作,风险自担。
如果觉得文章对你有用,请随意赞赏收藏
相关推荐
相关下载
登录后评论
Copyright © 2019 宽客在线