적응형 이동 평균 그리드 양적 거래 전략

SMA MA GRID ATR volatility MEAN REVERSION
생성 날짜: 2025-07-02 14:08:13 마지막으로 수정됨: 2025-07-02 14:08:13
복사: 0 클릭수: 584
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

적응형 이동 평균 그리드 양적 거래 전략 적응형 이동 평균 그리드 양적 거래 전략

개요

자기 적응형 평평선 그리드 계량 거래 전략은 평평선과 격자 거래의 개념에 기반한 계량 전략이다. 이 전략은 가격의 간단한 이동 평균 ((SMA) 을 시장 경향의 중심선으로 계산한 다음 중앙선 아래의 일정 비율의 격자선을 설정한다. 이 격자선 사이에 가격이 변동하면, 이 전략은 가격이 하위 격자선을 접촉했을 때 구매하고 상위 격자선을 접촉했을 때 판매한다. 이 거래 방법은 가격 변동이 있지만 전체적으로 평평선 주위에 흔들리는 시장 환경에서 특히 적합하다.

전략 원칙

자기 적응평평선그리드 수량 거래 전략의 핵심 원리는 시장 가격의 평균값 회귀 특성에 기반한다. 전략은 다음과 같은 단계를 통해 구현된다:

  1. 가격의 간단한 이동 평균 ((SMA) 을 계산하고, 시장의 중간 참조 값으로 . 코드는 300시간의 이동 평균을 사용하며, 이 기간은 단기 변동을 필터링하기에 충분히 길다.
  2. 이동 평균을 기반으로 위아래 편차율을 설정 (이 예에서는 3%), 그리드 거래의 상하한을 결정한다.
  3. 사용자가 설정한 그리드 라인 수 (최대 15개) 에 따라, 위아래 경계 사이에 균등하게 분포된 그리드 라인
  4. 거래의 정확한 실행을 보장하기 위해, 각 격자 위치에 대한 보유 상태를 기록하는 펄 배열을 사용한다.
  5. 거래 논리:
    • 가격이 특정 격자선보다 낮고 그 위치가 포지션이 없는 경우 그 격자 위치에서 구매한다.
    • 가격이 어떤 격자선보다 높고 다음의 낮은 격자 위치가 포지션을 보유했을 때, 평점 그 낮은 위치의 포지션을 보유한다.

이 전략의 본질은 가격의 높은 주파수 변동을 특정 범위 내에서 포착하여 “저가거나 고가”를 구현하는 것이다. 이 전략은 동시에 여러 포지션을 보유할 수 있다 (최대 15개), 각 포지션은 다른 그리드 라인에 대응하며, 이 디자인은 전략이 가격 변동을 더 충분히 활용할 수 있도록 한다.

전략적 이점

적응형 일률적인 격자 수량 거래 전략은 다음과 같은 중요한 이점을 가지고 있다:

  1. 적응력전략: 이동 평균을 기반으로 격자 위치를 자동으로 조정하여 다른 시장 환경과 가격 수준 변화에 적응할 수 있습니다.
  2. 위험 분산여러 격자 위치의 거래를 통해 자금 분산 투입을 실현하고 단일 거래의 위험을 줄입니다.
  3. 빈번한 수익 기회이 전략은 시장이 흔들리는 동안에도 작은 변동으로 인한 수익 기회를 잡을 수 있습니다.
  4. 명확한 출입 신호거래 신호는 명확한 가격에 기반하여 그리드 라인 조건에 접촉하여 주관적인 판단을 줄이고 전략 실행의 일관성을 높인다.
  5. 매개 변수 간결하고 조정하기 쉬운전략은 이동 평균 길이, 격자 편차율 및 격자 수의 세 가지 주요 매개 변수를 조정하여 최적화 및 재측정을 용이하게 합니다.
  6. 논리가 명확합니다.: 배열 구조를 사용하여 격자 가격과 주문 상태를 저장하고, 코드 논리는 명확하고, 이해하기 쉽고 유지 관리하기 쉽다.
  7. 시각화 지원전략: 트레이더가 트레이딩 구역과 잠재적인 트레이딩 포인트를 직관적으로 볼 수 있도록 그리드 라인의 시각화를 제공합니다.

전략적 위험

이 전략은 합리적으로 설계되었지만, 다음과 같은 잠재적인 위험들이 있습니다.

  1. 트렌드 시장 위험강한 트렌드 시장에서, 가격이 한 방향으로 계속 움직일 수 있으므로, 전략이 한쪽에서 계속 입장을 열고 적당한 입장을 취하는 기회가 부족하여 자본 점유율이 증가하고 큰 손실이 발생할 수 있습니다. 해결책은 트렌드 필터 조건을 추가하거나 최대 입장 제한을 설정하는 것입니다.
  2. 매개변수 민감도이동 평균 길이와 격자 편차율의 설정은 전략 성능에 큰 영향을 미칩니다. 부적절한 파라미터는 격자가 너무 넓어질 수 있습니다. (거래 빈도가 낮다) 또는 너무 좁아질 수 있습니다. (거래 빈도가 낮다). (거래 빈도가 높다).
  3. 자금 관리 위험전략은 최대 15개의 동시위치 포지션을 허용하며, 거래당 자금 비율을 합리적으로 통제하지 않으면 자금의 과도한 집중으로 이어질 수 있다. 거래당 고정 자금 비율을 설정하거나 포지션 크기를 동적으로 조정해야 한다.
  4. 슬라이드 포인트 및 수수료 영향: 고 주파수 거래 전략은 슬라이드 포인트와 수수료에 더 민감합니다. 특히 격자가 좁을 때. 이러한 비용 요소를 재검토에서 고려하고 격자 폭을 적절히 조정하는 것이 좋습니다.
  5. 유동성 위험: 유동성이 낮은 시장이나 급격한 변동 기간 동안, 이상적인 가격에 따라 거래를 수행하는 것이 어려울 수 있으며, 전략의 성과에 영향을 미칩니다. 유동성이 풍부한 거래 품종을 선택하고 슬라이드 보호 설치를 고려해야합니다.

전략 최적화 방향

코드의 분석을 바탕으로, 이 전략은 다음과 같은 방향으로 최적화될 수 있습니다:

  1. 트렌드 필터 추가: 다른 기술 지표와 결합하여 (MACD, RSI 또는 방향 지표 DMI와 같은) 시장 추세를 판단하고, 명백한 추세 시장에서 격자 거래 전략을 중지하거나 조정하여 역동 거래로 인한 손실을 피하십시오.
  2. 동적 격자 너비: 시장의 변동성에 따라 (ATR 지표와 같은) 격자 편차율을 동적으로 조정하고, 변동성이 증가할 때 격자 간격을 확장하고, 변동성이 감소할 때 격자 간격을 축소하여 다른 시장 조건에 더 잘 적응한다.
  3. 손절매 메커니즘 소개: 각 격자 위치에 대한 중지 조건을 설정하고, 시장이 비정상적인 변동이 있을 때 자금을 안전하게 보호한다. ATR 기반의 동적 중지 또는 고정 비율 중지도 고려할 수 있다.
  4. 자금 관리 최적화: 동적 포지션 관리를 구현하여 계좌 자금, 시장의 변동성 및 기존 포지션 상황에 따라 거래당 자금 비율을 동적으로 조정하여 자금 사용 효율성과 위험 제어 능력을 향상시킵니다.
  5. 필터링 시간을 추가합니다.: 다른 시간대의 시장 특성을 분석하고, 적당한 시간대에 트레이딩을 활성화하고, 적당한 시간대에 트레이딩 주파수를 줄이거나 트레이딩을 중지하는 전략.
  6. 다중 시간 주기 확인트레이드 확인이 더 길고 더 짧은 시간 사이클과 결합되어 가짜 신호와 유효하지 않은 트레이드를 줄여줍니다.
  7. 코드 효율성을 최적화: 현재 코드의 그리드 라인 시각화 부분은 반복된 플롯 문장을 사용하며, 루프 구조를 최적화하여 코드의 간결성과 유지성을 향상시킬 수 있습니다.

요약하다

자기 적응평등그리드 수량 거래 전략은 평평등 회귀 원리에 기반한 격자 거래 시스템으로, 이동 평균 주위에 격자를 설정하여 가격 변동으로 인한 거래 기회를 잡습니다. 전략은 간단하고, 파라미터가 적으며, 조정하기 쉽고, 특히 불안한 시장에서 적용하기에 적합합니다. 전략의 주요 장점은 자기 적응성과 위험 분산 특성으로, 다양한 가격 수준에 자동으로 적응하고 여러 격자 위치로 위험을 분산 할 수 있습니다.

그러나, 이 전략은 강한 트렌드 시장에서 위험에 직면할 수 있으며, 트렌드 필터링과 스톱 로드 메커니즘을 추가하여 최적화 할 필요가 있습니다. 또한, 격자 폭을 동적으로 조정하고, 자금 관리를 개선하고, 다중 시간 주기 확인을 추가하는 등의 최적화 방향도 탐색 할 가치가 있습니다. 이러한 최적화를 통해, 전략은 다양한 시장 환경에서 더 안정적이고 우수한 성능을 얻을 수 있습니다.

이 전략은 경험이 풍부한 양자 거래자에게 좋은 기본 프레임워크를 제공하며, 개인의 거래 스타일과 위험 선호도에 따라 추가적으로 사용자 정의 및 최적화 할 수 있으며, 시장의 변동성을 포착하는 데 있어서 격자 거래의 장점을 발휘합니다.

전략 소스 코드
/*backtest
start: 2025-04-01 00:00:00
end: 2025-06-22 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy('Grid Trading Strategy', overlay=true, pyramiding=15)

// 输入参数设置
ma_length = input.int(300, '移动平均线长度', group='移动平均线条件', step=10)
std = input.float(0.03, title='网格上下偏差率', group='网格条件', step=0.01)
grid = input.int(15, maxval=15, title='网格线数量', group='网格条件')

// 计算移动平均线及网格边界
ma = ta.sma(close, ma_length)
upper_bound = ma * (1 + std)
lower_bound = ma * (1 - std)
grid_width = (upper_bound - lower_bound) / (grid - 1)

// 创建网格价格数组
grid_array = array.new_float(0)
for i = 0 to grid - 1 by 1
    array.push(grid_array, lower_bound + grid_width * i)

// 创建订单状态布尔数组(只初始化一次)
var order_array = array.new_bool(grid, false)

// 执行交易逻辑
for i = 0 to grid - 1 by 1
    // 买入逻辑:价格低于网格线且该位置未持仓
    if close < array.get(grid_array, i) and not array.get(order_array, i)
        buy_id = i
        array.set(order_array, buy_id, true)
        strategy.entry(id=str.tostring(buy_id), direction=strategy.long, comment='#Long ' + str.tostring(buy_id))
    
    // 卖出逻辑:价格高于网格线且下一个网格位置持仓
    if close > array.get(grid_array, i) and i != 0
        if array.get(order_array, i - 1)
            sell_id = i - 1
            array.set(order_array, sell_id, false)
            strategy.close(id=str.tostring(sell_id), comment='#Close ' + str.tostring(sell_id))

// 可视化网格线
plot(grid > 0 ? array.get(grid_array, 0) : na, color=color.yellow, transp=10)
plot(grid > 1 ? array.get(grid_array, 1) : na, color=color.yellow, transp=10)
plot(grid > 2 ? array.get(grid_array, 2) : na, color=color.yellow, transp=10)
plot(grid > 3 ? array.get(grid_array, 3) : na, color=color.yellow, transp=10)
plot(grid > 4 ? array.get(grid_array, 4) : na, color=color.yellow, transp=10)
plot(grid > 5 ? array.get(grid_array, 5) : na, color=color.yellow, transp=10)
plot(grid > 6 ? array.get(grid_array, 6) : na, color=color.yellow, transp=10)
plot(grid > 7 ? array.get(grid_array, 7) : na, color=color.yellow, transp=10)
plot(grid > 8 ? array.get(grid_array, 8) : na, color=color.yellow, transp=10)
plot(grid > 9 ? array.get(grid_array, 9) : na, color=color.yellow, transp=10)
plot(grid > 10 ? array.get(grid_array, 10) : na, color=color.yellow, transp=10)
plot(grid > 11 ? array.get(grid_array, 11) : na, color=color.yellow, transp=10)
plot(grid > 12 ? array.get(grid_array, 12) : na, color=color.yellow, transp=10)
plot(grid > 13 ? array.get(grid_array, 13) : na, color=color.yellow, transp=10)
plot(grid > 14 ? array.get(grid_array, 14) : na, color=color.yellow, transp=10)