WEJUMP INVESTMENT LABS

Systematic Alpha & Quantitative Insights

유튜브 생방송 중 채팅방 입장

[R&D Note #2] 변동성의 '크기'가 아닌 '질(Quality)'을 묻다: CBVR 2.3 EAVS 고도화 (with AI Desk)

[R&D Note #2] 변동성의 '크기'가 아닌 '질(Quality)'을 묻다: CBVR 2.3 EAVS 고도화 (with AI Desk)

Date: 2026.01.01 Author: Jaewon (Chief Strategist) x AI Desk Series: CBVR 2.3 Development Log (Part 2) Tags: #시스템트레이딩 #퀀트 #자산배분 #WeJumpInvestmentLabs #AI협업 #CBVR전략 #EAVS #후속연구

Prologue: 구조(Structure) 다음은 효율(Efficiency)이다

"구조가 완성되었다고 끝이 아닙니다. 이제는 엔진을 튜닝할 차례입니다."

지난 리포트(Part 1)에서 우리는 선물 복제와 3-Bucket 구조를 통해 자본 효율성을 극대화하는 CBVR 2.3 프레임워크를 공개했습니다. 뼈대(Structure)는 튼튼해졌지만, 우리는 여전히 해결하지 못한 하나의 미세한 딜레마를 안고 있었습니다.

바로 '변동성(Volatility)에 대한 관점'입니다.

기존의 퀀트 공식(Target Volatility)대로라면 시장이 요동칠 때(VIX 상승) 기계적으로 비중을 줄여야 합니다. 하지만 Chief Strategist의 통찰은 달랐습니다. "강력한 추세가 터질 때는 필연적으로 변동성이 동반된다. 그때 몸을 사리는 건 수익 기회(Alpha)를 스스로 걷어차는 것이다."

본 문서는 지난 설계도에 이어, 시스템의 효율을 극한으로 끌어올리기 위해 AI Desk와 함께 시장의 '질(Quality)'을 수학적으로 검증하고 EAVS 알고리즘을 탑재한 후속 연구 기록입니다.

이전 문서 (참고용):
https://wejump3.tistory.com/entry/RD-Note-%EB%B3%80%EB%8F%99%EC%84%B1%EC%9D%98-%ED%81%AC%EA%B8%B0%EA%B0%80-%EC%95%84%EB%8B%8C-%EC%A7%88Quality%EC%9D%84-%EB%AC%BB%EB%8B%A4-CBVR-23-%EA%B3%A0%EB%8F%84%ED%99%94-WeJump-Labs-with-AI-Desk

 

[R&D Note] 변동성의 크기가 아닌 '질(Quality)'을 묻다: CBVR 2.3 고도화 (WeJump Labs with AI Desk)

CBVR 2.3 Upgrade Proposal: Efficiency-Adjusted Volatility Scaling (EAVS)Prologue"변동성이 높을 때, 시스템은 더 강해야 한다."본 문서는 WeJump Investment Labs의 전략 고도화 과정을 가감 없이 기록한 R&D 노트입니다. Chi

wejump3.tistory.com

 

1. The CBVR Protocol: 우리는 '과최적화'와 싸운다

EAVS 검증 결과를 논하기 전에, 우리가 전략을 개발하는 고유한 공정(Process)을 먼저 짚고 넘어가야 합니다. 이것이 CBVR이 기존의 '구시대적 시스템 트레이딩'과 구별되는 지점이기 때문입니다.

[Old School vs CBVR Way]

  • 구시대적 방식 (Curve Fitting): 매수/매도 타이밍을 기가 막히게 맞추려 노력합니다. 과거 데이터에 파라미터를 끼워 맞추고, 수익률 곡선을 예쁘게 다듬습니다. 하지만 시장 성격이 조금만 바뀌면 전략은 부패(Decay)하고 무너집니다.
  • CBVR의 방식 (Layered Architecture): 우리는 수익률을 쫓지 않습니다. 대신 변하지 않는 시장의 원리 위에 논리의 층(Layer)을 쌓아 올립니다.

[CBVR 진화의 4단계 레이어]

  1. Layer 1. 국면(Regime) 정의: 시장은 평균으로 수렴(채널 안)하거나 발산(채널 밖)할 뿐입니다. 이 불변의 물리 법칙을 정의합니다.
  2. Layer 2. 추세 판단 (Vector Logic): 국면이 전환될 때의 '힘의 방향'을 벡터로 측정하여 확률을 높입니다.
  3. Layer 3. 구조적 알파 (Structural Alpha): CBVR 2.3 프레임워크(선물 복제+버킷)를 통해 매매 기술이 아닌 '구조'로 수익을 창출합니다.
  4. Layer 4. 빈틈 점검 (Gap Check): (금번 작업) 완성된 구조에 혹시 모를 누수(노이즈)가 있는지 확인하고 필터(EAVS)를 대봅니다.

이번 EAVS 연구는 전략을 뜯어고치는 것이 아니라, "Layer 4 단계에서 수행한 구조적 강건성 테스트"였습니다.

2. Problem: 멍청한 방어 (Dumb Defense)

점검 과정에서 우리가 발견한 기존 모델(Target Volatility)의 한계는 명확했습니다. 단순 변동성 조절 모델은 시장의 성격을 구분하지 못합니다.

  • 상황 A (강한 추세장): 변동성이 크지만, 방향이 확실함. → 수익 구간 (Good Vol)
  • 상황 B (톱니바퀴 횡보장): 변동성은 큰데, 제자리걸음. → 손실 구간 (Bad Vol / Noise)

기존 모델은 A와 B 상황 모두에서 "위험하니 도망쳐라"라고 지시합니다. 결과적으로 B(손실)는 피하지만, A(대박 수익)도 함께 포기하게 됩니다. 우리는 이것을 '수익 드래그(Revenue Drag)'라고 정의했습니다.

3. Solution: 효율성 기반 스케일링 (EAVS)

우리는 변동성의 '크기'가 아니라 '질(Quality)'을 묻기로 했습니다. 이를 위해 Kaufman's Efficiency Ratio (ER) 개념을 도입했습니다.

ER (효율성 비율) = 순수 가격 변화량(Net Change) / 전체 이동 거리(Total Path)

  • 가격이 직선으로 움직이면 ER은 1에 가깝습니다. (고효율 = 추세)
  • 가격이 지그재그로 움직이면 ER은 0에 가깝습니다. (저효율 = 노이즈)

우리가 설계한 EAVS (Efficiency-Adjusted Volatility Scaling) 로직의 핵심은 이것입니다. "시장이 시끄럽더라도(변동성 High), 효율적이라면(ER High) 도망가지 마라."

4. Verification I: 시각적 검증 (Visual Check)

이 가설을 증명하기 위해, 가장 성격이 다른 두 시장(한국/미국)의 2022년 하락/횡보장 데이터를 대상으로 시뮬레이션을 수행했습니다.

Case 1. 한국 시장 (EWY) - "적극적 소음 제거 (Active Noise Reduction)"

CBVR 2.3 EAVS 한국 시장 백테스팅 시뮬레이션 결과 그래프 - 횡보장 노이즈 필터링 및 MDD 방어 (EWY 2022)
CBVR 2.3 EAVS 한국 시장 백테스팅 시뮬레이션 결과 그래프 - 횡보장 노이즈 필터링 및 MDD 방어 (EWY 2022)

그림 1: 2021-2022 한국 시장(EWY) 시뮬레이션. 잦은 등락에도 불구하고 제자리걸음인 구간을 시스템이 '노이즈'로 인식하여 대응하고 있다.

한국 시장은 전형적인 '톱니바퀴형 횡보(Choppy Market)'였습니다. 그래프 하단의 붉은색 영역(Red Zone)이 보이시나요? 시스템은 이 구간을 '노이즈'로 판정하고 레버리지를 능동적으로 낮췄습니다. 결과적으로 휩소(Whipsaw)로 인한 불필요한 손실을 방어했습니다.

Case 2. 미국 시장 (SPY) - "현명한 방임 (Smart Passivity)"

CBVR 2.3 EAVS 미국 시장 백테스팅 시뮬레이션 결과 그래프 - 추세장 수익 보존 및 스마트 스케일링 (SPY 2022)
CBVR 2.3 EAVS 미국 시장 백테스팅 시뮬레이션 결과 그래프 - 추세장 수익 보존 및 스마트 스케일링 (SPY 2022)

그림 2: 2021-2022 미국 시장(SPY) 시뮬레이션. 추세적 하락 구간에서 시스템은 비중을 줄이지 않고 유지한다.

반면 미국 시장은 하락하더라도 비교적 '질서 정연한 추세'를 보였습니다. 시스템은 비중을 줄이지 않았습니다(Scalar 1.0 유지). "이것은 노이즈가 아니라 추세다"라고 판단했기 때문입니다. 덕분에 CBVR 전략 고유의 숏(Short) 포지션 수익을 온전히 챙길 수 있었습니다.

5. Verification II: 정량적 성과 분석 (Quantitative Analysis)

시각적 검증에 이어, Pine Script 백테스팅을 통해 구체적인 수치 변화를 확인했습니다. 시장의 고유 호흡(Cycle)을 반영하여 한국은 Period 25, 미국은 Period 37을 적용했습니다.

[백테스팅 성과 비교]

전략 구분 (Strategy) 메트릭 (Metric) 기존 (Original) EAVS 적용 (Applied) 증감 (Delta) 분석 (Analysis)
US Strategy CAGR 36.63% 37.91% +1.28%p Efficiency Gain.
추세 구간 수익을 온전하게 보존하면서, 미세한 노이즈만 제거하여 수익률 개선.
(Period: 37, Th: 0.01) MDD 30.66% 30.66% - Do No Harm. (기존 방어 로직 유지)
Korea Strategy CAGR 47.75% 48.19% +0.44%p Noise Reduction.
횡보장 휩소를 줄여 손실을 방어하고, 이를 통해 복리 효과 증대.
(Period: 25, Th: 0.01) MDD 16.59% 16.59% - Active Defense. (안정성 유지)

6. Insight: "미비한 효과"의 진짜 의미

위 데이터를 보면 의아할 수 있습니다. "고생해서 업그레이드했는데, 수익률이 고작 1% 남짓 올랐나?" 실제로 백테스팅 기간(미국 2006년~, 한국 2010년~)인 최대 20년 동안 EAVS가 개입한 횟수는 5회 미만이었습니다.

하지만 우리는 이 결과를 '실패'가 아닌 '전략적 완성'으로 해석합니다. 그 이유는 다음과 같습니다.

① Core 로직의 강력함 재확인 (Pre-existing Robustness)

EAVS 필터가 지난 20년간 거의 개입하지 않았다는 것은, 기존 CBVR Core 엔진이 이미 훌륭하게 작동하고 있다는 가장 강력한 증거입니다. Core에 내장된 '벡터(Vector) 기반 추세 판별 로직'이 일반적인 횡보나 노이즈는 이미 스스로 걸러내고(중립 전환) 있었기 때문에, 후단에 배치된 EAVS가 굳이 나설 필요가 없었던 것입니다.

② 에어백(Airbag) 역할 확립

우리는 Threshold(민감도)를 0.01에서 0.8까지 높여보는 스트레스 테스트를 수행했습니다. 결과는 명확했습니다. 민감도를 높일수록 전략의 수익성(Convexity)이 훼손되었습니다.

따라서 최적값 0.01은 "Core가 놓친 극단적 1%의 쓰레기 구간(Extreme Noise)만 처리하라"는 명령입니다. 평소에는 없는 듯 숨어 있다가, 치명적인 사고가 날 뻔한 순간에만 터지는 '에어백' 역할을 수행합니다. 미국장에서의 +1.28%p는 그 희귀한 개입이 성공했음을 보여줍니다.

Epilogue: 뺄셈의 미학, 그리고 강건함에 대하여

이번 R&D의 최종 성적표는 '지난 20년(미국 기준)간 5회 미만의 개입'이었습니다.

누군가는 "고작 이것을 위해 연구했나"라고 반문할지 모릅니다. 하지만 연구소 내부에서는 오히려 안도의 한숨을 내쉬었습니다. 이것이 역설적으로 CBVR 프레임워크의 강건함(Robustness)을 증명하는 성적표였기 때문입니다.

전략 개발자가 가장 빠지기 쉬운 유혹은 '과최적화(Over-fitting)'입니다. 과거의 수익률 곡선을 매끄럽게 만들기 위해 변수를 더하고 조건을 덕지덕지 붙이다 보면, 당장의 백테스팅 숫자는 화려해질지 몰라도 결국 미래의 시장에서는 작동하지 않는 '누더기 전략'이 되기 십상입니다.

우리는 이번 실험을 통해 "더 이상 더할 것이 없는 상태"가 아니라, "더 이상 뺄 것이 없는 상태"를 확인했습니다. 기계적인 EAVS 필터가 굳이 나서지 않아도, CBVR의 코어 엔진(국면 정의 및 벡터 로직)이 이미 시장의 파도를 유연하게 타고 있었던 것입니다.

화려한 수익률 갱신보다는, 어떤 파도에도 무너지지 않는 '구조적 단단함'을 추구합니다. 우리는 앞으로도 시장을 이기려 들기보다, 시장의 원리(Regime)를 있는 그대로 담아내는 데 집중하겠습니다.

※ 본 리포트의 모든 데이터와 시뮬레이션 코드는 WeJump Labs 내부 시스템에 의해 생성 및 검증되었습니다.

 

부록: Python 코드

import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt

# ==========================================
# [Module] CBVR EAVS Logic
# WeJump Investment Labs AI Desk
# ==========================================

class CBVR_EAVS_Engine:
    """
    CBVR 2.3 Upgrade: Efficiency-Adjusted Volatility Scaling (EAVS)
    시장의 효율성(Efficiency)을 측정하여 노이즈 구간(Whipsaw)에서 Exposure를 축소함.
    """
    def __init__(self, period=20, threshold=0.3):
        """
        :param period: ER 계산 주기 (CBVR Core 주기와 동기화 권장, 기본 20일)
        :param threshold: 노이즈 판단 임계값 (기본 0.3)
                          ER < 0.3 이면 'Noise Market' -> 비중 축소
                          ER >= 0.3 이면 'Trend/Efficient Market' -> 비중 유지 (Scalar=1.0)
        """
        self.period = period
        self.threshold = threshold

    def calculate_efficiency_ratio(self, prices):
        """
        Kaufman's Efficiency Ratio (ER) 계산
        ER = |Net Change| / Sum of Absolute Changes
        """
        # 1. Net Change (기간 내 순수 가격 변화량)
        change = prices.diff(self.period).abs()
        
        # 2. Volatility Sum (기간 내 가격 변화의 절대값 합 = 이동 거리)
        # diff(1).abs() -> 1일간의 변화량 절대값
        # rolling(period).sum() -> n일간의 총 이동 거리
        path = prices.diff(1).abs().rolling(window=self.period).sum()
        
        # 3. ER Calculation (0으로 나누기 방지)
        er = change / path
        er = er.replace([np.inf, -np.inf], 0).fillna(0)
        
        return er

    def get_scaling_factor(self, er_series):
        """
        ER 값을 기반으로 Scaling Factor 산출
        """
        # 로직: ER이 Threshold보다 낮으면 (ER / Threshold) 비율로 축소
        #       ER이 Threshold보다 높으면 1.0 (비중 유지)
        
        # 벡터 연산을 위해 numpy 활용
        scalar = np.where(er_series >= self.threshold, 1.0, er_series / self.threshold)
        
        return pd.Series(scalar, index=er_series.index)

    def run_diagnosis(self, price_series):
        """
        진단 실행 함수: 데이터가 들어오면 ER과 Scalar를 반환
        """
        er = self.calculate_efficiency_ratio(price_series)
        scalar = self.get_scaling_factor(er)
        
        return pd.DataFrame({
            'Close': price_series,
            'ER': er,
            'Scalar': scalar
        })

# ==========================================
# [Simulation] Case Study: Korea (Kospi 200 Proxy) vs US (S&P 500)
# ==========================================

def run_simulation(ticker, name, start_date='2021-01-01', end_date='2023-12-31'):
    print(f"Running Simulation for {name} ({ticker})...")
    
    # 1. Data Loading
    df = yf.download(ticker, start=start_date, end=end_date, progress=False)
    if df.empty:
        print("Data download failed.")
        return
        
    # 'Close' 컬럼 처리 (MultiIndex인 경우 대비)
    if isinstance(df.columns, pd.MultiIndex):
        price = df['Close'][ticker]
    else:
        price = df['Close']

    # 2. Apply EAVS Logic
    eavs = CBVR_EAVS_Engine(period=20, threshold=0.3)
    result = eavs.run_diagnosis(price)

    # 3. Visualization
    fig, axes = plt.subplots(3, 1, figsize=(12, 10), sharex=True)
    
    # Subplot 1: Price
    axes[0].plot(result.index, result['Close'], label='Price', color='black')
    axes[0].set_title(f'{name} Price Movement')
    axes[0].grid(True, alpha=0.3)
    axes[0].legend()

    # Subplot 2: Efficiency Ratio (ER)
    axes[1].plot(result.index, result['ER'], label='Efficiency Ratio (ER)', color='blue')
    axes[1].axhline(y=0.3, color='red', linestyle='--', label='Threshold (0.3)')
    axes[1].set_title('Market Efficiency (Noise Level)')
    axes[1].set_ylabel('ER (0=Noise, 1=Trend)')
    axes[1].grid(True, alpha=0.3)
    axes[1].legend()

    # Subplot 3: Scaling Factor (Final Output)
    # Scalar가 1.0 미만으로 떨어지는 구간(비중 축소)을 붉은색으로 채움
    axes[2].plot(result.index, result['Scalar'], label='EAVS Scaling Factor', color='green')
    axes[2].fill_between(result.index, result['Scalar'], 1.0, where=(result['Scalar'] < 1.0), 
                         color='red', alpha=0.3, label='Noise Reduction Active')
    axes[2].set_title('EAVS Scaling Factor (1.0 = Max Exposure)')
    axes[2].set_ylabel('Scalar (Multiplier)')
    axes[2].set_ylim(-0.1, 1.1)
    axes[2].grid(True, alpha=0.3)
    axes[2].legend()

    plt.tight_layout()
    plt.show()

# ==========================================
# [Main Execution]
# ==========================================
if __name__ == "__main__":
    # 한국(EWY)과 미국(SPY)의 2022년 하락장~횡보장 시뮬레이션
    # EWY: iShares MSCI South Korea ETF (KOSPI 대용)
    # SPY: SPDR S&P 500 ETF Trust
    
    # 1. Korea Case (EWY) - 횡보와 노이즈가 많았던 구간
    run_simulation('EWY', 'Korea (EWY) - Noise/Choppy Market', start_date='2021-06-01', end_date='2023-01-01')
    
    # 2. US Case (SPY) - 추세적 하락이 있었던 구간
    run_simulation('SPY', 'US (SPY) - Trending Market', start_date='2021-06-01', end_date='2023-01-01')

 

부록 : Pine Script 코드

// ==========================================
// [WeJump] CBVR 2.3 EAVS Integration (For ETF Indicator)
// ==========================================

// [A] EAVS 함수 선언
f_calc_eavs_scalar(_src, _len, _th) =>
    _net_change = math.abs(_src - _src[_len])
    _total_path = math.sum(math.abs(_src - _src[1]), _len)
    _er = _total_path != 0 ? _net_change / _total_path : 0
    _scalar = _er >= _th ? 1.0 : _er / _th
    _scalar

// [B] 메인 로직 적용 (Core 로직 하단부 수정)

// 1. 기존 Core 로직에 의한 비중 (Original Intent)
// (이 시점에서 weight_ticker1은 이미 계산되어 있다고 가정)
core_w1 = weight_ticker1 > 1.00 ? 1.00 : weight_ticker1
core_w2 = 1.00 - core_w1 

// 2. EAVS Scalar 계산
// * 기본값: period=20, threshold=0.3
int eavs_period = input.int(25, "EAVS: ER Period", group="CBVR 2.3 Upgrade")
float eavs_threshold = input.float(0.01, "EAVS: Noise Threshold", step=0.01, group="CBVR 2.3 Upgrade")
eavs_scalar = f_calc_eavs_scalar(close_volatility_ticker, eavs_period, eavs_threshold)

// 3. Cash Proxy (방어용 중립 비중) 정의
// * 현금 대신 채울 비중: Lev 30% + Inv 70% (Beta ≈ 0)
cash_proxy_w1 = 0.30
cash_proxy_w2 = 0.70

// 4. 최종 집행 비중 (Linear Interpolation)
// * Scalar 비율만큼은 Core를 따르고, 나머지(1-Scalar)는 방어 비중을 따름
// * 예: Scalar 0.8 -> 80%는 전략대로, 20%는 방어 포지션(30:70)으로
weight_ticker1 := (core_w1 * eavs_scalar) + (cash_proxy_w1 * (1.0 - eavs_scalar))
weight_ticker2 := (core_w2 * eavs_scalar) + (cash_proxy_w2 * (1.0 - eavs_scalar))

// [결과 확인]
// Scalar가 낮아질수록(노이즈 발생), 포트폴리오는 점점 30:70 비율로 수렴하여 변동성이 죽게 됨.
// ETF 자산 내에서 안전지대(Cash Proxy)를 구현하는 방식.

 

같이 읽을 글 : https://wejump3.tistory.com/entry/CBVR-23-%EC%A0%84%EB%9E%B5-%ED%95%B4%EC%84%A4%EC%84%9C-%EB%8F%99%EC%A0%81-%EB%B2%A0%ED%83%80-%EC%8A%A4%EC%9C%84%EC%B9%AD%EA%B3%BC-%EC%9E%AC%EA%B7%80%EC%A0%81-%EC%9C%84%ED%97%98-%EA%B4%80%EB%A6%AC%EC%9D%98-%EA%B3%B5%ED%95%99%EC%A0%81-%EC%9B%90%EB%A6%AC

 

CBVR 2.3 전략 해설서: 동적 베타 스위칭에서 EAVS 까지

CBVR 2.3 전략 해설서: 동적 베타 스위칭과 재귀적 위험 관리의 공학적 원리1. 서론: 단순한 신호 체계를 넘어서는 적응형 시스템본 해설서는 CBVR 2.3 시스템의 금융 공학적 원리와 시장 대응 전략을

wejump3.tistory.com


https://wejump3.tistory.com/1

 

[문서 목록] Channel-Vector Based Volatility Rebalancing Strategy

문서 저장소 및 Wiki :📜 문서 저장소 : https://crowmag2.github.io/wejump/📜 Wiki 문서 : https://crowmag2.github.io/wejump/cbvr_wiki/ 위점프 투자전략 연구소 CBVR 전략 문서저장소 - WeJump Investment Labs CBVR Strategy documen

wejump3.tistory.com

 


문의하기
연구소 구독