본문 바로가기
Programming/Python

[Python] 주식시장 동향 확인하기

by 코딩하는 금융인 2024. 6. 30.

안녕하세요.

오늘은 파이썬활용하여 주식시장이 상승 or 하락 국면에 있는지 확인할 수 있는 지표들을 구하는 방법에 대해 알아보겠습니다.

 

 주식시장 상승/하락 동향 지표들

▣ ADR(Advance Decline Ratio)

주식시장 내의 매수세력과 매도세력의 크기를 가늠하는 지표

 

 - 20거래일 동안 상승종목 누계를 하락종목 누계로 나눈 백분율(%)표시

 - ADR이 100%인 경우는 상승종목수와 하락종목수가 균형을 이루고 있다는 것을 나타내며, 120% 이상이면 과열권, 75% 이하바닥권으로 간주

 

→ 참고 사이트 바로가기

 

▣ TICK/TRIN

주식시장의 전반적인 동향을 파악하는 데 사용되는 지표들

 

: TICK(= 상승종목 수 - 하락종목 수)

 - 시장의 단기적인 방향성을 파악하는 데 사용되며, 극단적인 값으로 향할 때 반전 지표로 활용함

 

: TRIN(=(하락종목 수/상승종목 수) / (하락종목 거래량 / 상승종목 거래량))

 - 시장의 내부 강도를 측정하는 데 사용되며, TRIN 값이 1보다 크면 약세시장, 1보다 작으면 강세시장을 나타냄

 

참고 사이트 바로가기

 

▣ RSI

현재 가격의 상승 압력과 하락 압력 간의 상대적인 강도를 나타내는 기술적 지표

 

 - 일반적으로 14일을 사용하여 해당 기간 동안의 가격 상승과 하락의 평균을 비교하여 계산하며, 70 이상은 과매수를, 30 이하는 과매도를 나타냄

 

▣ 파이썬 실습

 - 코스피와 코스닥의 정확한 지표 값을 구하려면, 증권사 API를 이용하면 쉽지만 이에 대한 이용 가이드는 다음 포스팅 때 자세히 다루겠음

 - 아래는 2024년 6월 28일 기준으로 가상의 데이터를 생성하여 RSI(14), ADR, TRIN 지표를 계산하는 함수식을 만들어 결과를 출력하는 파이썬 코드임

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

def calculate_rsi(data, periods=14):
    delta = data.diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=periods).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=periods).mean()
    rs = gain / loss
    return 100 - (100 / (1 + rs))

def calculate_adr(data, periods=20):
    daily_change = data.pct_change()
    up = (daily_change > 0).rolling(window=periods).sum()
    down = (daily_change < 0).rolling(window=periods).sum()
    return up / down

def calculate_trin(data, volume):
    daily_change = data.pct_change()
    up = daily_change > 0
    down = daily_change < 0
    advancing = up.sum()
    declining = down.sum()
    advance_volume = volume[up].sum()
    decline_volume = volume[down].sum()
    if advancing == 0 or declining == 0 or advance_volume == 0 or decline_volume == 0:
        return np.nan
    return (declining / advancing) / (decline_volume / advance_volume)

# 가상의 데이터 생성
def generate_mock_data(start_date, end_date):
    date_range = pd.date_range(start=start_date, end=end_date, freq='B')
    close = np.random.randint(2000, 3000, size=len(date_range))
    volume = np.random.randint(1000000, 10000000, size=len(date_range))
    return pd.DataFrame({'Close': close, 'Volume': volume}, index=date_range)

# 코스피와 코스닥 지수
indices = ['KOSPI', 'KOSDAQ']

# 날짜 설정
end_date = pd.Timestamp('2024-06-28')
start_date = end_date - pd.Timedelta(days=60)

for index_name in indices:
    # 가상의 데이터 생성
    data = generate_mock_data(start_date, end_date)
    
    # RSI 계산
    rsi = calculate_rsi(data['Close'])
    
    # ADR 계산
    adr = calculate_adr(data['Close'])
    
    # TRIN 계산
    trin = calculate_trin(data['Close'], data['Volume'])
    
    # 결과 출력
    print(f"{index_name} 지표 (기준일: {end_date.date()}):")
    print(f"RSI (14): {rsi.iloc[-1]:.2f}")
    print(f"ADR (20): {adr.iloc[-1]:.2f}")
    print(f"TRIN: {trin:.2f}")
    print()

 

 

반응형

댓글