Search

24.08.27 간단하지만 효과적인 시작: 주가 데이터의 산점도 분석

본 글은 데이터 분석 방법론을 설명하기 위해 작성되었으며, 어떠한 형태로도 투자 권유를 목적으로 하지 않습니다. 제공된 분석 기술은 수익을 보장하지 않으며, 본 글에 언급된 어떠한 종목도 투자를 권유하는 것이 아님을 명시합니다. 분석 내용의 적용으로 인한 모든 결과에 대한 책임은 독자 본인에게 있습니다.
오늘 수행하는 분석을 수행하기 위해서는 StartUP QUANT의 Class 04까지 완료가 되어 있어야 합니다.
간단하지만 효과적인 시작: 주가 데이터의 산점도 분석
오늘은 삼성전자 주가 데이터를 활용하여 간단한 산점도 분석을 시도해보려고 합니다. ‘Simple is best’라는 원칙에 따라, 복잡한 모델을 구축하기 전에, 기본적인 시각화 분석부터 시작하는 것이 중요합니다.
분석 시나리오:
목적: 삼성전자 주가의 60일 전 변동률이 60일 후의 주가 변화에 미치는 영향을 파악합니다.
방법: 삼성전자의 60일 전 대비 현재의 주가 변동률과 60일 후의 주가 변동률을 비교하여 산점도로 나타냅니다.
이 분석을 통해 주가 변동의 패턴을 식별하고, 향후 투자 결정에 도움이 될 수 있는 초기 통찰을 얻을 수 있습니다. 이는 트레이더들에게 매우 유용한 정보를 제공할 것입니다.

데이터 구성 로직

삼성전자의 과거부터 현재까지 주가 데이터를 가져와, 레코드 별로 다음과 같은 데이터를 구성합니다.
일자별 주가 정보와
Change from 60 days ago: 60일 이전 대비 현재 종가 등락률
Change to 60 days later: 60일 이후 대비 현재 종가 대비 등락률
Date Open High Low Close Volume Change Close 60 days ago Close 60 days later Change from 60 days ago Change to 60 days later 60 2000-08-07 5740 5770 5580 5580 575355 -0.057432 6350.0 3510.0 -12.13 -37.10 61 2000-08-08 5660 5750 5570 5580 669550 0.000000 6160.0 3440.0 -9.42 -38.35 62 2000-08-09 5680 6040 5680 6000 791495 0.075269 6440.0 3410.0 -6.83 -43.17 63 2000-08-10 6000 6160 5860 6160 816612 0.026667 6800.0 3400.0 -9.41 -44.81 64 2000-08-11 6000 6070 5880 5960 676890 -0.032468 6920.0 3380.0 -13.87 -43.29 ... ... ... ... ... ... ... ... ... ... ... ... 5935 2024-05-27 75300 78200 74000 77200 43825202 0.017128 72800.0 78300.0 6.04 1.42 5936 2024-05-28 76500 78000 76200 77600 18539072 0.005181 72900.0 78300.0 6.45 0.90 5937 2024-05-29 77700 78200 75200 75200 30244875 -0.030928 73200.0 77700.0 2.73 3.32 5938 2024-05-30 74800 75200 73500 73500 28551273 -0.022606 73400.0 76100.0 0.14 3.54 5939 2024-05-31 74500 74700 73500 73500 26198776 0.000000 74900.0 76100.0 -1.87 3.54
Plain Text
복사
위와 같은 데이터를 구성해서,
x축을→Change from 60 days ago: 60일 이전 대비 현재 종가 등락률
y축을→Change to 60 days later: 60일 이후 대비 현재 종가 등락률
실제 삼성전자 데이터(2000.08.07~2024.05.31)를 이용해 x, y를 산점도로 표현해보면 다음과 같습니다.
산점도 데이터를 해석하고 고민해보면, 아래와 같은 트레이딩 전략을 고려해 볼 수 있습니다.(아래쪽 그림 함께 참고)
A구간
x축(60일 이전 대비 현재가가) -25~0% 사이 일 때 매수하면,
y축(60일 이후 대비 현재가가) -50~100% 사이입니다.
risk도 크지만, return도 큰 편입니다. HighRisk, HighReturn
B구간
x축(60일 이전 대비 현재가가) 50~100% 사이 일 때 매수하면,
y축(60일 이후 대비 현재가가) 대부분 0% ~50% 사이입니다.
안정적인 확률로 수익을 보는 구간이었습니다.

B구간, 정말 안정적인가?

위 산점도를 통해 얻은 결과의 B구간처럼 확률이 100%에 가까운 구간이라면 무조건 투자를 해볼만할까 고민해 볼 수 있습니다.
실제 B구간이 발생된 날들의 이슈들을 챙겨볼 필요가 있습니다.
실제 데이터를 살펴보면, B구간의 대부분이 2001년과 2002년이고, 최근은 2021년의 네 건만 존재합니다.
그러므로 B 구간은 특정 시점에 몰린 현상으로서 트레이딩에 적용하기에 적합하지 않을 수 있습니다.
큰 수의 법칙
큰 수의 법칙에 합당한가를 생각해볼 필요가 있습니다. B 구간의 데이터 모수가 트레이딩에 적용해볼만한 큰수일까 고민이 필요합니다. 어느정도가 큰 수일까는.. 정답은 없겠죠.

XY의 변경

이제 x축과 y축에 다양한 수치를 대입해서 다양한 산점도를 구해볼 수 있습니다. 예를 들어, x축을 30일 과거 대비, y축을 90일 미래 대비로 바꿔볼 수도 있고, x축을 MACD의 변경이나 이평선과의 거리를 사용할 수도 있겠죠. 이 내용을 근거로 트레이딩 엣지(Edge)를 고려하면 더 좋은 트레이딩 전략이 나올 수 있습니다.

마지막으로 코드

위 내용을 구현한 파이썬 코드입니다. 이를 위해서는 StartUP QUANT의 Class 01부터 Class 04까지 완료한 상태이어야 합니다.
파이참의 myStartUPQuant 프로젝트에 20240827_ScatterStock.py 를 추가합니다.
해당 py 파일에 아래 내용을 입력하고 실행합니다.
# 주가를 이용해 x,y 산점도 분석 # 산점도(Scatter Plot)는 두 변수 간의 관계를 시각적으로 표현하는 그래프입니다. # 각 데이터 포인트는 수평축(x축)과 수직축(y축)에 해당하는 두 변수의 값으로 표시됩니다. # 이 그래프는 변수들 사이의 상관관계, 트렌드, 이상치 등을 식별하는 데 유용하며, 데이터 집합 내 패턴을 파악하는 데 자주 사용됩니다. # QUANTLive\20240827_ScatterStock.py import pandas as pd import fdrCommon import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.family'] = 'NanumGothic' matplotlib.rcParams['axes.unicode_minus'] = False matplotlib.rcParams['font.size'] = 8 pd.set_option('display.max_columns', None) # df(Dataframe) 출력시 모든 컬럼 출력하도록 처리 pd.set_option('display.width', 1000) # df(Dataframe) 출력시, 한 로우가 따로 출력되지 않도록 충분한 길이 설정 symbol = "005930" # 삼성전자 symbol_nm = "삼성전자" df = fdrCommon.getPriceHistory(symbol, '', 10000) # fdr공통모듈을 통해 티커의 주가 정보 가져오기 df.index = df.index.strftime('%Y-%m-%d') # 'Date' 인덱스를 문자열로 변환 df.reset_index(drop=False, inplace=True) # 인덱스는 순번 재처리(Date 컬럼이 일반 컬럼으로 변경됨) N = 60 # N일 전 대비 상승률 df[f'Close {N} days ago'] = df['Close'].shift(N) # N일 후의 Close 가격 df[f'Close {N} days later'] = df['Close'].shift(-N) # N일 전 대비 상승률 계산 df[f'Change from {N} days ago'] = round((df['Close'] - df[f'Close {N} days ago']) / df[f'Close {N} days ago'] * 100,2) # N일 후 대비 상승률 계산 df[f'Change to {N} days later'] = round((df[f'Close {N} days later'] - df['Close']) / df['Close'] * 100,2) # NaN 값이 있는 행 제거 df.dropna(inplace=True) print(df) # xy 설정 x = f'Change from {N} days ago' y = f'Change to {N} days later' df['x'] = df[x] df['y'] = df[y] fr_dt = df['Date'].iloc[0] to_dt = df['Date'].iloc[-1] # 산점도 그리기 plt.figure(figsize=(8, 6)) plt.scatter(df[x], df[y], color='blue', marker='o',alpha=0.5,s=10) plt.title(f'[{symbol}]{symbol_nm} ({fr_dt}~{to_dt})\nScatter Plot of {x} vs {y}') plt.xlabel(x) plt.ylabel(y) # x0 위치에 세로 실선 추가 plt.axvline(x=0, color='red', linestyle='-', linewidth=2) # y0 위치에 가로 실선 추가 plt.axhline(y=0, color='green', linestyle='-', linewidth=2) plt.grid(True) plt.show()
Python
복사