一种基于动量的趋势交易策略

大家好,我是 Rousseau。今天用 DeworkHub 的账号上线跟大家交流一下我们的量化策略,选取的币种是 BTC 和 HYPE。

本策略有四个步骤,分别如下:

① 首先选择一个时间作为开盘价格(因为区块链 7 * 24h 交易,因此我们选择的时间是 2024.12.22 的 20 : 00 ~ 23 : 59),由开盘价格和走线价格计算出具体的 move 值,这里的 i 从 1 ~ 4 是因为我们一共是四个小时的分区做时序计算。

move_{t-i,20:00-HH:MM} = |\frac{Close_{t-i,HH:MM}}{Open_{t-i,20:00}}-1|, where\quad i = [1,4]

② 根据 move 的数组,可以得到算出其平均值 \sigma

\sigma_{t,20:00-HH:MM}=\frac{1}{4}\sum_{i=1}^{4}move_{t-i,20:00-HH:MM}

③ 计算上下沿:

UpperBound_{t,HH:MM}=Open_{t,20:00}\times(1+\sigma_{t,20:00-HH:MM})
LowerBound_{t,HH:MM}=Open_{t,20:00}\times(1-\sigma_{t,20:00-HH:MM})

④ 得到一个噪声带,就是由上下沿构成的半封闭区域。

这个量化的策略是,如果从开盘时开始算起,倘若 K 线突破上沿,则做多,当 K 线回调至突破下沿时,平仓;若突破下沿,则做空,若 K 线突破上沿时,平仓。或者在每个固定时间,例如每小时平仓一次。

以下是基于 Node.js 的策略代码,非生产环境,因此写得比较简陋,数据需要你们自己通过 OKX,BINANCE 或者 HyperLiquid 等交易所或数据供应商进行获取。

var { data } = require("./data.json")

/**
 * 使用 2024.12.22 20:00 - 23:59 共计 4 小时的分钟级数据进行策略计算
 * t = [1,4]
 * ts,o,h,l,c,vol,volCcy,volCcyQuote,confirm
 */

function cal_move(close, const_open, num) {
    return Math.abs((close / const_open) - num)
}

function cal_sigma(move_arr) {
    var sum = 0;
    for (var i = 0; i < move_arr.length; i++) {
        sum = sum + move_arr[i];
    }
    return sum / 4;
}

function upperbound(const_open, sigma) {
    return const_open * (1 + sigma)
}

function lowerbound(const_open, sigma) {
    return const_open * (1 - sigma)
}

/**
 * 转置数据
 * @param {} data 
 * @returns 
 */
function redata(data) {
    var data_arr = [];
    for (var i = 239; i >= 0; i--) {
        data_arr.push(data[i]);
    }
    return data_arr;
}

data = redata(data)

const open_price = 95370.9;
//存放 4 个开盘价的值
var open_arr = [];
for (var epoch = 0; epoch < 60; epoch++) {
    //存放 move_t-i 的值
    var move_arr = [];
    var count = 0;
    for (var index = 0 + epoch; index < 240; index += 60) {
        if (index == 0 || index == 60 || index == 120 || index == 180) {
            //开盘价
            open_arr.push(data[index][1])
        } else {
            move_arr.push(cal_move(parseFloat(data[index][4]), parseFloat(open_arr[count]), 1))
            count++
        }
    }
    if (epoch != 0) {
        var sigma = cal_sigma(move_arr)
        var upperbound_value = upperbound(open_price,sigma);
        var lowerbound_value = lowerbound(open_price,sigma);
        console.log("上沿:", upperbound_value, "下沿:", lowerbound_value)
    }
}

往往我们认为,如果我们预测的 i 是以小时为基准的,那么在真实状态下,是每小时进行一次平仓操作,如果 i 是天为基准的,则每天平仓一次。但允许中间有断点跳跃的情况发生,即允许每日多次开仓平仓。

另外,建议止损线和止盈线都要开着,均为 3% 。