자동매매 시스템을 개발하는 데 있어 가장 중요한 요소 중 하나는 데이터 분석입니다. 주가 데이터를 분석하여 적절한 매매 신호를 생성하려면 다양한 기법이 필요합니다. 그 중 가장 기본적이고 널리 사용되는 기법 중 하나는 이동평균입니다. 이번 글에서는 파이썬의 Pandas 라이브러리를 사용하여 주가 이동평균을 계산하고, 이를 자동매매 시스템에 적용하는 방법에 대해 자세히 설명하겠습니다.
1. 이동평균이란?
이동평균(Moving Average)은 일정 기간 동안의 주가 평균을 계산하여 주가의 흐름을 부드럽게 나타내는 기법입니다. 주가의 변동성이 심할 때, 그 추세를 식별하는 데 유용합니다.
- 단순 이동평균(SMA): 일정 기간의 과거 주가를 단순히 평균하여 계산합니다.
- 지수 이동평균(EMA): 과거 주가에 가중치를 두고 더 최근의 주가에 더 많은 가중치를 부여하여 계산합니다.
주로 SMA와 EMA를 사용하여 매매 신호를 생성합니다. 이번 강좌에서는 SMA를 중심으로 다루겠습니다.
2. 파이썬 및 Pandas 설치하기
먼저, 파이썬과 Pandas를 설치해야 합니다. Anaconda를 사용하면 편리하게 설치할 수 있습니다. 설치가 완료되면, 다음과 같은 기본 설정을 합니다:
pip install pandas matplotlib yfinance
3. 주가 데이터 가져오기
여기서는 Yahoo Finance API를 사용하여 주가 데이터를 가져옵니다. 이를 위해 yfinance 라이브러리를 사용할 수 있습니다.
import yfinance as yf
# 애플 주가 데이터 가져오기 (예: 2020년 1월 1일부터 최근까지)
data = yf.download('AAPL', start='2020-01-01', end='2023-12-31')
print(data.head())
4. 이동평균 계산하기
이제 주가 데이터가 준비되었으니, 이동평균을 계산해보겠습니다. Pandas는 이동평균 계산을 위한 간단한 메서드를 제공합니다.
import pandas as pd
# 20일 이동평균 계산
data['SMA_20'] = data['Close'].rolling(window=20).mean()
# 50일 이동평균 계산
data['SMA_50'] = data['Close'].rolling(window=50).mean()
print(data[['Close', 'SMA_20', 'SMA_50']].tail())
5. 이동평균 차트 그리기
이제 matplotlib 라이브러리를 사용하여 이동평균 차트를 그려보겠습니다. 이를 통해 주가와 이동평균의 관계를 시각적으로 확인할 수 있습니다.
import matplotlib.pyplot as plt
plt.figure(figsize=(14,7))
plt.plot(data['Close'], label='AAPL Close Price', color='blue', alpha=0.5)
plt.plot(data['SMA_20'], label='20-Day SMA', color='orange', alpha=0.75)
plt.plot(data['SMA_50'], label='50-Day SMA', color='green', alpha=0.75)
plt.title('Apple Stock Price and Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.show()
6. 매매 신호 생성하기
이동평균을 이용한 매매 신호를 생성할 수 있습니다. 일반적으로 단기 이동평균이 장기 이동평균을 상향 돌파할 때 매수 신호로, 하향 돌파할 때 매도 신호로 설정합니다.
data['Signal'] = 0.0 # 초기 신호를 0으로 설정
# 매수 신호
data['Signal'][20:] = np.where(data['SMA_20'][20:] > data['SMA_50'][20:], 1.0, 0.0)
# 매도 신호
data['Position'] = data['Signal'].diff() # 포지션 변화 확인
plt.figure(figsize=(14,7))
plt.plot(data['Close'], label='Close Price', color='blue', alpha=0.5)
plt.plot(data['SMA_20'], label='20-Day SMA', color='orange', alpha=0.75)
plt.plot(data['SMA_50'], label='50-Day SMA', color='green', alpha=0.75)
# 매수 신호 표시
plt.plot(data[data['Position'] == 1].index,
data['SMA_20'][data['Position'] == 1],
'^', markersize=10, color='g', lw=0, label='Buy Signal')
# 매도 신호 표시
plt.plot(data[data['Position'] == -1].index,
data['SMA_20'][data['Position'] == -1],
'v', markersize=10, color='r', lw=0, label='Sell Signal')
plt.title('Buy & Sell Signals')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.show()
7. 자동매매 시스템 구현하기
이제 간단한 자동매매 시스템을 구현해보겠습니다. 매수 및 매도 신호가 발생할 때, 매수를 할지 매도할지를 결정하는 로직을 추가합니다. 이 예제에서는 가상의 자금 10,000달러를 사용하여 매매를 수행한다고 가정합니다.
initial_capital = 10000
shares = 0
cash = initial_capital
for i in range(len(data)):
if data['Position'][i] == 1: # 매수 신호
shares = cash // data['Close'][i] # 구매할 주식 수 계산
cash -= shares * data['Close'][i] # 자산에서 주식 구매 비용 차감
elif data['Position'][i] == -1: # 매도 신호
cash += shares * data['Close'][i] # 자산에 주식 판매 수익 추가
shares = 0 # 모든 주식 매도
final_value = cash + shares * data['Close'].iloc[-1] # 최종 자산 계산
print(f'Initial Capital: ${initial_capital} -> Final Value: ${final_value}')
8. 성과 분석
자동매매 시스템의 성과를 분석하기 위해, 최종 수익률과 승률을 계산해볼 수 있습니다. 아래 코드는 이 시스템을 통한 성과를 평가하는 간단한 방법입니다.
trades = data['Position'].diff() # 매매 신호 확인
successful_trades = trades[trades == 1].count() # 매도 신호 카운트
win_trades = trades[trades == -1].count() # 매수 신호 카운트
win_ratio = (successful_trades / (successful_trades + win_trades)) * 100
print(f'Total Trades: {successful_trades + win_trades}, Winning Trades: {successful_trades}, Win Ratio: {win_ratio}%')
9. 결론
이번 강좌에서는 파이썬의 Pandas 라이브러리를 사용하여 주가 이동평균을 계산하고, 이를 기반으로 매매 신호를 생성하고 간단한 자동매매 시스템을 구현해 보았습니다. 이동평균은 기본적인 기법이지만, 이를 적절히 활용하여 더 복잡한 자동매매 전략으로 발전시킬 수 있습니다. 향후에는 지수 이동평균(EMA)이나 다른 기술적 지표를 활용한 전략도 고려해보면 좋습니다. 그럼 여러분의 성공적인 자동매매를 기원합니다!