본문 바로가기
개발일지

파이썬 투자 보조 지표 분석 / 전략 설계 - 매물대 차트

by kirion 2022. 11. 26.
728x90
반응형

투자 보조 지표 

매물 차트란 매물대가 물려있는 가격대를 확인할 수 있다. 지지선, 저항선으로 활용해 매매 전략을 세울 수 있다. 

 

계산방법

기간을 설정한 후 시가, 종가, 고가, 저가 등의 가격을 사용해 누적 매물을 계산한다. 분봉으로 해야 가장 정확한 매물 차트가 그려진다. 내가 설계한 자세한 계산 방법은 파이썬 코드를 통해 소개하겠다. 

해석

일정 기간동안 일정 가격에 거래된 주식 수를 표시하는 것이 매물대이다. 매물대의 가장 중요하게 보아야 하는 것은 사람의 심리적인 부분이다. 주가가 매수한 주가에 근접하게 될 경우 판단을 하게 되는데, 이를 활용한 전략을 세울 수 있다.

전략

주가가 매수한 주가에 접근할 경우 

  • 주가 하락으로 평단가에 근접하였을 때 : 추가 매수, 지속 보유
  • 주가 상승으로 평간가에 근접하였을 때  : 주식 매도, 지속 보유

따라서 주가의 방양에 따라 지지와 저항선으로 사용할 수 있는 것인데, 

  • 주가가 하락할 때 강한 매물대는 주가를 방어 : 하락의 방어, 상승의 여지가 있음.
  • 주가가 상승할 때 강한 매물대는 주가의 저항 : 상승의 저항, 하락의 여지가 있음.

 


파이썬 구현

import ta
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
import copy
df_krx = fdr.StockListing('KRX')

kospi_data = df_krx[(df_krx["Market"]=="KOSPI") & (~df_krx["Sector"].isna())]

target = kospi_data[kospi_data["Name"]=="KT&G"]

price_data = fdr.DataReader("033780","2020","2022-11-23")

KT&G(^^)

 

price_data["3Q"] = np.round(price_data["High"] - (price_data["High"] - price_data["Low"]) *0.25,-2).astype(int)
price_data["1Q"] = np.round(price_data["Low"] + (price_data["High"] - price_data["Low"]) *0.25,-2).astype(int)

price_data["Open_v"] = price_data["Volume"] * 0.2
price_data["High_v"] = price_data["Volume"] * 0.1
price_data["Low_v"] = price_data["Volume"] * 0.1
price_data["Close_v"] = price_data["Volume"] * 0.2
price_data["3Q_v"] = price_data["Volume"] * 0.2
price_data["1Q_v"] = price_data["Volume"] * 0.2

매물대 계산을 위해 가격대를 하나 더 생성했다. 가격 변동 폭의 1 분위, 3 분위 가격을 추가했다. 

그리고 각 가격대별 거래량을 계산해주어야하는데, 가중치를 바꿔가면서 해보니 코드상에 적어놓은 값이 가장 유사했다.

시가, 종가, 3분위, 1 분위는 20%씩 거래량을 계산하고, 고가와 저가는 10%씩 계산했다.

 

volume_df = None
p_list = ["Open","High","Low","Close","3Q","1Q"]
for col in p_list:
    tmp = price_data[[col,col+"_v"]]
    tmp.columns = ["price","volume"]
    volume_df = pd.concat([volume_df,tmp],axis = 0)

계산하기 쉽게 가격 구분 별 주가를 통합한다.

 

price_term = np.int((volume_df["price"].max() - volume_df["price"].min())/20)
term_list = np.arange(volume_df["price"].min(),volume_df["price"].max()+int(price_term/10),price_term)

volume_df["cut"] = 0
for i,v in enumerate(term_list[1:]):
    print(i)
    if i == 0:
        print("init")
        volume_df.loc[volume_df["price"]<=term_list[1],"cut"] = int((term_list[0] + term_list[1])/2)
    elif i == len(term_list)-2:
        print("last")
        volume_df.loc[volume_df["price"]>term_list[i],"cut"] = int((term_list[i] + term_list[i+1])/2)
    else:
        volume_df.loc[(volume_df["price"]>term_list[i]) & (volume_df["price"]<=term_list[i+1]),"cut"] = int((term_list[i] + term_list[i+1])/2)

가격 대를 20개 동일한 구간으로 나누었다. 동일 개수가 아닌 가격을 기반으로 한 구간화이다. 위의 코드에서는 20개로 나누면서 각 구간별 값 차이가 1005원씩으로 계산이 되었다. 

최대, 최소 값의 차를 이용해 구간화한다. 

 

시각화를 위해 각 구간의 대표값은 각 구간의  평균값으로 설정했다. 

 

volume_chart = volume_df.groupby(["cut"]).sum()[["volume"]]

volume_chart["volume_p"] = volume_chart["volume"]/volume_chart["volume"].sum()*100

multi_factor = price_data.shape[0]/volume_chart["volume_p"].max()
for i in volume_chart.index:
    tmp = volume_chart[volume_chart.index == i]
    price_data[i]=None
    price_data.loc[0:int(tmp["volume_p"]*multi_factor),i] = tmp.index.values[0]

 

각 구간의 거래량 합계를 계산한다. 

주가와 함계 시각화하기 위해 변칙적인 방법을 썼다.

최대 %를 가지고 있는 가격 매물대가 가장 길게 표시되어야 하기 때문에 multi_factor를 만들어 준 후 다른 모든 % 값에 곱해주었다. 그런 후 날짜 기반으로 plot이 그려지기 때문에 각 가격대를 칼럼 이름으로 두고 해당되는 % 값까지 날짜에 값을 부여해준다.

 

말로 설명하니 아리송한데 데이터프레임으로 보자. 위의 코드를 돌리면 아래와 같은 데이터 프레임이 생성이 된다.

매물대 차트 기초 자료

평균값 81122를 갖는 매물대가 가장 %가 높기 때문에 날짜 끝까지 해당 값이 들어가 있다. 반대로 91172원대는 가장 매물대가 없기 때문에 첫 줄에만 값이 있는 것을 볼 수 있다.

 

 

 

이 자료를 토대로 plot을 그려주면,

fig, ax1 = plt.subplots(figsize = (14,7)) 
ax1.set_ylabel('Price') 
# ax2 = ax1.twinx() 
# ax2.set_ylabel('Price') 

plt.text(price_data[-30:-29].index,price_data.Close.min(), 'Max :' + str(int(volume_chart.volume_p.max()))+"%")
for n in volume_chart.index:
    ax1.plot(price_data.index,price_data[n],linewidth = 17,alpha = 0.3)
ax1.plot(price_data["Close"],color = "black",alpha = 0.7)

plt.title(target["Name"].values[0])
plt.show()

매물대 차트

주가와 매물대가 동시에 그려지는 그래프가 만들어진다.

나는 세세하게 보고 싶어서 20개로 분할했는데 증권사에서는 보통 10개로 분할해서 제공한다.

 

10개 분할 차트

분할 개수는 입맛에 맞게 조정해서 사용하면 될 것 같다.

 

 

KT&G는 매물대를 뚫고 고공 행진하는 것을 보인다. 저항선이 없는 주가는 상승한다고 하더라. 22년 6~7월 경 하락하기 전으로 돌려 보자.

 

21년6월1일 ~ 22년6월1일 매물대 차트

21년 6월 1일 ~ 22년 6월 1일의 1년 기준 매물대 차트를 그려봤는데 저항선을 제대로 만났다. 이 직후부터 주가가 하락하기 시작했다. 약 3개월 동안 하락세가 지속되었다.

20년7월1일 ~ 21년 7월1일 매물대 차트

1년 뒤로 더 돌려서 20년 7월 1일 ~ 21년 7월 1일 차트도 만들어봤다. 

역시 저항선이 두텁게 있었다. 7월 이후 주가가 약 4개월 동안 빠졌다.

 

이번엔 상승할 때의 시점을 보자.

21년 8월1일 ~ 22년 8월1일 매물대 차트

6월부터 지속 하락했지만, 7월 경 방어선과 만났다. 이후 주가는 뚫고 올라가 96,000원 대까지 올랐다.(이때 샀어야 하는걸.....)

 

이상 매물대 차트에 대해 알아보았다.

주가와 같은 축으로 그릴 수 있는 지표이기 때문에 다른 뒷 배경으로 기본으로 넣어주면 분석에 좋을 것 같다.

 

728x90
반응형

댓글