주식공부/파이썬 주식

파이썬 주식, 지지선/저항선을 그려보자

일찍자요 2022. 9. 30. 00:00
반응형

파이썬으로 백테스팅이나 크롤링 하는 많은 고수분들의 블로그 내용은 많은데,
지지/저항을 그려본 내용은 잘 없었다.
그래서 어설프게나마 만들어 보았다.
혹시라도 관심 있으신 분들이 참고 하실 수 있길 바라며~

1. 어떻게 지지/저항 라인을 찾나?

- 단순히 생각해보자.
일봉이든 분봉이든 파동이 쭉 그려지면 고점은 저항이 되고 저점은 지지가 된다.
그리고 지지는 과거에 저항이었을 거다.
→ 특정 기간별로 그룹화 해서 min/max를 가려낸다.

* df : 주가의 데이터프레임
* gt : 나누고자 하는 단위그룹 별 거래일 수
* term : 분석할 전체 거래일 수
* gcnt : 그룹화 된 그룹 개수 (= term/gt)
for 문으로 그룹별 min,max 확인해서 min그룹, max 그룹에 넣어주었다.

def pivot(self, df,gcnt,gt,term):

    # 지지,저항선 골라내기
    g_max = []
    g_min = []
    g_mclose = []
    for i in range(0, int(int(gcnt) - 1)):
        gref = df[len(df) - int(gt) * (i + 1):len(df) - int(gt) * i]
        g_max.append(max(gref['high']))
        g_min.append(min(gref['low']))
        g_mclose.append(max(gref['close']))

2. 그룹화된 min/max의 데이터들을 모아 중복제거까지 해준다.

- 가령 240일치 동안 모인 데이터를 20개 그룹으로 나눈다고 하면 그룹별로 12일치 데이터가 모이고,
그 안에서도 min/max 값들이 있다. 20개 그룹의 이 데이터를 모으면 당연히 중복이 있다.
- 중복을 제거하고 심플하게 그려주자.

new_gmax = list(OrderedDict.fromkeys(sorted(g_max, reverse=True)))  # sorted로 내림차순정렬하고 OrderedDict로 중복제거
new_gmin = list(OrderedDict.fromkeys(sorted(g_min, reverse=True)))  # sorted로 내림차순정렬하고 OrderedDict로 중복제거


3. 너무 가까이 모인 데이터는 좀 지워보자. 어떻게 하지?

- 이렇게 모아보면 저항구간이 많았던 라인은 너무 촘촘하게 저항/지지 라인이 생길 수 있다.
- 가장 큰 가격기준으로 나눠준다. 이렇게 되면 소수가 되는데, 소수점은 버리고 정수만 남게 한다.

# 합치고 내림차순정렬, 중복제거
res_base = list(OrderedDict.fromkeys(sorted(new_gmax + new_gmin, reverse=True)))

res_base_dict = {}
for i in res_base:
    # 최대값으로 나눴을때 소수점 버리고 정수값만 가져와서 딕셔너리 업데이트 한다.
    res_base_dict.update({i: math.floor(float(1 - i / max(res_base)) * 100)})


- 그리고 정수가 같은것은 중복이니, 중복제거 해준다.

# 그렇게 업데이트 된 값들 중 value기준 중복제거한다.
imsi = []
result = dict()
for key, val in res_base_dict.items():
    if val not in imsi:
        imsi.append(val)
        result[key] = val

4. 그래프로 그려보자.

- 종목에 따라 그룹화를 어떻게 하느냐에 따라 좀 더 선명할 수도 있다.
- 딱 정해진 기준은 없는것 같고, 이래저래 해보면서 적절한 그룹으로 나눠서 확인하면 될 것 같다.

## 그래프로 그려보기
# df에서 원하는 만큼 라인 가져오기
plt.plot(df.index[-int(term):], df['high'][-int(term):])
plt.plot(df.index[-int(term):], df['close'][-int(term):])
plt.plot(df.index[-int(term):], df['low'][-int(term):])
plt.plot(df.index[-int(term):], df['ma5'][-int(term):])
plt.plot(df.index[-int(term):], df['ma20'][-int(term):])
plt.plot(df.index[-int(term):], df['ma60'][-int(term):])
plt.plot(df.index[-int(term):], df['ma120'][-int(term):])
plt.plot(df.index[-int(term):], df['ma240'][-int(term):])
for i in result.keys():
    # 지지,저항 기준선 추가
    plt.axhline(y=i, xmin=0, xmax=1, color='blue', linestyle='solid')


plt.legend()
plt.show()

5. 실행결과
1) 코스피

- 오늘자(9/28) 코스피다.....OTL ..너무 힘들다 요즘.
- 240거래일 기준으로 30일 단위로 나눠보니 아래와 같이 그려진다.
- 얼추 지지/저항 라인이 맞아 떨어지는 듯하다.


- 600일치로 늘려서 60거래일로 나눠보니 좀 지저분하게 많아 지긴한데, 그래도 나름 중요한 라인이 그려진다.
좀 진하게 보여지는 구간이 많이 겹쳐진 부분으로, 지지와 저항이 분명한 라인이라 볼 수 있겠다.


2) 대정화금

- 굳이 이걸 가져온 이유는,,,6개월 존버 끝에 오늘 수익을 보고 나왔기 때문이다. 죽다 살아났다 진짜.ㅡㅡ
- 아래와 같이 종목을 쓰고, 기간,그룹단위 거래일수 입력하면 그래프로 그려준다.
이건, 사용자 편의에 따라 만들어보면 되겠다.

- 빨간색 화살표에 2번 나눠 매수하고 바닥 찍고 오늘(9/28) 4.6% 수익으로 나왔다. 감사할 따름..
- 아래 그래프로 보면, 오늘도 중요한 저항라인을 단번에 뚫어 올린걸 볼 수 있다.





어설픈 구현이지만 누군가에겐 도움이 되길 바래봅니다. :)

반응형