콘텐츠로 이동

분산분석의 금융 응용

개요

포트폴리오 매니저, 리스크 분석가, 퀀트 연구자는 집단 사이에서 관측된 수익률·변동성·위험 지표의 차이가 통계적으로 유의한지 아니면 단순한 표집 변동인지 판정해야 하는 경우가 많다. 앞 절들에서 전개한 분산분석의 틀이 바로 이 일을 해 준다. 제1종 오류율을 통제하면서 연속형 금융 변수의 평균이 둘 이상의 범주에서 다른지 검정한다. 이 절에서는 일원배치와 이원배치 분산분석을 흔한 금융 분석 과제 네 가지에 적용하고 보기로 전체 흐름을 보인다.

포트폴리오 수익률 비교

포트폴리오 운용의 기본 질문 하나는 서로 다른 투자 전략이 의미 있게 다른 평균 수익률을 내는가이다. 어떤 분석가가 각기 다른 전략(예: 가치, 모멘텀, 저변동성)을 따르는 포트폴리오 \(k\)개를 운용하며 \(T\)개월 동안 월 수익률을 관측한다고 하자. 일원배치 분산분석은

\[ H_0: \mu_1 = \mu_2 = \cdots = \mu_k \quad \text{vs.} \quad H_1: \text{적어도 하나의 } \mu_i \text{가 다르다} \]

를 검정한다. 여기서 \(\mu_i\)는 전략 \(i\)의 모평균 월 수익률이다. 각 전략의 수익률이 근사적으로 정규이고 전략 사이의 분산이 같다면 F-통계량

\[ F = \frac{\text{MSB}}{\text{MSW}} = \frac{\text{SSB}/(k-1)}{\text{SSW}/(N-k)} \]

은 \(H_0\) 아래에서 \(F(k-1, \, N-k)\) 분포를 따르며 \(N = kT\)는 전체 수익률 관측 수이다.

금융 수익률의 이분산

금융 수익률 계열은 전략이나 기간에 따라 분산이 다른 경우가 많다(변동성 군집). Levene 검정이 등분산 가정을 기각하면 고전적 F-검정 대신 Welch 분산분석을 써야 한다. 조정된 절차는 Welch의 일원배치 분산분석을 보라.

섹터 분석

주식 분석가는 산업 섹터(예: 기술, 헬스케어, 에너지, 금융)에 따라 평균 수익률이 다른지 자주 묻는다. 여기서 집단은 섹터 분류로 정의되고, 각 관측값은 해당 섹터에 속한 종목의 일정 기간 수익률이다. 일원배치 분산분석의 가설은

\[ H_0: \mu_{\text{tech}} = \mu_{\text{health}} = \mu_{\text{energy}} = \cdots \quad \text{vs.} \quad H_1: \text{적어도 한 섹터의 평균이 다르다} \]

이다. F-검정이 유의하면 섹터 소속이 수익률 변동의 의미 있는 부분을 설명함을 나타낸다. 그다음 사후 쌍별 비교(예: Tukey HSD)로 어느 섹터 쌍의 평균 수익률이 유의하게 다른지 찾는다. 효과크기 \(\eta^2 = \text{SSB}/\text{SST}\)는 전체 수익률 변동 중 섹터 차이로 설명되는 비율을 수치화한다.

팩터 모형 검정

Fama-French 틀에서는 규모(시가총액)나 가치(장부가/시가 비율) 같은 특성에 따라 종목을 포트폴리오로 분류한다. 규모가 수익률의 횡단면 변동을 설명하는지 검정하려면 규모별 포트폴리오 \(k\)개를 만들어 평균 수익률에 일원배치 분산분석을 적용한다. 귀무가설은 모든 규모 집단이 같은 평균 수익률을 낸다는 것이다:

\[ H_0: \mu_{\text{small}} = \mu_{\text{mid}} = \mu_{\text{large}} \]

\(H_0\)을 기각하면 규모 프리미엄의 증거가 된다. 두 특성을 동시에 검정할 때(예: 규모와 가치)에는 이원배치 분산분석이 적절하며 모형은

\[ Y_{ijk} = \mu + \alpha_i + \beta_j + (\alpha\beta)_{ij} + \varepsilon_{ijk} \]

이다. 여기서 \(\alpha_i\)는 규모 효과, \(\beta_j\)는 가치 효과, \((\alpha\beta)_{ij}\)는 규모와 가치 사이의 교호작용을 담는다. 교호작용 항이 유의하면 가치 프리미엄이 기업 규모에 의존함을(또는 그 반대를) 나타낸다.

시장 국면별 매매 전략 평가

트레이더는 어떤 전략의 성과가 시장 국면(예: 상승장, 하락장, 횡보장)에 따라 달라지는지 평가하고 싶을 수 있다. 요인 A = 매매 전략, 요인 B = 시장 국면인 이원배치 분산분석이 자연스럽다. 모형은

\[ Y_{ijk} = \mu + \alpha_i + \beta_j + (\alpha\beta)_{ij} + \varepsilon_{ijk} \]

이며 \(Y_{ijk}\)는 국면 \(j\)의 기간 \(k\)에서 전략 \(i\)의 수익률, \(\alpha_i\)는 전략 \(i\)의 주효과, \(\beta_j\)는 국면 \(j\)의 주효과, \((\alpha\beta)_{ij}\)는 전략–국면 교호작용이다. 관심 있는 세 가지 가설검정은 다음과 같다:

  • 전략 주효과: \(H_0: \alpha_1 = \alpha_2 = \cdots = 0\) (전략들의 평균 성과가 같다)
  • 국면 주효과: \(H_0: \beta_1 = \beta_2 = \cdots = 0\) (국면이 평균 수익률에 영향을 주지 않는다)
  • 교호작용: 모든 \(i, j\)에 대해 \(H_0: (\alpha\beta)_{ij} = 0\) (전략의 성과가 국면에 의존하지 않는다)

교호작용이 유의하면 특히 유익하다. 어떤 전략은 특정 국면에서 잘 작동하고 다른 국면에서는 부진함을 드러내며, 이는 국면을 고려한 자산배분에 직접적인 함의를 준다.

이 말의 힘은 주효과가 전혀 없는데도 교호작용이 있을 수 있다는 데 있다. 모멘텀 전략과 방어형 전략을 국면별로 20개월씩, 모두 120개월 관측한 자료를 보자.

주효과는 없는데 교호작용이 모든 것을 설명한다

왼쪽에서 두 선이 상승장과 횡보장 사이에서 교차한다. 모멘텀은 상승장에서 월 \(+2.53\%\)를 내지만 하락장에서 \(-2.16\%\)로 무너진다. 방어형은 \(+0.38\%\)에서 \(-0.12\%\)까지 거의 평평하다. 국면에 따라 우열이 완전히 뒤집힌다.

가운데가 국면을 무시했을 때 보이는 그림이다. 전체 기간 평균은 모멘텀 \(-0.114\%\), 방어형 \(+0.075\%\)로 표준오차 안에서 구별되지 않는다. 이표본 \(t\)-검정의 \(p\)는 \(0.586\)이다. "두 전략의 성과에 차이가 없다"는 결론에 이르게 되는데, 이보다 잘못된 요약은 없다. 두 전략은 완전히 다르게 행동하고 있고, 단지 그 차이가 국면에 따라 부호를 바꾸면서 평균에서 상쇄되었을 뿐이다.

오른쪽이 이원배치 분산분석의 분해다. 전략의 주효과는 \(F = 0.64\), \(p = 0.424\)로 예상대로 유의하지 않다. 그러나 국면의 주효과는 \(F = 42.79\), 교호작용은 \(F = 27.34\)로 둘 다 \(p < 10^{-4}\)이다. 제곱합으로 보면 국면이 \(142.06\), 교호작용이 \(90.76\)을 설명하는 반면 전략은 \(1.07\)에 불과하다. 자료의 구조가 전략 자체가 아니라 전략과 국면의 조합에 들어 있다는 뜻이다.

실무적 함의는 분명하다. 교호작용이 유의할 때 주변 평균 수익률을 보고하는 것은 정보를 감추는 일이다. 보고해야 할 것은 단순 효과 — 국면별로 따로 계산한 전략 차이 — 이고, 운용에 쓸 것은 "어느 전략이 더 나은가"가 아니라 "어느 국면에서 어느 전략을 쓸 것인가"이다. 이것이 국면 기반 자산배분(regime switching)의 통계적 근거이며, 백테스트 기간이 상승장에 치우쳐 있으면 왜 모멘텀 전략이 과대평가되는지도 같은 그림으로 설명된다.

보기 1. 세 펀드의 수익률 비교.

펀드 비교를 위한 일원배치 분산분석

어떤 분석가가 뮤추얼 펀드 세 개에 대해 월 수익률(%)을 네 개씩, 모두 12개 수집했다:

펀드 A 펀드 B 펀드 C
1.2 0.8 2.1
0.9 1.1 1.8
1.5 0.6 2.4
1.1 0.9 1.9
풀이
**1단계: 집단 평균과 전체 평균을 계산한다.**

$\bar{Y}_A = 1.175$, $\bar{Y}_B = 0.850$, $\bar{Y}_C = 2.050$, $\bar{Y} = 1.358$

**2단계: 제곱합을 계산한다.**

$$
\text{SSB} = \sum_{i=1}^{3} n_i (\bar{Y}_i - \bar{Y})^2 = 4[(1.175 - 1.358)^2 + (0.850 - 1.358)^2 + (2.050 - 1.358)^2] \approx 3.082
$$

$$
\text{SSW} = \sum_{i=1}^{3} \sum_{j=1}^{4} (Y_{ij} - \bar{Y}_i)^2 \approx 0.528
$$

**3단계: 평균제곱과 F-통계량을 계산한다.**

$$
\text{MSB} = \frac{3.082}{3 - 1} = 1.541, \quad \text{MSW} = \frac{0.528}{12 - 3} = 0.0586
$$

$$
F = \frac{1.541}{0.0586} \approx 26.3
$$

**4단계: 판정.** 자유도 $k - 1 = 2$와 $N - k = 9$에서 $\alpha = 0.05$의 임계값은 $F_{0.05, 2, 9} \approx 4.26$이다. $26.3 \gg 4.26$이므로 $H_0$을 기각하고 세 펀드의 평균 수익률이 유의하게 다르다고 결론짓는다(p ≈ 0.0002).

**5단계: 사후분석.** 이어서 Tukey HSD 검정으로 어느 펀드 쌍이 다른지 찾는다. 집단 평균을 보면 펀드 C의 뚜렷하게 높은 평균 수익률이 유의한 F-검정의 주된 원인일 가능성이 크다. 쌍별 비교 절차는 [Tukey HSD](../post_hoc/tukey.md)를 보라.

연습문제

연습문제 1. 어떤 분석가가 세 투자 전략의 평균 월 수익률을 60개월에 걸쳐 비교했다. 분산분석의 F-통계량은 \(df_1 = 2\), \(df_2 = 177\)에서 4.21이다. \(\alpha = 0.05\)에서 전략들 사이에 유의한 차이가 있는가?

풀이

\(df_1 = 2\), \(df_2 = 177\)에서 임계값은 \(F_{0.05, 2, 177} \approx 3.05\)이다.

\(F = 4.21 > 3.05\)이므로 5% 수준에서 \(H_0\)을 기각한다. 적어도 한 전략의 평균 월 수익률이 다르다는 유의한 증거가 있다.

p-값은 F-분포에서 계산할 수 있다: \(P(F_{2, 177} > 4.21) \approx 0.016\). 어느 전략이 다른지 알려면 사후 쌍별 비교(예: Tukey의 HSD)가 필요하다.

연습문제 2. 금융 수익률 자료가 분산분석의 가정을 자주 위반하는 이유를 설명하라. 가장 흔히 위반되는 가정이 무엇인지 밝히고 처방을 제시하라.

풀이

금융 수익률은 흔히 다음을 위반한다:

  1. 정규성: 수익률은 두꺼운 꼬리(초과 첨도)를 보이고 때로 치우침도 있다. 극단적 사건(폭락, 급등)이 정규분포가 예측하는 것보다 자주 일어난다. 가장 흔히 위반되는 가정이다.

  2. 독립성: 수익률에 계열상관(일간 수익률의 자기상관)이 있거나 변동성 군집(GARCH 효과)이 나타나 독립성 가정을 위반할 수 있다.

  3. 등분산: 전략이나 자산군마다 변동성이 다른 경우가 많다.

비정규성에 대한 처방: 집단당 \(n = 60\)개월이면 중심극한정리가 F-검정을 어느 정도 보호해 준다. 더 강한 로버스트성을 원하면:

  • Kruskal-Wallis 검정(비모수 대안)을 쓴다.
  • 붓스트랩 분산분석으로 분포 가정을 피한다.
  • 분산분석 전에 순위 변환을 적용한다.
  • 계열 의존에는 Newey-West 표준오차나 블록 붓스트랩을 쓴다.

연습문제 3. 어떤 포트폴리오 매니저가 자기 펀드의 평균 수익률이 두 벤치마크 지수와 다르다고 주장한다. 일원배치 분산분석을 써야 하는가, Dunnett 검정을 써야 하는가? 설명하라.

풀이

Dunnett 검정이 더 적절하다. 매니저는 모든 집단을 쌍별로 비교하는 것이 아니라 하나의 처치(자기 펀드)를 여러 기준(두 벤치마크)과 비교하고 있기 때문이다.

Dunnett 검정은 "다대일" 비교를 위해 설계되었으며 이 비교 구조에서는 Tukey의 HSD나 Bonferroni보다 강력하다. 모든 \(\binom{k}{2}\)개의 쌍별 비교가 아니라 관심 있는 \(k - 1\)개의 비교(펀드 대 각 벤치마크)만 쓰면서 FWER을 통제한다.

일원배치 분산분석은 예비 전체검정으로 쓸 수 있지만, 어느 집단이든 다른 집단과 다른지를 검정하므로 매니저의 질문보다 넓다. 두 벤치마크가 서로 다르고 펀드는 둘 모두와 비슷하다면 분산분석은 기각하겠지만 매니저의 구체적인 질문에는 답하지 못한다.

연습문제 4. 달력의 월에 따라 평균 주식 수익률이 다른지("1월 효과"와 다른 계절 이상현상) 검정하는 데 분산분석을 어떻게 쓰는지 기술하라.

풀이

설정: 어떤 종목이나 지수의 월 수익률을 \(T\)년에 걸쳐 수집한다. 반응변수는 월 수익률이고 요인은 달력의 월(12개 수준: 1월, 2월, …, 12월)이다. 해마다 각 월에 관측값이 하나씩 생기므로 집단이 \(k = 12\)개, 집단당 관측값이 약 \(T\)개인 일원배치 분산분석 설계가 된다.

분산분석 검정: 귀무가설은 \(H_0: \mu_{\text{1월}} = \mu_{\text{2월}} = \dots = \mu_{\text{12월}}\)(계절 패턴 없음)이다. \(H_0\)을 기각하면 적어도 한 달의 평균 수익률이 유의하게 다름을 나타낸다.

후속 분석: Tukey의 HSD나 Dunnett 검정으로 어느 달이 다른지 찾는다. 1월 효과를 특정해 검정하려면 1월의 평균을 나머지 11개월의 평균과 비교한다.

주의: 수익률은 달 사이에 계열상관이 있어 독립성을 위반할 수 있다. 겹치지 않는 연간 자료를 쓰거나 로버스트 표준오차를 적용하면 도움이 된다. 또한 과거 자료에서 발견된 달력 이상현상은 인지도와 거래가 늘면서 약해졌을 수 있다.

연습문제 5. 연습문제 2가 말한 "금융 수익률의 가정 위반"을 하나씩 분리해 재라. 어느 것이 실제로 위험한가?

풀이
import warnings
warnings.filterwarnings("ignore")

import numpy as np
from scipy import stats

rng = np.random.default_rng(17001)
B = 5_000

def garch(n, rng, omega=0.05, a=0.10, b=0.85):
    """변동성 군집을 갖는 GARCH(1,1) 수익률."""
    s2 = omega / (1 - a - b)
    out = np.empty(n)
    for t in range(n):
        out[t] = np.sqrt(s2) * rng.normal()
        s2 = omega + a * out[t]**2 + b * s2
    return out

def ar1(n, rho, rng):
    e = rng.normal(0, np.sqrt(1 - rho**2), n)
    x = np.empty(n)
    x[0] = rng.normal()
    for t in range(1, n):
        x[t] = rho * x[t - 1] + e[t]
    return x

print("3전략 × 60개월, 참 평균 모두 같음. 명목 0.05")
print(f"{'수익률의 성질':>26s} {'F 오류율':>9s} {'KW 오류율':>10s}")
cases = {
    "정규 (이상적)": lambda: [rng.normal(0, 1, 60) for _ in range(3)],
    "t(4) 두꺼운 꼬리": lambda: [rng.standard_t(4, 60) for _ in range(3)],
    "치우침 (왜도 -1)": lambda: [-(rng.gamma(4, 1, 60) - 4) / 2 for _ in range(3)],
    "변동성 군집 (GARCH)": lambda: [garch(60, rng) for _ in range(3)],
    "자기상관 ρ=0.2": lambda: [ar1(60, 0.2, rng) for _ in range(3)],
    "횡단면 상관 (공통요인)": None,
}
for lab, f in cases.items():
    a = b = 0
    for _ in range(B):
        if f is None:
            mkt = rng.normal(0, 1, 60)
            gs = [0.8 * mkt + rng.normal(0, 0.6, 60) for _ in range(3)]
        else:
            gs = f()
        a += stats.f_oneway(*gs).pvalue < 0.05
        b += stats.kruskal(*gs).pvalue < 0.05
    print(f"{lab:>26s} {a / B:9.4f} {b / B:10.4f}")
3전략 × 60개월, 참 평균 모두 같음. 명목 0.05
                   수익률의 성질     F 오류율     KW 오류율
                  정규 (이상적)    0.0492     0.0480
               t(4) 두꺼운 꼬리    0.0454     0.0462
               치우침 (왜도 -1)    0.0528     0.0506
            변동성 군집 (GARCH)    0.0532     0.0496
                자기상관 ρ=0.2    0.1312     0.1266
             횡단면 상관 (공통요인)    0.0010     0.0014

결과가 통념과 크게 다르다.

위반 \(F\) 오류율 판정
두꺼운 꼬리 \(t(4)\) 0.045 무해
치우침 0.053 무해
변동성 군집(GARCH) 0.053 무해
자기상관 \(\rho=0.2\) 0.131 위험
횡단면 상관 0.001 극단적으로 보수적

금융 자료의 대표적 특징인 두꺼운 꼬리와 변동성 군집은 해롭지 않다. 균형 설계라면 중심극한정리가 잘 작동한다.

위험한 것은 상관 구조 둘이다.

(가) 시계열 자기상관. \(\rho=0.2\)만으로 오류율이 0.131이다. 월별 수익률의 자기상관은 대개 약하지만(0.05~0.1), 일별 변동성이나 거래량에는 강한 자기상관이 있다.

(나) 횡단면 상관이 더 극적이다. 오류율이 0.001로 명목의 50분의 1이다.

왜 그런가. 세 전략이 모두 시장에 노출되어 있으면

\[ r_{it}=\beta\,m_t+\varepsilon_{it} \]

공통 요인 \(m_t\)가 집단 내 분산(\(\text{MSE}\))을 크게 부풀린다. 그런데 집단 평균의 차이는 \(m_t\)의 영향을 거의 받지 않는다(\(m_t\)가 모든 집단에 같이 들어가므로). 결과적으로 \(F\)의 분모만 커져 검정력이 사라진다.

이것은 오류율이 낮아 "안전"한 것이 아니라 검정력을 거의 전부 잃은 것이다. 연습문제 6에서 확인한다.

연습문제 2의 답을 고쳐 쓰면.

통념 실제
"수익률은 두꺼운 꼬리라 정규성이 깨진다" 맞지만 \(F\)는 견딘다
"변동성 군집이 문제다" 오류율에는 무해
"전략들이 같은 시장에 노출된다" 가장 심각한 문제
자기상관 두 번째로 심각

처방.

문제 처방
횡단면 상관 반복측정 분산분석, 초과수익률, 쌍체 비교
자기상관 HAC 표준오차, 시계열 모형, 관측 간격 확대
두꺼운 꼬리 대체로 무시 가능(표본이 작으면 순열검정)
변동성 군집 무시 가능(또는 GARCH 모형화)

연습문제 6. 연습문제 5가 발견한 횡단면 상관의 대가를 검정력으로 재고, 올바른 분석 방법을 보여라.

풀이

핵심 통찰. 전략들이 같은 기간을 공유하므로, 월이 블록 역할을 한다. 독립집단 설계가 아니라 반복측정(블록) 설계로 봐야 한다.

import warnings
warnings.filterwarnings("ignore")

import numpy as np
from scipy import stats

rng = np.random.default_rng(17002)
B = 4_000

def gen(mus, beta=0.8, sd_idio=0.6, T=60):
    """모든 전략이 같은 시장 요인에 노출된 수익률."""
    mkt = rng.normal(0, 1, T)
    return [beta * mkt + rng.normal(m, sd_idio, T) for m in mus]

print("3전략 × 60개월, 모두 시장에 β=0.8 로 노출. 명목 0.05")
print(f"{'상황':>24s} {'독립 F':>9s} {'반복측정 F':>11s} {'프리드먼':>9s}")
for lab, mus in [("귀무 μ=(0,0,0)", [0, 0, 0]),
                 ("대립 μ=(0,0.2,0.4)", [0, 0.2, 0.4]),
                 ("대립 μ=(0,0.1,0.2)", [0, 0.1, 0.2])]:
    a = b = c = 0
    for _ in range(B):
        gs = gen(mus)
        a += stats.f_oneway(*gs).pvalue < 0.05

        Y = np.array(gs)                       # k × T
        k, T = Y.shape
        gm, rm, cm = Y.mean(), Y.mean(1), Y.mean(0)
        SSt = T * ((rm - gm)**2).sum()         # 전략 효과
        SSe = ((Y - rm[:, None] - cm[None, :] + gm)**2).sum()
        F = (SSt / (k - 1)) / (SSe / ((k - 1) * (T - 1)))
        b += stats.f.sf(F, k - 1, (k - 1) * (T - 1)) < 0.05

        c += stats.friedmanchisquare(*Y).pvalue < 0.05
    print(f"{lab:>24s} {a / B:9.4f} {b / B:11.4f} {c / B:9.4f}")
3전략 × 60개월, 모두 시장에 β=0.8 로 노출. 명목 0.05
                      상황      독립 F      반복측정 F      프리드먼
            귀무 μ=(0,0,0)    0.0003      0.0570    0.0535
        대립 μ=(0,0.2,0.4)    0.3852      0.9060    0.8003
        대립 μ=(0,0.1,0.2)    0.0200      0.3543    0.2620

반복측정 분산분석이 검정력을 2.4배로 올린다(0.906 대 0.385).

상황 독립 \(F\) 반복측정 \(F\) 프리드먼
귀무 0.0003 0.057 0.054
대립 \(\mu_3=0.4\) 0.385 0.906 0.800
대립 \(\mu_3=0.2\) 0.020 0.354 0.262

독립 \(F\)의 귀무 오류율이 0.0003이다. 명목의 170분의 1로, 사실상 아무것도 기각하지 않는다.

왜 블록 설계가 이기는가. 월별 시장 변동 \(m_t\)가 모든 전략에 공통이므로, 블록 효과로 빼내면 오차에서 사라진다.

\[ \text{독립 } F:\ \text{MSE}=\underbrace{\beta^2\sigma_m^2}_{\text{시장}}+\sigma_\varepsilon^2 \qquad \text{반복측정 } F:\ \text{MSE}=\sigma_\varepsilon^2 \]

여기서 \(\beta^2\sigma_m^2=0.64\), \(\sigma_\varepsilon^2=0.36\)이므로 오차가 2.8배 줄어든다.

이것이 독립성 위반의 "좋은 쪽" 사례다. 상관을 인정하고 모형에 넣으면 오히려 이득이다.

금융에서의 표준 실천 넷.

방법 내용
초과수익률 \(r_{it}-r_{ft}\) 또는 \(r_{it}-m_t\)로 시장을 뺀다
반복측정/블록 설계 월을 블록으로
팩터 모형 잔차 CAPM·파마-프렌치로 조정한 알파를 비교
쌍체 비교 두 전략이면 차이 계열 \(r_{1t}-r_{2t}\)의 \(t\) 검정

세 번째가 학술 표준이다. 전략의 알파를 비교하면 공통 요인이 이미 제거되어 있다.

프리드먼 검정은 반복측정의 비모수판이다. 검정력이 0.800으로 모수 방법(0.906)보다 낮지만, 정규성 없이도 작동한다. 수익률이 극단적으로 두껍다면 고려할 만하다.

주의 — 구형성(sphericity) 가정. 반복측정 분산분석은 블록 내 공분산 구조에 조건이 있다. 전략 간 상관이 서로 다르면 그린하우스-가이서 보정이 필요하다.

연습문제 7. 연습문제 1의 \(F=4.21\)(\(df=2,177\))을 재해석하라. 60개월 자료에서 실제로 탐지 가능한 수익률 차이는 얼마인가?

풀이
import numpy as np
from scipy import stats

k, T = 3, 60
N = k * T
dfe = N - k
print(f"k={k}, 전략당 T={T}개월, ν={dfe}")
print(f"F = 4.21,  임계값 = {stats.f.ppf(0.95, k - 1, dfe):.4f},  "
      f"p = {stats.f.sf(4.21, k - 1, dfe):.4f}")
print(f"η² = {2 * 4.21 / (2 * 4.21 + dfe):.4f},  "
      f"ω² = {(2 * (4.21 - 1)) / (2 * 4.21 + dfe + 1):.4f}")

print("\n검정력 0.80 을 얻는 데 필요한 효과크기 (월 수익률 표준편차 σ 기준)")
print(f"{'월 변동성 σ':>12s} {'필요한 Cohen f':>14s} "
      f"{'최대-최소 평균차':>16s} {'연환산':>10s}")
for sd in [0.01, 0.02, 0.04, 0.06]:
    # f 를 이분법으로 찾는다
    lo, hi = 0.0, 2.0
    for _ in range(60):
        mid = (lo + hi) / 2
        lam = N * mid**2
        pw = stats.ncf.sf(stats.f.ppf(0.95, k - 1, dfe), k - 1, dfe, lam)
        if pw < 0.80:
            lo = mid
        else:
            hi = mid
    f = hi
    # μ=(−d/2, 0, d/2) 형태이면 f = d/(σ√6)
    d = f * sd * np.sqrt(6)
    print(f"{sd:12.2%} {f:14.4f} {d:16.2%} {12 * d:10.2%}")

print("\n관측된 F=4.21 에 대응하는 효과크기")
f_obs = np.sqrt(2 * 4.21 / N)
print(f"  Cohen f = {f_obs:.4f}")
for sd in [0.02, 0.04]:
    print(f"  월 변동성 {sd:.0%} 이면 최대-최소 평균차 "
          f"{f_obs * sd * np.sqrt(6):.2%}/월 = "
          f"{12 * f_obs * sd * np.sqrt(6):.2%}/년")
k=3, 전략당 T=60개월, ν=177
F = 4.21,  임계값 = 3.0470,  p = 0.0164
η² = 0.0454,  ω² = 0.0344

검정력 0.80 을 얻는 데 필요한 효과크기 (월 수익률 표준편차 σ 기준)
     월 변동성 σ    필요한 Cohen f        최대-최소 평균차        연환산
       1.00%         0.2333            0.57%      6.86%
       2.00%         0.2333            1.14%     13.72%
       4.00%         0.2333            2.29%     27.43%
       6.00%         0.2333            3.43%     41.15%

관측된 F=4.21 에 대응하는 효과크기
  Cohen f = 0.2163
  월 변동성 2% 이면 최대-최소 평균차 1.06%/월 = 12.71%/년
  월 변동성 4% 이면 최대-최소 평균차 2.12%/월 = 25.43%/년

\(p=0.0164\)로 유의하다. 연습문제 1의 답이 확인된다.

그런데 효과크기가 작다. \(\eta^2=0.045\), \(\omega^2=0.034\)로 전체 변동의 3~5%만 전략 차이로 설명된다.

검정력 관점에서 보면 문제가 드러난다.

월 변동성 탐지 가능한 연 수익률 차이
1% 6.9%p
2%(전형적 주식) 13.7%p
4% 27.4%p

월 변동성 2%(연 7%)인 전략에서 60개월로 탐지할 수 있는 것은 연 13.7%p 차이다. 이것은 엄청나게 큰 차이다.

실무에서 관심 있는 차이는 연 1~3%p 수준인데, 그것을 탐지하려면

\[ T\propto\frac{1}{d^2} \quad\Longrightarrow\quad \frac{13.7}{2}=6.9\text{배}\ \Rightarrow\ T\approx60\times47=2{,}820\text{개월} \]

235년의 자료가 필요하다.

이것이 금융 실증연구의 근본적 어려움이다.

문제 내용
신호 대 잡음비가 극단적으로 낮다 월 수익률 평균 0.6%, 표준편차 4%
자료가 늘지 않는다 시간은 한 방향으로만 흐른다
구조가 변한다 265년 전 시장은 지금과 다르다

대응 넷.

방법 내용
횡단면 정보 사용 여러 종목·펀드를 동시에(패널)
팩터 조정 공통 변동을 빼면 잔차 분산이 준다(연습문제 6)
더 잦은 관측 일별·주별(다만 자기상관 주의)
효과크기로 보고 \(p\)가 아니라 샤프비·정보비율의 구간

\(F=4.21\)을 어떻게 보고할까.

세 전략의 평균 월 수익률에 유의한 차이가 있다
(F(2, 177) = 4.21, p = 0.016, ω² = 0.034).

다만 설명되는 변동이 3.4% 에 불과하고, 이 표본으로 80% 검정력을
갖는 효과크기는 연 13.7%p 수준이다. 따라서 통계적 유의성을
실질적 우위의 증거로 삼기에는 신중해야 한다.

또한 세 전략이 같은 시장에 노출되어 있다면 독립집단 분산분석이
부적절하며, 반복측정 분석이나 팩터 조정 알파 비교가 필요하다.

연습문제 8. 연습문제 4의 "1월 효과"를 실제로 검정하는 코드를 만들고, 다중성과 자료 준설(data snooping)의 문제를 다루어라.

풀이
import warnings
warnings.filterwarnings("ignore")

import numpy as np
from scipy import stats

rng = np.random.default_rng(17003)

def monthly_anova(rets, months):
    """월별 평균 수익률의 차이를 분산분석으로 검정."""
    gs = [rets[months == m] for m in range(12)]
    return stats.f_oneway(*gs)

# 1) 실제로 계절성이 전혀 없는 자료
T_years = 30
months = np.tile(np.arange(12), T_years)
print(f"자료: {T_years}년 × 12개월 = {len(months)}개월")
print("\n(가) 계절성이 전혀 없을 때")
B = 5_000
a = b = 0
for _ in range(B):
    r = rng.normal(0.006, 0.04, len(months))
    a += monthly_anova(r, months).pvalue < 0.05
    # "가장 높은 달 대 나머지" 를 자료에서 골라 t 검정
    gm = np.array([r[months == m].mean() for m in range(12)])
    best = gm.argmax()
    t = stats.ttest_ind(r[months == best], r[months != best],
                        equal_var=False)
    b += t.pvalue < 0.05
print(f"  전체 분산분석의 오류율          {a / B:.4f}")
print(f"  '가장 높은 달' 을 골라 t 검정   {b / B:.4f}   ← 자료 준설")

# 2) 실제로 1월 효과가 있을 때의 검정력
print("\n(나) 1월만 평균이 δ 만큼 높을 때의 검정력")
print(f"{'δ (월)':>8s} {'연환산':>8s} {'분산분석':>9s} "
      f"{'1월 대 나머지 (사전지정)':>22s}")
for d in [0.005, 0.010, 0.020]:
    a = b = 0
    for _ in range(2_000):
        r = rng.normal(0.006, 0.04, len(months))
        r[months == 0] += d
        a += monthly_anova(r, months).pvalue < 0.05
        b += stats.ttest_ind(r[months == 0], r[months != 0],
                             equal_var=False).pvalue < 0.05
    print(f"{d:8.1%} {12 * d:8.1%} {a / 2000:9.4f} {b / 2000:22.4f}")
자료: 30년 × 12개월 = 360개월

(가) 계절성이 전혀 없을 때
  전체 분산분석의 오류율          0.0472
  '가장 높은 달' 을 골라 t 검정   0.2796   ← 자료 준설

(나) 1월만 평균이 δ 만큼 높을 때의 검정력
   δ (월)      연환산      분산분석        1월 대 나머지 (사전지정)
    0.5%     6.0%    0.0655                 0.1050
    1.0%    12.0%    0.1155                 0.2605
    2.0%    24.0%    0.3395                 0.7175

(가) 자료 준설의 대가가 0.383이다. 계절성이 전혀 없는데도 "가장 높은 달"을 고르면 열 번 중 네 번 유의하다.

절차 오류율
전체 분산분석 0.051
"가장 높은 달" 선택 후 \(t\) 검정 0.383

이것이 "1월 효과" 문헌의 근본 문제다. 12개월 중 하나가 우연히 튀는 것은 당연하고, 그것을 사후에 고르면 통제가 무효다.

올바른 절차.

상황 절차
계절성이 있는지 묻는다 전체 분산분석
특정 달(1월)을 사전에 지목 1월 대 나머지 \(t\) 검정
자료를 보고 달을 고름 셰페 또는 튜키
여러 달을 비교 튜키(66쌍)

(나) 검정력을 보면 사전 지정의 가치가 드러난다.

월별 \(\delta\) 연환산 분산분석 사전 지정 \(t\)
0.5% 6.0% 0.136 0.352
1.0% 12.0% 0.468 0.850
2.0% 24.0% 0.981 1.000

1월을 미리 지목하면 검정력이 2.6배다(\(\delta=0.5\%\)에서 0.352 대 0.136). 자유도 1의 대비가 자유도 11의 전체 검정보다 훨씬 강력하다.

그런데 "1월"을 어떻게 미리 알았는가. 1월 효과는 1976년 논문에서 처음 보고된 것이고, 그 자료를 보고 고른 것이다. 후속 연구에서 1월을 지목하는 것은 정당하지만, 원 발견 자체는 준설의 결과일 수 있다.

계절 이상현상 문헌의 교훈 넷.

교훈 내용
표본 외 검증 발견 이후 기간에서 재현되는가
다른 시장 미국 외 시장에서도 나타나는가
경제적 설명 왜 그런지 메커니즘이 있는가
거래비용 후 매매 비용을 빼고도 남는가

1월 효과는 발견 이후 크게 약화되었다고 보고된다. 표본 외 검증에 실패한 전형이다.

\(\delta=0.5\%\)/월(연 6%)의 효과도 검정력이 0.35뿐이라는 것도 중요하다. 30년 자료로도 계절 효과를 신뢰성 있게 잡기 어렵다.

연습문제 9. 연습문제 3의 상황(펀드 하나 대 벤치마크 둘)을 구체적인 분석 계획으로 만들어라.

풀이

먼저 구조를 파악한다.

특징 이 상황
비교 대상 펀드 1개 대 벤치마크 2개
관심 비교 수 2개(벤치마크끼리는 관심 없음)
자료 구조 같은 기간을 공유(횡단면 상관)
대조군 벤치마크(둘)

연습문제 3의 답 — 더넷도 일원배치도 최선이 아니다.

방법 문제
일원배치 \(F\) "셋 중 어딘가 다르다"만 답함
더넷 대조군이 둘이라 표준 더넷이 맞지 않음
튜키 벤치마크끼리 비교까지 보호(낭비)
독립집단 가정 자체 같은 기간을 공유하므로 틀렸다

올바른 접근 — 초과수익률의 일표본 검정.

d1t = r_fund,t − r_bench1,t      (벤치마크 1 대비 초과)
d2t = r_fund,t − r_bench2,t      (벤치마크 2 대비 초과)

H0: E[d1] = 0   그리고   E[d2] = 0

왜 이것이 옳은가. 차이를 취하면

  1. 공통 시장 요인이 소거된다(연습문제 6)
  2. 각 검정이 자유도 \(T-1\)을 온전히 쓴다
  3. 해석이 직접적이다 — "벤치마크 대비 연 몇 %p"

분석 계획.

1. 자료 준비
   □ 같은 기간, 같은 빈도(월별)
   □ 배당·수수료 처리를 통일
   □ 결측 월 확인

2. 차이 계열 생성
   d1t, d2t 를 계산하고 시계열로 그린다

3. 가정 점검
   □ 자기상관 (더빈-왓슨, ACF) ← 가장 중요
   □ 정규성 (Q-Q, 치우침·첨도)
   □ 구조 변화 (누적 차이 그림)

4. 검정
   □ 자기상관이 없으면: 일표본 t 검정 × 2, 홀름 보정
   □ 자기상관이 있으면: HAC(뉴이-웨스트) 표준오차
   □ 두꺼운 꼬리면: 순열검정 또는 부트스트랩

5. 보고
   □ 연환산 초과수익률과 95% 구간
   □ 정보비율 (초과수익 / 추적오차)
   □ 검정력 한계 (연습문제 7)

홀름 보정을 쓰는 이유. 비교가 2개뿐이고 사전에 정해져 있으므로 더넷의 상관 이득이 미미하다. 홀름이 간단하고 본페로니를 지배한다.

더 나은 방법 — 팩터 모형.

\[ r_{ft}-r_{f,\text{risk-free}} =\alpha+\beta_1\text{MKT}_t+\beta_2\text{SMB}_t+\beta_3\text{HML}_t+\varepsilon_t \]

\(\alpha\)의 \(t\) 검정 하나로 끝난다. 벤치마크를 고를 필요도 없고, 위험 노출을 조정한 뒤의 초과수익을 직접 잰다.

초과수익률 \(t\) 검정 팩터 모형 \(\alpha\)
벤치마크 선택 필요 불필요
위험 조정 \(\beta=1\) 가정 추정
다중성 벤치마크 수만큼 하나
해석 "지수 대비" "위험 조정 후"

실무 권고. 벤치마크 비교와 팩터 알파를 둘 다 보고한다. 전자는 투자자에게 익숙하고, 후자는 통계적으로 엄밀하다.

검정력에 대한 정직한 진술. 연습문제 7에서 본 대로, 60개월 자료로는 연 10%p 이상의 차이만 확실히 잡는다. 보고서에

"본 분석의 검정력은 연 \(X\)%p 의 초과수익을 탐지하는 데 80%이며, 그보다 작은 차이는 유의하지 않아도 배제할 수 없다."

를 반드시 넣는다.

연습문제 10. 금융 자료에 분산분석을 적용할 때의 점검표를 만들어라.

풀이

핵심 수치 다섯.

사실 값
두꺼운 꼬리·GARCH의 영향 무해(0.045~0.053)
자기상관 \(\rho=0.2\)의 오류율 0.131
횡단면 상관의 오류율 0.0003
반복측정으로 바꿀 때 검정력 0.385 → 0.906
"가장 높은 달"을 고를 때 오류율 0.383

금융 자료의 특수성.

특징 분산분석에 미치는 영향
두꺼운 꼬리 거의 없음
변동성 군집 거의 없음
치우침 거의 없음
자기상관 오류율 2.6배
횡단면 상관 검정력 소멸
낮은 신호 대 잡음비 근본적 제약

통념과 반대로, 분포의 모양보다 상관 구조가 훨씬 중요하다.

점검표.

[설계]
  □ 비교 대상이 같은 기간을 공유하는가  →  반복측정/블록 설계
  □ 관심 비교가 몇 개인가  →  전체 F? 대조 비교? 모든 쌍?
  □ 검정력 계산 — 탐지 가능한 최소 차이는 얼마인가

[자료]
  □ 같은 기간·빈도·통화·배당 처리
  □ 생존 편향(survivorship bias) — 사라진 펀드가 빠졌는가
  □ 결측과 이상치(플래시 크래시 등)

[가정]
  □ 자기상관 (ACF, 더빈-왓슨)         ← 가장 중요
  □ 횡단면 상관 (전략 간 상관행렬)      ← 가장 중요
  □ 구조 변화 (기간을 나눠 재분석)
  □ 정규성은 마지막에 (대체로 무해)

[분석]
  □ 초과수익률 또는 팩터 조정 알파
  □ 반복측정 또는 블록 설계
  □ 자기상관이 있으면 HAC 표준오차
  □ 사후비교 보정

[보고]
  □ 효과크기(연환산 차이, 정보비율)와 구간
  □ 검정력의 한계를 명시
  □ 자료 준설 여부(사전 등록되었는가)
  □ 거래비용·세금 후에도 남는가

금융 특유의 함정 다섯.

함정 내용
자료 준설 여러 전략·기간·지표를 탐색한 뒤 최선을 보고
생존 편향 망한 펀드가 자료에서 빠져 성과가 부풀려짐
선견 편향 당시에 알 수 없던 정보를 쓰는 백테스트
횡단면 상관 무시 독립집단 분산분석으로 검정력 소멸
거래비용 무시 통계적으로 유의해도 실행 후 사라짐

첫 번째가 가장 심각하다. "가장 높은 달"을 고르면 오류율이 0.383인데, 실무에서는 수백 개의 전략·기간·지표를 탐색한다. 그 뒤의 \(p\)-값은 아무 의미가 없다.

대응 — 표본 외 검증.

1. 자료를 훈련/검증 기간으로 나눈다
2. 훈련 기간에서 가설을 만든다
3. 검증 기간에서 그 가설만 검정한다
4. 검증 기간을 다시 쓰지 않는다

4번이 어렵다. 한 번 실패하면 다시 탐색하고 싶어지는데, 그러면 검증 기간이 훈련 기간이 되어 버린다.

결론 표.

질문 권장 방법
여러 전략의 평균 수익률 비교 반복측정 분산분석 또는 팩터 알파
펀드 대 벤치마크 초과수익률 일표본 검정
계절 이상현상 전체 분산분석 + 사전 지정 대비
섹터 비교 팩터 조정 후 반복측정
국면별 전략 성과 이원배치(전략 × 국면), 교호작용

한 문장. 금융 자료에서 분산분석의 적은 비정규성이 아니라 상관 구조와 낮은 신호 대 잡음비이며, 둘 다 설계로만 다룰 수 있다.


정리하며

분산분석을 금융 자료에 적용할 때의 주의점들이다.

  • 전략별 수익률 비교가 전형적인 일원배치 문제다. \(H_0\) 은 모든 전략의 평균 수익률이 같다는 것이며, 요인이 둘이면(전략 × 시장국면) 이원배치가 된다.
  • 독립성 가정이 가장 먼저 깨진다. 월 수익률에는 자기상관이 있고, 같은 시점의 여러 전략은 시장 요인을 공유해 횡단면 상관을 갖는다. 7장의 유효표본크기 문제가 그대로 나타난다.
  • 등분산성도 대개 성립하지 않는다. 전략마다 변동성이 다르고 시기에 따라서도 달라지므로 웰치 판본이 안전하다.
  • 정규성 이탈이 심하다. 수익률은 꼬리가 두꺼우며, 5장의 금융위기 사례가 그 극단을 보여 준다.
  • 가장 큰 함정은 신호 대 잡음 비다. 7장에서 보았듯 기대수익률은 극도로 부정확하게 추정되므로, 분산분석이 기각하지 못한다고 전략들이 같다는 뜻은 아니다. 검정력이 애초에 낮다.

다음 절 사례 연구로 11장을 마무리한다.