在期货市场中,“聪明钱”通常指一些具有显著影响力的主力资金或大额资金席位,这些资金的持仓变化往往会影响价格趋势和市场情绪。本文通过追踪中X期货的持仓变动,结合DADADATA数据分析平台,展示如何编写一个基于聪明钱持仓的日内交易策略,帮助交易者捕捉市场的潜在趋势。
一般而言,获取会员席位的持仓数据(龙虎榜)并不容易,通常需要在多个渠道查找和汇总。DADADATA平台提供了全品种上榜会员的每日持仓数据,使得我们能够轻松获取并利用这些数据。优宽量化团队在此基础上进一步整合了DADADATA的功能,通过数据筛选和分析,不仅提升了数据获取的便利性,还为构建量化策略提供了丰富的数据支持。
在DADADATA平台上,量化策略能够直接调用外部数据,并借助平台强大的实时更新功能,实现多因子模型的编写,极大地丰富了策略的数据来源。
该策略主要包含以下几部分:
以下是代码的具体实现。
聪明钱(大资金席位)的持仓数据是策略的关键依据。以下代码从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;
DATA1
:我们通过WITH
查询构造一个临时表DATA1
,用于提取"中X期货"的持仓数据。time_milliseconds
:通过EXTRACT(EPOCH FROM day)
将日期转换为毫秒时间戳,并加上8小时时区偏移量。day
和time_milliseconds
分组,按天聚合返回每个合约的持仓数据。在DADADATA平台上完成数据查询后,只需点击API按钮即可获取对应的数据源链接。然后在优宽量化策略中,可以直接引用该数据源,实现数据的自动调用和更新。通过这种方式,无需手动下载或整理数据,即可在策略中即时使用,极大地提高了数据分析的效率和策略开发的灵活性。
我们在优宽量化平台中利用实时数据制定交易决策。策略依次检查夜盘和日盘的交易信号,并根据市场开盘时间分批执行交易操作。
/*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); // 休眠一分钟再继续检查
}
}
p.OpenLong()
和p.OpenShort()
方法中执行多头和空头操作,并在p.CoverAll()
方法中进行统一平仓操作。该策略基于大资金席位的持仓数据,利用多空双方的资金流向作为开仓依据,确保开仓具备一定的可靠性。双向开仓能够在一定程度上起到对冲作用,降低市场波动对策略的影响。此外,策略采用日内平仓,保证资金的灵活性,并通过适时止盈来锁定部分收益,从而实现稳健的盈利目标。这是一种较为温和的策略,适合在稳健中求进。大家可以在此基础上进一步优化和完善策略,比如调整持仓权重、改进止盈止损机制等,以期开发出更加高效和稳健的交易策略。
以上代码构成了一个完整的日内交易策略框架,利用中X期货的持仓变化作为信号源,借助DADADATA平台的数据支持,将智能化的数据分析和量化策略开发结合在一起。策略通过简单的多空变化检测和持仓操作,能够及时捕捉市场中的聪明钱动向。
DADADATA平台提供了多维度的数据支持,包括期货持仓数据、基本面信息和期权数据,交易者可以进一步拓展数据分析的广度和深度,以实现更丰富的策略。以下是一些优化方向:
优宽量化借助DADADATA平台的数据支持,为期货交易者提供了基于聪明钱的全新量化策略思路。希望通过这一策略框架和示例代码,帮助交易者更有效地识别市场中的聪明钱动向,并利用这些数据构建稳健的日内交易策略。DADADATA不仅限于持仓数据,还涵盖了各类基本面数据,期待大家在平台上探索更多的量化交易机会。