资源加载中... loading...

智能数据驱动量化策略:基于聪明钱的日内交易模型

Author: ianzeng123, Created: 2024-11-01 15:17:27, Updated: 2024-11-04 20:30:34

img

引言

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

为什么选择DADADATA平台?

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

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

img

策略架构

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

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

以下是代码的具体实现。

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

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

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. 策略逻辑实现:聪明钱日内交易策略

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

/*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不仅限于持仓数据,还涵盖了各类基本面数据,期待大家在平台上探索更多的量化交易机会。


更多内容