개념
피보나치 수열과 황금비율
피보나치 수열은 이탈리아의 수학자 레오나르도 피보나치가 1202년에 발표한 수열로, 0과 1로 시작하며 이후에 나오는 수는 바로 앞의 두 수를 더한 값이 된다. 즉, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … 와 같은 수열이 만들어진다. 이 수열에서 놀라운 점은 인접한 두 수의 비율이 특정한 값으로 수렴한다는 것이다. 이 값을 황금비율 또는 황금 평균이라고 하며, 약 1.618이다. 반대로 작은 수를 큰 수로 나눈 값은 0.618에 가깝다. 이 비율은 자연계와 예술, 건축 등 다양한 분야에서 발견되며, 조화롭고 아름다운 비율로 여겨진다.
피보나치 되돌림은 주가 차트에서 추세의 반전이나 조정을 예측하기 위해 사용되는 기법이다. 이는 상승 추세나 하락 추세에서 주가가 되돌아오는 지점을 피보나치 비율로 계산하여 예측한다. 일반적으로 사용되는 피보나치 되돌림 비율은 23.6%, 38.2%, 50%, 61.8%이다. 이 비율들은 피보나치 수열에서 발견되는 황금비율과 관련이 있다.
피보나치 되돌림을 이용한 매매 전략
피보나치 되돌림을 이용한 매매 전략은 주가가 추세를 되돌릴 때 진입하는 것이다. 상승 추세에서는 피보나치 되돌림 지점에서 매수하고, 하락 추세에서는 피보나치 되돌림 지점에서 매도하는 것이 기본 전략이다.
구체적인 매매 규칙은 다음과 같다.
- 상승 추세에서 주가가 고점에서 38.2% 되돌림 지점까지 내려오면 매수한다.
- 매수 후 주가가 이전 고점을 돌파하면 매도하고 수익을 실현한다.
- 만약 주가가 매수 지점에서 더 내려가 50% 되돌림 지점을 돌파하면 손절매한다.
- 하락 추세에서는 반대로 주가가 저점에서 50% 되돌림 지점까지 올라가면 매도한다.
- 매도 후 주가가 이전 저점을 돌파하면 매수하고 수익을 실현한다.
- 만약 주가가 매도 지점에서 더 올라가 61.8% 되돌림 지점을 돌파하면 손절매한다.
이 전략은 피보나치 되돌림 지점을 활용하여 추세 반전을 예측하고 매매 타이밍을 결정하는 것이 핵심이다. 하지만 실제 시장에서는 이 지점에서 반드시 반전이 일어나는 것은 아니므로, 다른 기술적 지표나 거시경제 지표 등을 함께 고려하여 의사결정을 내리는 것이 중요하다.
피보나치 되돌림 매매 전략의 파이썬 코드 구현
다음은 피보나치 되돌림 매매 전략을 파이썬으로 구현한 코드 예시이다. 야후 파이낸스에서 VOO ETF의 데이터를 가져와 피보나치 되돌림 지점을 계산하고, 이를 기반으로 매매 신호를 생성한다. 그리고 이 전략을 백테스팅하여 수익률을 계산한다. 마지막으로 주가 차트와 피보나치 되돌림 지점을 시각화한다.
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# VOO ETF 데이터 가져오기
data = yf.download('VOO', start='2010-01-01', end='2023-05-31')
# 피보나치 되돌림 비율 설정
fibonacci_ratios = [0.236, 0.382, 0.5, 0.618]
# 고점과 저점 찾기
def find_high_low(data, lookback):
high = data.Close.rolling(lookback).max()
low = data.Close.rolling(lookback).min()
return high, low
# 피보나치 되돌림 지점 계산
def fibonacci_retracements(data, high, low):
diff = high - low
levels = []
for ratio in fibonacci_ratios:
level = high - diff * ratio
levels.append(level)
return levels
# 백테스팅
def backtest(data, lookback, investment):
high, low = find_high_low(data, lookback)
data['High'] = high
data['Low'] = low
data['Fib_236'] = np.nan
data['Fib_382'] = np.nan
data['Fib_50'] = np.nan
data['Fib_618'] = np.nan
data['Signal'] = 0
for i in range(lookback, len(data)):
if data['Close'][i] > data['High'][i-1]:
levels = fibonacci_retracements(data[i-lookback:i], data['High'][i-1], data['Low'][i-1])
data.iloc[i, data.columns.get_loc('Fib_236')] = levels[0]
data.iloc[i, data.columns.get_loc('Fib_382')] = levels[1]
data.iloc[i, data.columns.get_loc('Fib_50')] = levels[2]
data.iloc[i, data.columns.get_loc('Fib_618')] = levels[3]
if data['Close'][i] <= levels[1]:
data.iloc[i, data.columns.get_loc('Signal')] = 1
elif data['Close'][i] < data['Low'][i-1]:
levels = fibonacci_retracements(data[i-lookback:i], data['High'][i-1], data['Low'][i-1])
data.iloc[i, data.columns.get_loc('Fib_236')] = levels[3]
data.iloc[i, data.columns.get_loc('Fib_382')] = levels[2]
data.iloc[i, data.columns.get_loc('Fib_50')] = levels[1]
data.iloc[i, data.columns.get_loc('Fib_618')] = levels[0]
if data['Close'][i] >= levels[2]:
data.iloc[i, data.columns.get_loc('Signal')] = -1
data['Position'] = data['Signal'].shift(1)
data['Returns'] = data['Close'].pct_change()
data['Strategy_Returns'] = data['Position'] * data['Returns']
data['Cumulative_Returns'] = (1 + data['Strategy_Returns']).cumprod()
data['Benchmark_Returns'] = investment * data['Cumulative_Returns'][-1]
return data
# 백테스팅 실행
lookback = 50
investment = 10000
result = backtest(data, lookback, investment)
# 결과 출력
print(f'초기 투자금: ${investment:,.0f}')
print(f'최종 수익금: ${result["Benchmark_Returns"][-1]:,.0f}')
# 차트 그리기
plt.figure(figsize=(12,8))
plt.plot(result['Close'], label='VOO')
plt.plot(result['Fib_236'], label='23.6%', linestyle='--', alpha=0.5)
plt.plot(result['Fib_382'], label='38.2%', linestyle='--', alpha=0.5)
plt.plot(result['Fib_50'], label='50%', linestyle='--', alpha=0.5)
plt.plot(result['Fib_618'], label='61.8%', linestyle='--', alpha=0.5)
plt.legend()
plt.show()
위 코드에서는 먼저 야후 파이낸스를 통해 VOO ETF의 데이터를 가져온다. 그리고 find_high_low
함수를 통해 50일 동안의 고점과 저점을 찾는다. fibonacci_retracements
함수는 고점과 저점을 이용해 피보나치 되돌림 지점을 계산한다.
backtest
함수에서는 피보나치 되돌림 지점을 기반으로 매매 신호를 생성한다. 상승 추세에서는 38.2% 되돌림 지점 이하에서 매수 신호를, 하락 추세에서는 50% 되돌림 지점 이상에서 매도 신호를 생성한다. 이렇게 생성된 매매 신호를 바탕으로 수익률을 계산하고, 최종적으로 초기 투자금 대비 최종 수익금을 출력한다.
마지막으로 matplotlib
을 이용해 VOO ETF의 주가 차트와 피보나치 되돌림 지점을 시각화한다. 이를 통해 피보나치 되돌림 매매 전략이 어떻게 작동하는지 직관적으로 이해할 수 있다.