
신경망 차질 가격 변동 최적화 정량 거래 전략은 인공 신경망 ((ANN) 을 기반으로 한 고주파 거래 시스템으로, 1초 수준의 시간 프레임 최적화를 위해 고안되었다. 이 전략은 신경망을 사용하여 단기 가격 변동 차이를 분석하고, 전향 전파 알고리즘을 통해 가격 방향을 예측하고, 변동율 필터링과 세션 시간 제어와 결합하여 거래 결정을 최적화한다. 전략의 핵심은 미세한 가격 변동 패턴을 포착하여 고주파 환경에서 고분자 인수 3.754의 안정적인 거래 성능을 달성하는 것이다.
이 전략은 3층의 신경망 구조를 사용하여, 가격 차이의 데이터를 포워드 퍼포먼스 알고리즘으로 처리한다:
입력층 (L0): 수신 현재 OHLC4 ((열고 낮은 수확 평균값) 과 참조 시간 프레임 ((지연 15초) 역사 OHLC4의 퍼센트 차이 단일 입력 신경 세포 .
첫 번째 숨겨진 층 (L1): 5개의 신경 세포를 포함하고, 쌍곡 직사각형 ((tanh) 을 활성화 함수로 사용하여, 입력 데이터에 비선형 변환을 한다. 각 신경 세포는 가격 차이를 포착하기 위한 특정 패턴을 위해 미리 훈련된 무게를 가지고 있다.
두 번째 숨겨진 층 (L2): 33개의 뉴런을 포함하고, 또한 tanh 활성화 함수를 사용하여, 더 복잡한 무게 매트릭스를 통해 1호 숨겨진 층의 출력을 더 처리한다.
출력층 (L3): 단일 신경 세포는 최종 예측 신호를 출력하고, 그 값은 신호 방향을 수정하기 위해 역전된다.
거래 논리는 신경망 출력값 ((L3_0) 에 대해 다음과 같이 전개된다:
이 전략은 세 가지 필터링 메커니즘을 구현합니다.
높은 정확도 예측 능력: 신경망의 다층 구조는 가격 움직임의 복잡한 비선형 관계를 포착할 수 있습니다. 이것은 전통적인 기술 지표가 수행하기 어려운 일입니다. 특히 고주파 환경에서 이 구조는 단기 가격 패턴을 식별하고 더 정확한 입출력 신호를 제공합니다.
훌륭한 리스크/이익률이 전략은 3.754의 수익 인자를 달성했습니다. 이는 전체 수익 거래가 전체 손실 거래의 3.754배라는 것을 의미합니다. 이는 양적 전략에서 매우 우수한 성과입니다.
유연한 변수 최적화 공간이 전략은 입/출장 마이너스, 냉각 기간, 참조 시간 프레임, 최소 변동률 요구 사항과 같은 여러 가지 조정 가능한 매개 변수를 제공하여 거래자가 다른 시장 환경과 거래 유형에 따라 최적화 할 수 있습니다.
다중 필터링 장치이 전략은 냉각 기간, 변동성 및 거래 시간 세 가지 필터를 통합하여 불필요한 거래와 가짜 신호를 효과적으로 줄이고 거래 품질을 향상시킵니다.
고주파 거래 환경에 적응: 1초 수준의 시간 프레임에 최적화되어 있으며, 고주파 거래의 특성을 최대한 활용하여 단기 가격 변동으로 인한 수익 기회를 잡을 수 있습니다.
낮은 지연 구현: 전략 코드 구조가 명확하고 효율적이며, 신경 네트워크 부분은 사전 훈련 중량을 사용하여 직접 계산하고, 실시간 훈련이 필요하지 않아, 고주파 환경에서의 낮은 지연 실행을 보장한다.
과도한 적합성의 위험: 신경망 모델에는 많은 사전 설정된 가중 변수가 포함되어 있으며, 역사 데이터에 대한 과도한 적합성의 위험이 있습니다. 이것은 전략이 실물 거래에서, 특히 시장 조건이 눈에 띄게 변할 때, 회수되지 않는 결과를 초래할 수 있습니다. 대응 방법은 다음과 같습니다. 주기적으로 신경망을 재교육하고, 더 긴 시간 주기 데이터를 사용하여 검증하고, 건전한 위험 관리 조치를 시행합니다.
매개변수 민감도전략 성능은 입/출장 마이너스, 냉각 기간의 길이 등과 같은 여러 파라미터 설정에 크게 의존한다. 파라미터의 미세한 변화는 전략 성능의 큰 변동으로 이어질 수 있다. 파라미터 스캔과 스텝 테스트를 통해 안정적인 파라미터 조합을 찾는 것이 권장되며, 과도한 최적화를 피한다.
고주파 거래의 위험1초 수준의 시간 프레임에서 거래 비용 (예: 시차 및 슬라이드 포인트) 은 전략의 수익성에 상당한 영향을 미칠 수 있습니다. 실전 거래 전에 이러한 비용을 충분히 고려하고, 회전에서 실제 거래 비용 조건을 모의해야합니다.
기술 실현의 도전: 고주파 전략은 거래 시스템이 매우 낮은 지연과 높은 신뢰성을 갖도록 요구한다. 모든 네트워크 지연, 데이터 지연 또는 실행 지연은 전략의 실패로 이어질 수 있다. 전문 수준의 거래 인프라와 낮은 지연 데이터 소스를 사용하는 것을 보장한다.
시장 변동 위험극한 시장 조건에서 (예: 급격한 뉴스 또는 유동성 고갈) 신경망 모델은 가격 움직임을 정확하게 예측하지 못할 수 있으며, 이로 인해 큰 손실이 발생할 수 있습니다.
신경망 구조를 최적화:
동적 변수 조정 메커니즘:
통합 예측 프레임워크:
위험 관리 강화:
실시간 학습과 적응:
신경망 차질 가격 변동을 최적화하는 양적 거래 전략은 현대적인 양적 거래의 최첨단 관행을 대표하며, 인공 신경망 기술을 고주파 거래 영역에 성공적으로 적용했다. 신중하게 설계된 다층 신경망 구조를 통해 이 전략은 단기 가격 변동의 미세한 패턴을 포착할 수 있으며, 다중 필터링 메커니즘을 통해 거래 품질을 향상시킬 수 있다.
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)