신경망 차이 가격 변동 최적화 양적 거래 전략

ATR ANN TANH OHLC4 volatility TIMEFRAME NEURAL NETWORK MACHINE LEARNING
생성 날짜: 2025-06-23 11:39:44 마지막으로 수정됨: 2025-06-23 11:39:44
복사: 5 클릭수: 306
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

신경망 차이 가격 변동 최적화 양적 거래 전략 신경망 차이 가격 변동 최적화 양적 거래 전략

개요

신경망 차질 가격 변동 최적화 정량 거래 전략은 인공 신경망 ((ANN) 을 기반으로 한 고주파 거래 시스템으로, 1초 수준의 시간 프레임 최적화를 위해 고안되었다. 이 전략은 신경망을 사용하여 단기 가격 변동 차이를 분석하고, 전향 전파 알고리즘을 통해 가격 방향을 예측하고, 변동율 필터링과 세션 시간 제어와 결합하여 거래 결정을 최적화한다. 전략의 핵심은 미세한 가격 변동 패턴을 포착하여 고주파 환경에서 고분자 인수 3.754의 안정적인 거래 성능을 달성하는 것이다.

전략 원칙

이 전략은 3층의 신경망 구조를 사용하여, 가격 차이의 데이터를 포워드 퍼포먼스 알고리즘으로 처리한다:

  1. 입력층 (L0): 수신 현재 OHLC4 ((열고 낮은 수확 평균값) 과 참조 시간 프레임 ((지연 15초) 역사 OHLC4의 퍼센트 차이 단일 입력 신경 세포 .

  2. 첫 번째 숨겨진 층 (L1): 5개의 신경 세포를 포함하고, 쌍곡 직사각형 ((tanh) 을 활성화 함수로 사용하여, 입력 데이터에 비선형 변환을 한다. 각 신경 세포는 가격 차이를 포착하기 위한 특정 패턴을 위해 미리 훈련된 무게를 가지고 있다.

  3. 두 번째 숨겨진 층 (L2): 33개의 뉴런을 포함하고, 또한 tanh 활성화 함수를 사용하여, 더 복잡한 무게 매트릭스를 통해 1호 숨겨진 층의 출력을 더 처리한다.

  4. 출력층 (L3): 단일 신경 세포는 최종 예측 신호를 출력하고, 그 값은 신호 방향을 수정하기 위해 역전된다.

거래 논리는 신경망 출력값 ((L3_0) 에 대해 다음과 같이 전개된다:

  • L3_0이 입구 임계값 (설정값 0.003) 보다 크면 다중 신호를 트리거
  • L3_0이 마이너스 입구 임계 ((-0.003) 보다 작을 때 공백 신호를 트리거
  • L3_0이 탈퇴한 임계값 (설정값 0.001) 보다 작을 때, 평점 포지션이 다다리
  • L3_0이 마이너스 퇴출 임계 ((-0.001) 보다 크면 매장 공백

이 전략은 세 가지 필터링 메커니즘을 구현합니다.

  • 냉각기 필터: 거래가 실행된 후, 시스템이 지정된 냉각 기간을 기다려야 합니다 (기본 60초)
  • 변동율 필터ATR (Average True Range) 지표를 통해, 시장의 변동성이 최소 경계를 초과했을 때만 거래합니다.
  • 거래 시간 필터: 선택적으로 거래가 특정 시장 시간에만 제한될 수 있습니다.

전략적 이점

  1. 높은 정확도 예측 능력: 신경망의 다층 구조는 가격 움직임의 복잡한 비선형 관계를 포착할 수 있습니다. 이것은 전통적인 기술 지표가 수행하기 어려운 일입니다. 특히 고주파 환경에서 이 구조는 단기 가격 패턴을 식별하고 더 정확한 입출력 신호를 제공합니다.

  2. 훌륭한 리스크/이익률이 전략은 3.754의 수익 인자를 달성했습니다. 이는 전체 수익 거래가 전체 손실 거래의 3.754배라는 것을 의미합니다. 이는 양적 전략에서 매우 우수한 성과입니다.

  3. 유연한 변수 최적화 공간이 전략은 입/출장 마이너스, 냉각 기간, 참조 시간 프레임, 최소 변동률 요구 사항과 같은 여러 가지 조정 가능한 매개 변수를 제공하여 거래자가 다른 시장 환경과 거래 유형에 따라 최적화 할 수 있습니다.

  4. 다중 필터링 장치이 전략은 냉각 기간, 변동성 및 거래 시간 세 가지 필터를 통합하여 불필요한 거래와 가짜 신호를 효과적으로 줄이고 거래 품질을 향상시킵니다.

  5. 고주파 거래 환경에 적응: 1초 수준의 시간 프레임에 최적화되어 있으며, 고주파 거래의 특성을 최대한 활용하여 단기 가격 변동으로 인한 수익 기회를 잡을 수 있습니다.

  6. 낮은 지연 구현: 전략 코드 구조가 명확하고 효율적이며, 신경 네트워크 부분은 사전 훈련 중량을 사용하여 직접 계산하고, 실시간 훈련이 필요하지 않아, 고주파 환경에서의 낮은 지연 실행을 보장한다.

전략적 위험

  1. 과도한 적합성의 위험: 신경망 모델에는 많은 사전 설정된 가중 변수가 포함되어 있으며, 역사 데이터에 대한 과도한 적합성의 위험이 있습니다. 이것은 전략이 실물 거래에서, 특히 시장 조건이 눈에 띄게 변할 때, 회수되지 않는 결과를 초래할 수 있습니다. 대응 방법은 다음과 같습니다. 주기적으로 신경망을 재교육하고, 더 긴 시간 주기 데이터를 사용하여 검증하고, 건전한 위험 관리 조치를 시행합니다.

  2. 매개변수 민감도전략 성능은 입/출장 마이너스, 냉각 기간의 길이 등과 같은 여러 파라미터 설정에 크게 의존한다. 파라미터의 미세한 변화는 전략 성능의 큰 변동으로 이어질 수 있다. 파라미터 스캔과 스텝 테스트를 통해 안정적인 파라미터 조합을 찾는 것이 권장되며, 과도한 최적화를 피한다.

  3. 고주파 거래의 위험1초 수준의 시간 프레임에서 거래 비용 (예: 시차 및 슬라이드 포인트) 은 전략의 수익성에 상당한 영향을 미칠 수 있습니다. 실전 거래 전에 이러한 비용을 충분히 고려하고, 회전에서 실제 거래 비용 조건을 모의해야합니다.

  4. 기술 실현의 도전: 고주파 전략은 거래 시스템이 매우 낮은 지연과 높은 신뢰성을 갖도록 요구한다. 모든 네트워크 지연, 데이터 지연 또는 실행 지연은 전략의 실패로 이어질 수 있다. 전문 수준의 거래 인프라와 낮은 지연 데이터 소스를 사용하는 것을 보장한다.

  5. 시장 변동 위험극한 시장 조건에서 (예: 급격한 뉴스 또는 유동성 고갈) 신경망 모델은 가격 움직임을 정확하게 예측하지 못할 수 있으며, 이로 인해 큰 손실이 발생할 수 있습니다.

전략 최적화 방향

  1. 신경망 구조를 최적화:

    • 거래량, 변동률 지표 및 가격 동력 지표와 같은 더 많은 입력 특성을 도입하여 모델 예측 능력을 강화하는 것을 고려하십시오.
    • 다양한 숨겨진 층 구조와 신경 세포 수를 시도하여 복잡성과 일반화 능력의 최적의 균형을 찾습니다.
    • 다른 활성화 함수 (ReLU 또는 Leaky ReLU와 같은) 의 효과를 탐구합니다. 이러한 함수는 특정 신경 네트워크 응용 프로그램에서 tanh보다 우수합니다.
  2. 동적 변수 조정 메커니즘:

    • 시장 상황에 따라 적응하는 입출력 마이너스를 실현하는 것, 예를 들어 높은 변동성 환경에서 마이너스를 높이고 낮은 변동성 환경에서 마이너스를 낮추는 것
    • 전략이 시장의 다양한 단계에서 최적의 거래 횟수를 유지할 수 있도록 유동성을 인식하는 냉각 기간 조정 알고리즘을 개발
  3. 통합 예측 프레임워크:

    • 여러 시간 프레임에 결합된 신경망 모델이 통합 예측 신호를 형성합니다.
    • 기계 학습 메타 모델을 도입하여 다양한 예측 모델의 무게를 동적으로 조정합니다.
    • 이 방법은 단일 모델의 한계를 줄이고 예측의 안정성을 향상시킵니다.
  4. 위험 관리 강화:

    • 모델 신뢰도와 시장 조건에 따라 거래 규모를 조정하는 동적 포지션 관리 시스템을 개발
    • 기계학습 기반의 스톱로스 전략을 도입하여 거래당 리스크/이익 비율을 최적화합니다.
    • 일간 시간 최적화를 구현하고, 전략이 하루 중 가장 잘 작동하는 시간을 식별합니다.
  5. 실시간 학습과 적응:

    • 온라인 학습 메커니즘을 설계하여 뉴런 네트워크가 새로운 데이터로부터 끊임없이 학습하고 시장 변화에 적응할 수 있도록 지원합니다.
    • 수행 모니터링 기반의 자동 재교육 트리거를 구현하여 전략 성능이 떨어지면 모델을 적극적으로 업데이트합니다.
    • 이 방법은 전략의 수명과 안정성을 크게 향상시킬 수 있습니다.

요약하다

신경망 차질 가격 변동을 최적화하는 양적 거래 전략은 현대적인 양적 거래의 최첨단 관행을 대표하며, 인공 신경망 기술을 고주파 거래 영역에 성공적으로 적용했다. 신중하게 설계된 다층 신경망 구조를 통해 이 전략은 단기 가격 변동의 미세한 패턴을 포착할 수 있으며, 다중 필터링 메커니즘을 통해 거래 품질을 향상시킬 수 있다.

3.754의 수익 요소는 테스트 환경에서 이 전략이 우수한 성능을 보여 주지만 실제 적용 시 과다 적합성, 파라미터 민감성 및 고주파 거래에 특화된 위험을 신중하게 고려해야합니다. 신경망 구조를 지속적으로 최적화하고, 동적 파라미터 조정 및 위험 관리를 강화함으로써 이 전략은 경쟁이 치열한 양적 거래 분야에서 장기간 경쟁력을 유지할 잠재력을 가지고 있습니다.

전략의 핵심 성공 요인은 복잡한 신경 네트워크 기술을 실용적인 거래 논리와 결합하여 기계 학습의 예측 능력을 활용하면서 실제 거래의 가능성을 고려하는 것입니다. 경험 많은 양적 거래자에게는 다양한 시장과 개인 위험 선호도에 따라 추가적으로 사용자 정의 및 최적화를 할 수있는 확장 가능한 프레임 워크를 제공합니다.

전략 소스 코드
/*backtest
start: 2024-06-23 00:00:00
end: 2025-06-21 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ANN Strategy v2 (Optimized for 1s)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === INPUTS ===
entryThreshold = input.float(0.003, title="Entry Threshold")
exitThreshold  = input.float(0.001, title="Exit Threshold")
cooldownBars   = input.int(60, title="Cooldown (bars)")  // 60 seconds cooldown
timeframe      = input.timeframe("1", title="Reference Timeframe")  // 1-minute diff reference
minVolatility  = input.float(0.02, title="Min ATR (Volatility Filter)")
useSession     = input.bool(true, title="Use Session Filter")

// === UTILITY FUNCTIONS ===
getDiff() =>
    prev = request.security(syminfo.tickerid, timeframe, ohlc4[1])
    now = ohlc4
    (now - prev) / prev

linear(v) => v
tanh(v) => (math.exp(v) - math.exp(-v)) / (math.exp(v) + math.exp(-v))

// === ANN FORWARD PROPAGATION ===
l0_0 = linear(getDiff())

l1 = array.new_float()
array.push(l1, tanh(l0_0 * 0.8446488687))
array.push(l1, tanh(l0_0 * -0.5674069006))
array.push(l1, tanh(l0_0 * 0.8676766445))
array.push(l1, tanh(l0_0 * 0.5200611473))
array.push(l1, tanh(l0_0 * -0.2215499554))

// === Layer 2 weights ===
w2 = array.from(    0.3341657935, -2.0060003664, 0.8606354375, 0.9184846912, -0.8531172267,    -0.0394076437, -0.4720374911, 0.2900968524, 1.0653326022, 0.3000188806,    -0.559307785, -0.9353655177, 1.2133832962, 0.1952686024, 0.8552068166,    -0.4293220754, 0.8484259409, -0.7154087313, 0.1102971055, 0.2279392724,    0.9111779155, 0.2801691115, 0.0039982713, -0.5648257117, 0.3281705155,    -0.2963954503, 0.4046532178, 0.2460580977, 0.6608675819, -0.8732022547,    0.8810811932, 0.6903706878, -0.5953059103, -0.3084040686, -0.4038498853,    -0.5687101164, 0.2736758588, -0.2217360382, 0.8742950972, 0.2997583987,    0.0708459913, 0.8221730616, -0.7213265567, -0.3810462836, 0.0503867753,    0.4880140595, 0.9466627196, 1.0163097961, -0.9500386514, -0.6341709382,    1.3402207103, 0.0013395288, 3.4813009133, -0.8636814677, 41.3171047132,    1.2388217292, -0.6520886912, 0.3508321737, 0.6640560714, 1.5936220597,    -0.1800525171, -0.2620989752, 0.056675277, -0.5045395315, 0.2732553554,    -0.7776331454, 0.1895231137, 0.5384918862, 0.093711904, -0.3725627758,    -0.3181583022, 0.2467979854, 0.4341718676, -0.7277619935, 0.1799381758,    -0.5558227731, 0.3666152536, 0.1538243225, -0.8915928174, -0.7659355684,    0.6111516061, -0.5459495224, -0.5724238425, -0.8553500765, -0.8696190472,    0.6843667454, 0.408652181, -0.8830470112, -0.8602324935, 0.1135462621,    -0.1569048216, -1.4643247888, 0.5557152813, 1.0482791924, 1.4523116833,    0.5207514017, -0.2734444192, -0.3328660936, -0.7941515963, -0.3536051491,    -0.4097807954, 0.3198619826, 0.461681627, -0.1135575498, 0.7103339851,    -0.8725014237, -1.0312091401, 0.2267643037, -0.6814258121, 0.7524828703,    -0.3986855003, 0.4962556631, -0.7330224516, 0.7355772164, 0.3180141739,    -1.083080442, 1.8752543187, 0.3623326265, -0.348145191, 0.1977935038,    -0.0291290625, 0.0612906199, 0.1219696687, -1.0273685429, 0.0872219768,    0.931791094, -0.313753684, -0.3028724837, 0.7387076712, 0.3806140391,    0.2630619402, -1.9827996702, -0.7741413496, 0.1262957444, 0.2248777886,    -0.2666322362, -1.124654664, 0.7288282621, -0.1384289204, 0.2395966188,    0.6611845175, 0.0466048937, -0.1980999993, 0.8152350927, 0.0032723211,    -0.3150344751, 0.1391754608, 0.5462816249, -0.7952302364, -0.7520712378,    -0.0576916066, 0.3678415302, 0.6802537378, 1.1437036331, -0.8637405666,    0.7016273068, 0.3978601709, 0.3157049654, -0.2528455662, -0.8614146703,    1.1741126834, -1.4046408959, 1.2914477803, 0.9904052964, -0.6980155826)


l2 = array.new_float()
for i = 0 to 32
    sum = 0.0
    for j = 0 to 4
        weight = array.get(w2, i * 5 + j)
        sum += weight * array.get(l1, j)
    array.push(l2, tanh(sum))

// === Output layer weights ===
weights_out = array.from(    -0.1366382003, 0.8161960822, -0.9458773183, 0.4692969576, 0.0126710629,    -0.0403001012, -0.0116244898, -0.4874816289, -0.6392241448, -0.410338398,    -0.1181027081, 0.1075562037, -0.5948728252, 0.5593677345, -0.3642935247,    -0.2867603217, 0.142250271, -0.0535698019, -0.034007685, -0.3594532426,    0.2551095195, 0.4214344983, 0.8941621336, 0.6283377368, -0.7138020667,    -0.1426738249, 0.172671223, 0.0714824385, -0.3268182144, -0.0078989755,    -0.2032828145, -0.0260631534, 0.4918037012)


sum_out = 0.0
for i = 0 to array.size(l2) - 1
    sum_out += array.get(weights_out, i) * array.get(l2, i)

// === Final ANN output (inverted for signal correction) ===
l3_0 = -tanh(sum_out)

// === TRADE FILTERS ===
volatility = ta.atr(14)
isVolOkay = volatility > minVolatility

isSession = (hour >= 9 and hour < 16)  // Adjust to your market hours
sessionOkay = useSession ? isSession : true

// === SIGNAL LOGIC ===
var string activeTrade = "none"
var int lastTradeBar = na
canTrade = (na(lastTradeBar) or (bar_index - lastTradeBar > cooldownBars)) and isVolOkay and sessionOkay

enterLong  = l3_0 > entryThreshold  and activeTrade != "long"  and canTrade
exitLong   = l3_0 < exitThreshold   and activeTrade == "long"
enterShort = l3_0 < -entryThreshold and activeTrade != "short" and canTrade
exitShort  = l3_0 > -exitThreshold  and activeTrade == "short"

// === STRATEGY EXECUTION ===
if barstate.isrealtime
    if enterLong
        strategy.entry("Long", strategy.short)
        activeTrade := "long"
        lastTradeBar := bar_index

    if exitLong
        strategy.close("Long")
        activeTrade := "none"

    if enterShort
        strategy.entry("Short", strategy.long)
        activeTrade := "short"
        lastTradeBar := bar_index

    if exitShort
        strategy.close("Short")
        activeTrade := "none"

// === PLOTTING ===
bgcolor(activeTrade == "long" ? color.new(color.green, 85) : activeTrade == "short" ? color.new(color.red, 85) : na)
plot(l3_0, title="ANN Output (Inverted)", color=color.aqua, linewidth=2)