Tag-Archive for » 시스템 트레이딩 «

Sunday, February 14th, 2010 | Author: salbang

HTS에서 기본적으로 가격 Smoothing을 위해 제공하는 Low-pass(저역 통과) 디지털 필터에는 다음과 같은 3가지가 있다.

  1. 단순 이동 평균, y[n] := \sum_{k=0}^{L-1} \frac{1}{L}x[n-k].
  2. 가중 이동 평균, y[n] := \sum_{k=0}^{L-1}w_k x[n-k], where w_k = \frac{L-k}{\sum_{m = 1}^L m}.
  3. 지수 이동 평균, y[n] := (1-\alpha) y[n-1] + \alpha x[n], where \alpha = \frac{2}{L+1}.

이 글에서는 각 이동 평균 별로 주파수 도메인에서 어떤 특성을 갖고 있는지에 대해서 얘기해 보려 한다.

약간의 신호처리 기본에 대해 얘기하자면 위와 같은 입출력 관계는 다음과 같은 콘볼루션 식으로 나타낼 수 있다.

a*y[n] = b*x[n], where h*x[n] := \sum_{k = -\infty}^{\infty} h[k]\times x[n-k].

그리고 위와 같은 LTI(Linear Time Invariant) 시스템의 z 도메인에서의 응답(Response) H(z) := \frac{Y(z)}{X(z)}은 다음과 같다.

H(z) = \frac{\sum_{k=-\infty}^{\infty} b_k z^{-k}}{\sum_{k=-\infty}^{\infty} a_k z^{-k}}.

이 시스템의 주파수 응답은 H(e^{j\omega}), where j = \sqrt{-1}로 정의 된다. 이 주파수 응답의 의미는 위 시스템(T)에 복소 주기 수열(고유 벡터) x[n] := e^{j\omega n}이 입력으로 인가됐을 때의 출력에 대한 고유값(T\{e^{j\omega n}\} = H(e^{j\omega})e^{j\omega n}을 의미한다.

이제 각 이동 평균 별로 주파수 응답에 대해서 보자. Magnitude Response (진폭 응답?), |H(e^{j\omega})|을 보도록 하겠다. L = 4를 사용하도록 하겠다. -6 dB에 빨간 직선을 그은 것은 그 지점이 진폭이 반(20\log_{10}0.5 \approx -6)이 되는 지점으로 여길 기준으로 주파수가 Cut-off 되는 것으로 판단한다.

먼저 단순이동평균 : y[n] = \frac{1}{4}x[n] +\frac{1}{4}x[n-1] + \frac{1}{4}x[n-2] + \frac{1}{4}x[n-3].

단순 이동 평균의 진폭 및 위상 응답

x축은 Normalized Frequency라고 해서 Radian값을 \pi로 나눈 값이다. 각주파수로 생각하면 되는데 1이 의미하는 바는 \pi 즉 반주기(2\pi/2)인데 이는 Nyquist frequency 때문에 차트 상에서 2개의 Bar를 의미한다고 보면 된다. 위 그림에서 보면 알겠지만 0.5와 1에서 진폭 응답이 0(-\inftydB)임을 볼 수 있다. 즉 단순 이동평균은 4개 Bar(1/0.5 \times 2) 및 2개 Bar(1/1 \times 2)의 주기를 갖는 데이터는 완전히 날려 버리는 성질을 갖고 있다. 물론 이 필터를 사용하는 목적은 Low pass, 즉 낮은 주파수의 데이터를 통과시키는 것이기는 하지만 4일 이동 평균에서 2일 및 4일 주기의 정보를 완전히 날려버리는 것은 의도하지는 않았을 것이다. Cut-off 주기는 대략 봤을 때 0.3 \pi radian, 즉 1/0.3*2= 6.67 Bars 정도 되는 것을 알 수 있다.

다음으로 가중 이동평균 y[n] = \frac{4}{10}x[n] +\frac{3}{10}x[n-1] + \frac{2}{10}x[n-2] + \frac{1}{10}x[n-3]의 주파수 응답을 보자.

가중이동평균의 진폭 및 위상 응답

다행이 이 필터는 4 Bars 및 2 Bars의 주기를 갖는 정보를 완전히 날려버리지는 않는 것을 볼 수 있다. Cut-off 주기는 약 0.35 \pi radian, 즉 5.71 Bars 정도 되는 것을 알 수 있다.

이번에는 지수 이동 평균 y[n] = 0.6y[n-1] + 0.4x[n] (\alpha = 2/(4+1) = 0.4)을 보도록 하자.

지수이동평균의 진폭 및 위상 응답

전체적으로 가중이동평균과 비슷한 모습을 보이나 가중 이동평균과 같은 출렁임은 없다. Cut-off 주기는 약 0.29 \pi radian, 즉 6.9 Bars 정도 되는 것을 알 수 있다. 가중이동평균에 비교하면 주파수를 좀 일찍부터 자르는 경향이 있는 것을 볼 수 있다.

각 이동평균별로 다른 주파수 응답 특성을 보이는데 어떤 디지털필터를 사용할지 판단하는데 위와 같은 분석이 도움이 되었으면 한다.

각 이동 평균들이 얼마나 빠르게 시세를 따라가는지를 보려면 위상응답을 분석해야 하는데 이는 다음에 얘기하도록 하겠다.

위 그림을 그리기 위해 사용한 매틀랩 코드는 다음과 같다.

L = 4;
% Simple Moving Average
b1 = ones(L, 1)/L;
figure;
freqz(b1);
hold on
plot(0:0.01:1, -6*ones(size(0:0.01:1)), ‘r’);

% Weighted Moving Average
b2 = (L:-1:1)/sum(L:-1:1);
figure;
freqz(b2);
hold on
plot(0:0.01:1, -6*ones(size(0:0.01:1)), ‘r’);

% Exponentially Weighted Moving Average
alpha = 2/(L+1);
b3 = [alpha];
a3 = [1, -(1-alpha)];
figure;
freqz(b3, a3);
hold on;
plot(0:0.01:1, -6*ones(size(0:0.01:1)), ‘r’);


덧 : 그런데 좀더 공부해 보니 단순 이동평균의 4일/2일 주기를 완전히 날려버리는 성질도 좋네요. 리플이 커서 그렇지. 이런 부분은 Elliptic Filter나 Chebyshev Type II 필터 아니면 원하는 스펙으로 디자인한  FIR필터를 사용하여 개선할 수 있습니다.