输入/搜索内容
1
关注
183
关注者
智能数据驱动量化策略:基于聪明钱的日内交易模型
创建于 2024-11-01 15:17:27  更新于 2024-11-04 20:30:34
 0
 1429

img

引言

在期货市场中,“聪明钱”通常指一些具有显著影响力的主力资金或大额资金席位,这些资金的持仓变化往往会影响价格趋势和市场情绪。本文通过追踪中X期货的持仓变动,结合DADADATA数据分析平台,展示如何编写一个基于聪明钱持仓的日内交易策略,帮助交易者捕捉市场的潜在趋势。

为什么选择DADADATA平台?

一般而言,获取会员席位的持仓数据(龙虎榜)并不容易,通常需要在多个渠道查找和汇总。DADADATA平台提供了全品种上榜会员的每日持仓数据,使得我们能够轻松获取并利用这些数据。优宽量化团队在此基础上进一步整合了DADADATA的功能,通过数据筛选和分析,不仅提升了数据获取的便利性,还为构建量化策略提供了丰富的数据支持。

在DADADATA平台上,量化策略能够直接调用外部数据,并借助平台强大的实时更新功能,实现多因子模型的编写,极大地丰富了策略的数据来源。

img

策略架构

该策略主要包含以下几部分:

  1. 数据准备:DATADATA获取每日持仓数据,并过滤出中X期货的持仓变动。
  2. 核心策略逻辑:根据持仓变化情况,在优宽量化制定交易决策。
  3. 开仓与平仓机制:按日内固定时间开仓、平仓,并设置止盈和止损条件。

以下是代码的具体实现。

数据准备:聪明钱持仓数据过滤

聪明钱(大资金席位)的持仓数据是策略的关键依据。以下代码从datadata平台获取了"中X期货"的持仓变化数据,筛选出有显著变化的仓位信息。

sql
WITH DATA1 AS ( SELECT *, EXTRACT(EPOCH FROM day)::bigint * 1000 + 1000 * 60 * 60 * 8 AS time_milliseconds FROM derive.f_member_position WHERE member = '中X期货' AND ( (abs(long_position) > 0 AND abs(long_position_change / long_position) > 0.1) OR (abs(short_position) > 0 AND abs(short_position_change / short_position) > 0.1) ) AND day > '2024-01-01' ORDER BY day ) SELECT time_milliseconds AS time, day, json_agg(json_build_object( 'contract', contract, 'exchange_code', exchange_code, 'long_position', long_position, 'long_position_change', long_position_change, 'short_position', short_position, 'short_position_change', short_position_change )) AS data FROM DATA1 GROUP BY time_milliseconds, day ORDER BY day;

代码解释

  1. DATA1:我们通过WITH查询构造一个临时表DATA1,用于提取"中X期货"的持仓数据。
  2. time_milliseconds:通过EXTRACT(EPOCH FROM day)将日期转换为毫秒时间戳,并加上8小时时区偏移量。
  3. 筛选条件:我们设定了当长/空仓位变化量占总持仓量的比率超过10%时,保留该数据,以捕捉显著的持仓变化。
  4. 输出结构:最终按daytime_milliseconds分组,按天聚合返回每个合约的持仓数据。

在DADADATA平台上完成数据查询后,只需点击API按钮即可获取对应的数据源链接。然后在优宽量化策略中,可以直接引用该数据源,实现数据的自动调用和更新。通过这种方式,无需手动下载或整理数据,即可在策略中即时使用,极大地提高了数据分析的效率和策略开发的灵活性。

img

2. 策略逻辑实现:聪明钱日内交易策略

我们在优宽量化平台中利用实时数据制定交易决策。策略依次检查夜盘和日盘的交易信号,并根据市场开盘时间分批执行交易操作。

javascript
/*backtest start: 2024-01-03 00:00:00 end: 2024-01-31 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}] */ const dayOpen = ['IF', 'IC', 'IH', 'IM','TS', 'TF', 'T', 'TL', 'LC', 'SI', 'UR', 'PK', 'AP', 'CJ', 'SF', 'SM', 'LH', 'JD', 'EC', 'WR', 'RS', 'BB', 'FB']; //日内持仓品种 const finanSymbol = ['IF', 'IC', 'IH', 'IM','TS', 'TF', 'T', 'TL']; //风险品种 function main() { LogReset(0); Log('聪明钱持仓策略(2024-10-24测试版1.0)启动' + '#FFOOOO'); // 过滤错误信息,避免影响程序正常运行 SetErrorFilter("login|ready|流控|连接失败|初始|Timeout|GetAccount|Futures_OP 2|(CTP_T@9999) Error|(CTP_T@10010) Error"); var p = $.NewPositionManager(); // 创建一个新的仓位管理对象 var longNight = []; // 存储夜盘多头仓位的数组 var shortNight = []; // 存储夜盘空头仓位的数组 var longDay = []; // 存储日盘多头仓位的数组 var shortDay = []; // 存储日盘空头仓位的数组 // 锁用于控制特定时间的操作,防止重复执行 var checklock = true; var nightlock = true; var daylock = true; var closelock = true; // 初始化账户的权益,用于计算盈亏 var initaccount = _C(exchange.GetAccount).Equity; // 主循环,持续运行 while(true) { if(exchange.IO('status')) { // 检查交易所连接状态 var now = new Date(); // 获取当前时间 var hours = now.getHours().toString().padStart(2, '0'); var minutes = now.getMinutes().toString().padStart(2, '0'); var timeString = `${hours}:${minutes}`; // 晚上20:58执行持仓数据获取 if(timeString === '20:58' && checklock) { // 请求获取持仓数据 var obj = exchange.GetData("https://www.datadata.cn/api/v1/query/ee79469c-48cf-43be-b605-a9454430155d/data"); var datainfo = JSON.parse(obj["Data"]); // 检查数据时间是否为当天,若不是则稍后重试 if(_D(obj.Time).slice(0, 10) != _D().slice(0, 10)){ Sleep(1000 * 5); continue; } var longRanked = []; var shortRanked = []; // 处理获取的持仓数据,筛选符合条件的合约 for(var i in datainfo) { var curSymbol = datainfo[i].contract; var exchangeCode = datainfo[i].exchange_code; var longPower = datainfo[i].long_position_change / (datainfo[i].long_position + datainfo[i].short_position); var shortPower = datainfo[i].short_position_change / (datainfo[i].long_position + datainfo[i].short_position); var maincode = curSymbol.replace(/\d/g, ''); // 排除金融品种及持仓量小于500的合约 if(finanSymbol.includes(maincode) || datainfo[i].long_position < 500 || datainfo[i].short_position < 500) { continue; } // 判断多头和空头的持仓变化比例,筛选符合条件的合约 if(longPower - shortPower > 0.1) { longRanked.push({ symbol: curSymbol, power: longPower, exchangeCode: exchangeCode }); } if(shortPower - longPower > 0.1) { shortRanked.push({ symbol: curSymbol, power: shortPower, exchangeCode: exchangeCode }); } } // 对筛选出的多空头仓位分别排序并取前5名 longRanked = longRanked.sort((a, b) => b.power - a.power).slice(0, 5); shortRanked = shortRanked.sort((a, b) => b.power - a.power).slice(0, 5); // 根据合约的交易时段,分类为日盘和夜盘 longDay = longRanked.filter(item => dayOpen.includes(item.symbol.replace(/\d/g, ''))); shortDay = shortRanked.filter(item => dayOpen.includes(item.symbol.replace(/\d/g, ''))); longNight = longRanked.filter(item => !dayOpen.includes(item.symbol.replace(/\d/g, ''))); shortNight = shortRanked.filter(item => !dayOpen.includes(item.symbol.replace(/\d/g, ''))); // 对符合条件的合约根据交易所类型做小写处理 longDay = longDay.map(item => item.exchangeCode !== 'CZCE' && item.exchangeCode !== 'CFFEX' ? item.symbol.toLowerCase() : item.symbol); shortDay = shortDay.map(item => item.exchangeCode !== 'CZCE' && item.exchangeCode !== 'CFFEX' ? item.symbol.toLowerCase() : item.symbol); longNight = longNight.map(item => item.exchangeCode !== 'CZCE' && item.exchangeCode !== 'CFFEX' ? item.symbol.toLowerCase() : item.symbol); shortNight = shortNight.map(item => item.exchangeCode !== 'CZCE' && item.exchangeCode !== 'CFFEX' ? item.symbol.toLowerCase() : item.symbol); checklock = false; daylock = true; nightlock = true; closelock = true; Log('获取聪明资金持仓数据成功','#ff0000'); Log('夜多:', longNight); Log('夜空:', shortNight); Log('日多:', longDay); Log('日空:', shortDay); } // 晚上21:00开夜盘持仓 if(timeString === '21:00' && nightlock) { for(var i of longNight) { try { p.OpenLong(i, 1); } catch (e) { Log("Error in longNight position for", i, e); } } for(var i of shortNight) { try { p.OpenShort(i, 1); } catch (e) { Log("Error in shortNight position for", i, e); } } nightlock = false; } // 早上9:00开日盘持仓 if(timeString === '09:00' && daylock) { for(var i of longDay) { try { p.OpenLong(i, 1); } catch (e) { Log("Error in longDay position for", i, e); } } for(var i of shortDay) { try { p.OpenShort(i, 1); } catch (e) { Log("Error in shortDay position for", i, e); } } daylock = false; } // 下午14:58清仓 if(timeString === '14:58' && closelock) { var closepos = exchange.GetPositions(); if (typeof(closepos) === 'undefined') return; if(closepos.length > 0) { Log('日内清仓', '#0000ff'); p.CoverAll(); } closelock = false; checklock = true; } // 获取当前持仓,更新表格并检查盈亏情况 var checkpos = exchange.GetPositions(); if (typeof(checkpos) === 'undefined') return; var talStatus = { type: "table", title: "持仓信息", cols: ["品种名称", "持仓方向", "持仓均价", "持仓数量", "持仓盈亏"], rows: [] }; if(checkpos.length > 0){ for(var i of checkpos){ var color = i.Profit > 0 ? '#ff0000' : '#00ff00'; talStatus.rows.push([i.Symbol, i.Type%2 == 0 ? '多头' : '空头', i.Price , i.Amount, i.Profit + color]); // 盈利超过一定比例时进行止盈 if(i.Profit / i.Amount > 1000){ Log(i.Profit, i.Symbol, '超出止盈条件, 清仓','#0000ff'); p.CoverAll(); } } LogStatus(talStatus); } else { LogStatus("当前无持仓信息",'#FF0000'); } } Sleep(1000 * 60); // 休眠一分钟再继续检查 } }

代码说明

  1. 夜盘与日盘交易逻辑:根据北京时间,20:58获取目标席位持仓数据,统计夜盘和日盘开仓品种,21:00开启夜盘,9:00开启日盘,14:58清仓以避免日内持仓风险。
  2. 交易操作:在p.OpenLong()p.OpenShort()方法中执行多头和空头操作,并在p.CoverAll()方法中进行统一平仓操作。
  3. 数据筛选:筛选持仓变化明显的品种,并根据优先级分别选择日盘和夜盘进行交易。

代码运行结果

该策略基于大资金席位的持仓数据,利用多空双方的资金流向作为开仓依据,确保开仓具备一定的可靠性。双向开仓能够在一定程度上起到对冲作用,降低市场波动对策略的影响。此外,策略采用日内平仓,保证资金的灵活性,并通过适时止盈来锁定部分收益,从而实现稳健的盈利目标。这是一种较为温和的策略,适合在稳健中求进。大家可以在此基础上进一步优化和完善策略,比如调整持仓权重、改进止盈止损机制等,以期开发出更加高效和稳健的交易策略。

img

策略总结与优化

以上代码构成了一个完整的日内交易策略框架,利用中X期货的持仓变化作为信号源,借助DADADATA平台的数据支持,将智能化的数据分析和量化策略开发结合在一起。策略通过简单的多空变化检测和持仓操作,能够及时捕捉市场中的聪明钱动向。

DADADATA平台提供了多维度的数据支持,包括期货持仓数据、基本面信息和期权数据,交易者可以进一步拓展数据分析的广度和深度,以实现更丰富的策略。以下是一些优化方向:

  • 多因子模型:将持仓数据与其他因子结合,例如基本面数据、技术指标等,构建多因子模型,增强策略的稳健性。
  • 不同周期的策略组合:尝试将不同周期的数据融合,进行跨周期分析。
  • 智能化数据筛选:利用机器学习算法对持仓变化进行智能化筛选,提高策略信号的准确度。

结语

优宽量化借助DADADATA平台的数据支持,为期货交易者提供了基于聪明钱的全新量化策略思路。希望通过这一策略框架和示例代码,帮助交易者更有效地识别市场中的聪明钱动向,并利用这些数据构建稳健的日内交易策略。DADADATA不仅限于持仓数据,还涵盖了各类基本面数据,期待大家在平台上探索更多的量化交易机会。

评论
全部评论 (0)
暂无数据
暂无数据
  • 1
iPhone 下载
社区
回测系统
© 2015 - ∞ YouQuant 豫ICP备19046564号