大家好,我是 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)
}
}