파이썬 자동매매 개발, pandas DataFrame

최근 들어 파이썬을 활용한 자동매매 시스템 개발이 활발히 이루어지고 있습니다.
그 중에서도 데이터 분석 및 처리를 위한 pandas 라이브러리는 많은 트레이더와 개발자들 사이에서 필수적으로 사용되고 있습니다.
본 글에서는 파이썬을 이용한 자동매매 개발 과정에서 어떻게 pandas DataFrame을 활용하여 효율적인 데이터 분석과 전략 개발을 할 수 있는지에 대해 자세히 설명하겠습니다.

1. 자동매매 시스템의 이해

자동매매 시스템(Automated Trading System, ATS)은 설정된 알고리즘에 따라 자동으로 매매를 수행하는 시스템입니다.
이러한 시스템은 알고리즘 트레이딩(Algorithmic Trading)의 일환으로 사용되며, 빠르고 정확한 매매 결정을 내릴 수 있는 장점이 있습니다.
자동매매 시스템의 기본 구성 요소는 다음과 같습니다:

  • 데이터 수집: 시장 데이터(가격, 거래량 등)를 수집하는 과정
  • 전략 개발: 수집된 데이터를 분석하여 매매 전략을 수립하는 과정
  • 매매 실행: 개발된 전략에 따라 매매를 자동으로 수행하는 과정
  • 성과 분석: 매매 결과를 분석하여 전략의 유효성을 검증하는 과정

2. pandas 라이브러리 소개

pandas는 파이썬에서 데이터 분석을 위한 강력한 라이브러리입니다.
주로 구조화된 데이터(표 형식의 데이터)를 처리하는 데 매우 효과적이며, 시계열 데이터나 통계적 데이터 분석에 특히 유용합니다.
pandas의 핵심 데이터 구조인 DataFrame은 2차원 테이블 형태를 가지고 있어 데이터를 행과 열로 쉽게 조작하고 분석할 수 있습니다.

2.1 DataFrame 생성

DataFrame은 다양한 방식으로 생성할 수 있습니다. 가장 일반적인 방법은 딕셔너리와 리스트를 사용하는 것입니다.
다음은 간단한 예제를 통해 DataFrame을 생성하는 방법을 보여드립니다.

        
import pandas as pd

# 데이터 준비
data = {
    '날짜': ['2023-01-01', '2023-01-02', '2023-01-03'],
    '종가': [1000, 1010, 1020],
    '거래량': [150, 200, 250]
}

# DataFrame 생성
df = pd.DataFrame(data)
# 날짜 열을 datetime 형식으로 변환
df['날짜'] = pd.to_datetime(df['날짜'])
print(df)
        
    

위 코드를 실행하면 다음과 같은 DataFrame이 생성됩니다:

        
        날짜                 종가    거래량
        0 2023-01-01  1000    150
        1 2023-01-02  1010    200
        2 2023-01-03  1020    250
        
    

2.2 DataFrame 기본 조작

생성한 DataFrame에 대해 기본적인 조작을 해보겠습니다.
pandas는 데이터의 필터링, 정렬, 그룹화 등의 다양한 기능을 제공합니다.

필터링

특정 조건에 맞는 데이터를 필터링할 수 있습니다. 예를 들어, 종가가 1010 이상인 데이터만 출력해 보겠습니다.

        
filtered_df = df[df['종가'] >= 1010]
print(filtered_df)
        
    

실행 결과는 다음과 같습니다:

        
        날짜                 종가   거래량
        1 2023-01-02  1010    200
        2 2023-01-03  1020    250
        
    

정렬

데이터를 특정 열을 기준으로 정렬할 수도 있습니다. 종가를 기준으로 내림차순 정렬해 보겠습니다.

        
sorted_df = df.sort_values(by='종가', ascending=False)
print(sorted_df)
        
    

결과는 다음과 같습니다:

        
        날짜                 종가    거래량
        2 2023-01-03  1020    250
        1 2023-01-02  1010    200
        0 2023-01-01  1000    150
        
    

그룹화

데이터의 그룹화는 통계적 분석이 필요할 때 유용합니다. 거래량의 합계를 계산해 보겠습니다.

        
grouped_df = df.groupby('날짜')['거래량'].sum().reset_index()
print(grouped_df)
        
    

출력 결과는 다음과 같습니다:

        
        날짜                거래량
        0 2023-01-01  150
        1 2023-01-02  200
        2 2023-01-03  250
        
    

3. 자동매매 전략 개발

이제 본격적으로 pandas를 활용하여 자동매매 전략을 개발해 보겠습니다.
기본적인 매매 전략 중 하나로 이동평균 전략(Moving Average Strategy)을 예로 들어 설명하겠습니다.
이동평균은 특정 기간 동안의 평균 가격을 계산하여 주가의 추세를 파악하는 데 사용됩니다.

3.1 이동평균 계산

이동평균을 계산하기 위해 pandas의 rolling 함수를 활용합니다.
단기 이동평균과 장기 이동평균을 계산하여 교차점을 기준으로 매매 신호를 생성할 것입니다.

        
# 단기(5일) 및 장기(20일) 이동평균 계산
df['단기 이동평균'] = df['종가'].rolling(window=5).mean()
df['장기 이동평균'] = df['종가'].rolling(window=20).mean()
print(df)
        
    

이 코드를 통해 생성된 DataFrame에는 단기 및 장기 이동평균 열이 추가됩니다.

3.2 매매 신호 생성

이동평균을 기반으로 매매 신호를 생성하는 방법은 다음과 같습니다.
단기 이동평균이 장기 이동평균을 상향 돌파하면 매수 신호, 하향 돌파하면 매도 신호로 설정하겠습니다.

        
def signal_generator(df):
    if df['단기 이동평균'][-1] > df['장기 이동평균'][-1]:
        return "BUY"
    elif df['단기 이동평균'][-1] < df['장기 이동평균'][-1]:
        return "SELL"
    else:
        return "HOLD"

# 예시 데이터에 대한 매매 신호 생성
signal = signal_generator(df)
print("매매 신호:", signal)
        
    

위 코드를 실행하면 매매 신호를 출력합니다.
신호를 토대로 매매를 실행하는 로직을 추가할 수 있습니다.

4. 성과 분석 및 백테스트

자동매매 전략의 성과를 분석하기 위해서는 백테스트(Backtest)를 수행해야 합니다.
이를 통해 전략의 유효성을 검증하고 실제 거래에서의 성과를 예상할 수 있습니다.
백테스트는 주어진 과거 데이터를 기반으로 전략을 테스트하는 과정을 의미합니다.

4.1 백테스트 구현

간단한 백테스트 로직을 구현해 보겠습니다.
매수 신호가 발생할 경우 주식을 구매하고, 매도 신호가 발생할 경우 주식을 판매하는 기본적인 로직입니다.

        
initial_balance = 10000  # 초기 자본
balance = initial_balance
position = 0  # 보유 주식 수

for index, row in df.iterrows():
    if signal_generator(df.iloc[:index+1]) == "BUY":
        position += balance // row['종가']  # 가능한 만큼 구매
        balance -= position * row['종가']
    elif signal_generator(df.iloc[:index+1]) == "SELL" and position > 0:
        balance += position * row['종가']  # 보유 주식 모두 판매
        position = 0
        
final_balance = balance + (position * df['종가'].iloc[-1])  # 최종 자산
print("최종 자산:", final_balance)
        
    

이 코드를 통해 최종 자산을 계산할 수 있으며, 초기 자본과의 비교를 통해 전략의 성과를 평가할 수 있습니다.

5. 결론

자동매매 개발에 있어 pandas DataFrame을 활용한 데이터 분석은 매우 중요합니다.
본 글에서는 pandas의 기본적인 활용 방법과 함께 이동평균 기반의 자동매매 전략을 개발하는 과정을 살펴보았습니다.
pandas를 활용하여 데이터 조작 및 분석을 효율적으로 수행함으로써 더욱 발전된 자동매매 시스템을 구축할 수 있습니다.
또한, 이러한 시스템은 기존 트레이딩 전략을 개량하거나 새로운 전략을 개발하는 데 큰 도움을 줄 것입니다.
앞으로 더 깊이 있는 금융 데이터 분석과 자동화 전략 개발에 대한 연구를 통해 더욱 정교한 자동매매 시스템을 구축하길 바랍니다.

저자: 조광형

날짜: 2024년 11월 26일