본문 바로가기

Python/Investment

Python으로 Envelope 계산 및 차트 생성

반응형

Python으로 Envelope 계산 및 차트 생성

이번 포스트에서는 Python으로 주식 보조지표 중 하나인 엔벨로프(Envelope)에 대해서 알아보고자 한다.
엔벨로프가 무엇인지 간단하게 알아보고 Python으로 계산 및 차트를 생성해 보자.

목차

엔벨로프(Envelope/봉투선)란?

✔ 보조 지표 Envelope

엔벨로프는 주가의 움직임에 따라 그 주위에 형성되는 두 개의 경계선으로 구성된 보조 지표이다.
이 지표는 주로 주식의 과매수나 과매도 상태를 판별하는 데 사용된다.
주가가 상위 경계선을 초과하면 과매수로 간주되며, 하위 경계선 아래로 떨어지면 과매도로 간주한다.

"Envelope"는 영어로 "봉투"를 의미하는데, 주가를 중심으로 위아래로 두 개의 경계선이 형성되어 주가의 움직임을 둘러싸는 봉투와 같은 형태를 띄기 때문이다.
이 두 경계선은 주가의 일정 비율만큼 상하로 이동한 선을 의미하므로, 주가의 움직임을 봉투처럼 감싸는 모습을 보이게 된다.


하얀색 라인이 Envelope 저항/지지선, 보라색이 중심선


엔벨로프의 매매 활용 방법은 아래 포스트에서 확인 부탁드린다.

엔벨로프 계산 방법

엔벨로프의 계산은 간단한 편이다.
주로 이동평균선 (Moving Average, MA)을 기반으로 하며, 상위 경계선과 하위 경계선은 주어진 비율만큼 이동평균선에서 상하로 이동한 선을 의미한다.


✔ \(n\)일 기간동안의 이동평균 계산

\( \text{MA}(n) = \frac{\sum_{i=1}^{n} \text{종가}_i}{n} \)


✔ Envelope 저항(Upper Envelope)

상위 경계선은 이동평균선에 주어진 비율(\(p\)%)를 더한 값으로 계산한다.

\( \text{Upper Envelope} = \text{MA}(n) \times (1 + \frac{p}{100}) \)


✔ Envelope 지지(Lower Envelope)

하위 경계선은 이동평균선에서 주어진 비율(\(p\)%)를 뺀 값으로 계산한다.

\( \text{Lower Envelope} = \text{MA}(n) \times (1 - \frac{p}{100}) \)


여기서 \(p\)는 사용자가 설정하는 값으로, 주로 1% ~ 10% 사이의 값을 사용한다.
\(p\)의 값에 따라 Envelope의 너비가 결정되며, 이 값은 개별 주식이나 시장 상황에 따라 조절될 수 있다.

이렇게 계산된 Envelope는 주가 차트에 표시되어 주가의 움직임을 감싸는 봉투와 같은 형태를 나타낸다.
이를 통해 트레이더들은 주가의 과매수나 과매도 상태를 판별하고 거래 전략을 세울 수 있다.

Python으로 엔벨로프 계산

그럼 이제 엔벨로프 계산 방법에 맞춰서 Python으로 계산해보자.
우선 샘플 데이터는 아래와 같으며, pandas와 차트 생성을 위해 matplotlib를 import 해주고 시작하겠다.
엔벨로프에서는 종가가 필요하며, 샘플 데이터에서 close가 종가 데이터이다.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter

df = pd.read_csv('../TEST.csv')
df['date'] = pd.to_datetime(df['date'])

샘플 데이터


✔ 이동평균 계산

이동평균을 구하는 방법은 pandas의 rolling 메서드를 사용하면 간단하게 구할 수 있다.

# 이동평균 계산
window_size = 20
df['20D_MA'] = df['close'].rolling(window=window_size).mean()

rolling 메서드에 관련해서는 아래 포스트를 참고 부탁드린다.


✔ Envelope 계산

이동평균을 계산했다면, 이제 엔벨로프를 쉽게 계산할 수 있다.
여기서 \(p\)는 0.025(2.5%)를 사용하겠다.

# Envelope 계산
envelope_percentage = 0.025
df['Upper_Envelope'] = df['20D_MA'] * (1 + envelope_percentage)
df['Lower_Envelope'] = df['20D_MA'] * (1 - envelope_percentage)

엔벨로프는 이렇게가 끝이다.
생각보다 너무 간단해서 좋은 것 같다.

Python으로 엔벨로프 차트 구현

그럼 이제 계산된 엔벨로프로 차트를 생성해보자.
차트에는 종가선 차트와 함께 구현해보았다.
x-axis는 date 컬럼 기준 년/월 형식으로 변경했다.
엔벨로프는 종가선 차트와의 구분을 위해 라인 스타일을 '--'로 적용해보자.


✔ Envelope 차트 생성

# Envelope 차트
plt.figure(figsize=(14, 7))
plt.plot(df['date'], df['close'], label='Close', color='black', linewidth=1)
plt.plot(df['date'], df['Upper_Envelope'], label='Upper Envelope', color='#FF1493', linestyle='--')
plt.plot(df['date'], df['Lower_Envelope'], label='Lower Envelope', color='#1E90FF', linestyle='--')
plt.title('Close Price with Envelopes')
plt.xlabel('Date')
plt.ylabel('Price')

# x-axis 설정: 월 단위로 YYYY-MM 형식으로 설정
ax = plt.gca()
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)

plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

위 코드를 실행하면 아래와 같은 차트를 출력할 수 있다.


p = 2.5% Envelope 차트



엔벨로프 차트도 다소 간단하게 구현이 가능한데, \(p\)를 10%로 값을 변경한 차트도 한 번 생성해 보자.
엔벨로프 계산하는 코드에서 envelope_percentage를 0.1로만 변경하면 된다.

# p = 10% 기준 Envelope
envelope_percentage = 0.1
df['Upper_Envelope'] = df['20D_MA'] * (1 + envelope_percentage)
df['Lower_Envelope'] = df['20D_MA'] * (1 - envelope_percentage)

# 차트 생성
plt.figure(figsize=(14, 7))
plt.plot(df['date'], df['close'], label='Close', color='black', linewidth=1)
plt.plot(df['date'], df['Upper_Envelope'], label='Upper Envelope', color='#FF1493', linestyle='--')
plt.plot(df['date'], df['Lower_Envelope'], label='Lower Envelope', color='#1E90FF', linestyle='--')
plt.title('Close Price with Envelopes')
plt.xlabel('Date')
plt.ylabel('Price')

ax = plt.gca()
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)

plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

위 코드를 실행하면 아래와 같은 차트를 생성한다.


p = 10% Envelope 차트


\(p\)를 2.5%로 설정한 엔벨로프에 비해 \(p\)가 10% 엔벨로프의 차트는 저항선과 지지선의 너비 넓어진 것을 볼 수 있다.

이렇게 해서 엔벨로프에 대해서 간단하게 알아보고, Python으로 엔벨로프를 계산 및 차트를 생성하는 방법에 대해서 알아보았다.
필자의 경우 주식 투자를 처음 시작했을 때 엔벨로프를 활용한 매매를 자주 했었던 기억이 있다.
최근에는 자주 사용하지는 않지만 이렇게 공부해 본 김에 기회가 된다면 엔벨로프로 매매를 다시 해봐야겠다.

커피 한 잔으로
저를 응원해주세요!
반응형

loading