In [1]:
import numpy as np
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr
import matplotlib.pyplot as plt
plt.style.use('ggplot')
In [2]:
st=pd.Timestamp(2025, 5, 1)
et=pd.Timestamp(2025, 11, 4)
nme={'코스피':'KS11','코스탁':"KQ11",'삼성전자':'005930','하이닉스':"000660", '삼성바이오':"207940", "필라반도체":"381180", 'skbio':"302440",'기아':'000270', "SDI":"006400","포스코퓨처엠":"003670","Kodex반도체":"091160","kodex코스피":"226490",
'삼성전기':"009150", "A스토리":"241840", " 제반도":"080220", "삼성중":"010140", "한화오션":"042660", "레인보우로보틱스": '277810'}
df=fdr.DataReader(nme['삼성전자'], st, et)
df.head()
Out[2]:
| Open | High | Low | Close | Volume | Change | |
|---|---|---|---|---|---|---|
| Date | ||||||
| 2025-05-02 | 55000 | 55500 | 54200 | 54300 | 22454204 | -0.021622 |
| 2025-05-07 | 54500 | 55000 | 54300 | 54600 | 17136991 | 0.005525 |
| 2025-05-08 | 55100 | 55500 | 54500 | 54600 | 16320532 | 0.000000 |
| 2025-05-09 | 54700 | 55000 | 54400 | 54800 | 7814322 | 0.003663 |
| 2025-05-12 | 55200 | 57600 | 55000 | 57600 | 15414702 | 0.051095 |
pandas_ta.entropy()
Entropy (엔트로피)는 통계학 및 정보 이론에서 데이터의 무작위성, 불확실성 또는 정보의 복잡성을 측정하는 척도입니다.금융에서의 의미: 금융 시장 데이터, 특히 주가나 거래량의 변화율(Return)에 엔트로피를 적용하면, 특정 기간 동안 해당 데이터가 얼마나 예측하기 어려운지, 즉 무질서도가 높은지를 측정할 수 있습니다.
- 엔트로피 값이 높다는 것은 데이터의 변동 패턴이 다양하고 무작위성이 높아 예측하기 어렵다는 것을 의미합니다.
- 엔트로피 값이 낮다는 것은 데이터의 변동 패턴이 단순하고 반복적이어서 예측 가능성이 높다는 것을 의미합니다.
- 계산 방식:
pandas_ta.entropy()는 기본적으로 롤링 윈도우(Rolling Window) 내의 데이터에 대해 Shannon Entropy를 계산합니다 $$H = -\sum_{i} p_i \log_b(p_i)$$- 여기서 $p_i$는 해당 윈도우 내에서 관측되는 값들의 확률 분포입니다.
매개변수
- close (필수): 엔트로피를 계산할 입력 데이터 시리즈(예: 종가, 수익률)
- length (int): 엔트로피를 계산할 롤링 윈도우의 크기 (예: 14일). 기본값은 일반적으로 30일 내외입니다.
- base (float): 로그를 계산할 때 사용할 밑(Base). 기본값은 자연로그 e 또는 2일 수 있습니다 (정보 단위를 nats 또는 bits로 결정).
- append (bool): 계산 결과를 기존 DataFrame 에 새로운 열로 추가할지 여부.
In [5]:
entropy=df.ta.entropy(10)
entropy.plot(figsize=(10, 4))
plt.show()
pandas_ta.kurtosis()
**첨도(Kurtosis)**는 데이터 분포의 꼬리(Tails)의 두께와 정점(Peak)의 뾰족한 정도를 측정하는 통계적 척도입니다.pandas_ta.kurtosis()는 지정된 기간(length) 동안 이 첨도를 계산하여 금융 데이터의 극단적인 변화(아웃라이어) 발생 가능성을 측정하는 데 사용됩니다.
- 계산 원리 (초과 첨도): 정규 분포의 첨도 값인 3을 뺀 초과 첨도 (Excess Kurtosis)를 반환합니다.
- 정규 분포 (Mesokurtic): 초과 첨도 = 0
- 높은 첨도(Leptokurtic): 초과 첨도 > 0 (꼬리가 두껍고 정점이 뾰족함)
- 낮은 첨도 (Platykurtic): 초과 첨도 < 0 (꼬리가 얇고 정점이 평평함)
- 금융 분석에서의 의미: 주가 수익률(Returns)의 분포에서 첨도 값은 다음과 같은 위험을 측정합니다.
| 초과 첨도 값 | 분포 형태 | 금융적 해석 |
|---|---|---|
| 양수 (>0) | Leptokurtic (두꺼운 꼬리) | 극단적인 가격 변동(엄청난 이익 또는 손실)이 정규분포보다 더 자주 발생할 수 있음을 의미하며, 높은 리스크를 나타냅니다. |
| 0에 가까움 | Mesokurtic (정규 분포와 유사) | 극단적인 변동의 발생 가능성이 정규분포와 비슷합니다. |
| 음수 (<0) | Platykurtic (얇은 꼬리) | 극단적인 변동이 정규분포보다 드물게 발생하며, 상대적으로 낮은 변동성과 안정성을 나타냅니다. |
주요 매개변수
매개변수역할
- close (필수): 첨도를 계산할 입력 데이터 Series (보통 수익률 Return 을 사용).
- length (int): 첨도를 계산할 롤링 윈도우의 크기 (예: 30일). 기본값은 일반적으로 30입니다.
- ddof (int)Delta Degrees of Freedom입니다. 첨도 계산 시 분모에 사용되는 자유도를 정의합니다. ddof=0은 편향된(biased) 첨도, ddof=1은 비편향된(unbiased) 첨도를 계산하는 데 사용됩니다. pandas_ta의 기본값은 라이브러리 버전에 따라 다를 수 있으나, Pandas의 기본값은 1입니다.
- offset (int): 결과를 몇 기간 앞이나 뒤로 이동(shift)할지 지정합니다.
- append (bool): 계산 결과를 기존 $\text{DataFrame}$에 새 열로 추가할지 여부.
In [6]:
kurtosis = df.ta.kurtosis(length=10)
kurtosis.plot(figsize=(10, 4))
plt.axhline(0, ls="--")
plt.show()
pandas_ta.mad()
**평균 절대 편차 (MAD)**는 데이터가 평균에서 얼마나 퍼져 있는지를 측정하는 분산(Dispersion) 또는 변동성(Volatility) 척도입니다.- 계산 원리: MAD는 데이터 포인트와 평균 사이의 절대 거리를 평균한 값입니다. 표준 편차(Standard Deviation)와 유사하지만, 편차를 제곱하지 않고 절댓값을 사용합니다.
$$\text{MAD} = \frac{\sum_{i=1}^{n} |x_i - \bar{x}|}{n}$$
- $x_i$: 각 데이터 포인트
- $\bar{x}$: 데이터의 평균 (Mean)
- n: 데이터 포인트의 개수
- 금융 분석에서 MAD를 롤링(Rolling) 방식으로 사용하면, 특정 기간 동안 자산 가격이나 수익률의 변동성을 측정할 수 있습니다.
- 높은 MAD 값: 가격이 평균에서 크게 벗어나는 경우가 잦으며, 높은 변동성을 나타냅니다. (리스크가 높음)
- 낮은 MAD 값: 가격이 평균 주변에 밀집되어 있으며, 낮은 변동성과 상대적인 안정성을 나타냅니다.
- 표준 편차(Standard Deviation)와의 차이: MAD 는 편차에 절댓값을 사용하므로 계산이 직관적이며 이상치(Outlier)에 덜 민감할 수 있습니다. 표준 편차는 편차를 제곱하기 때문에 큰 편차(극단적인 변동)에 더 큰 가중치를 부여합니다.
주요 매개변수
- close (필수): MAD를 계산할 입력 데이터 Series (보통 종가 Close 또는 수익률 Return 을 사용).
- length (int): MAD를 계산할 롤링 윈도우의 크기 (기간). 기본값은 일반적으로 30입니다.
- offset (int): 결과를 몇 기간 앞이나 뒤로 이동(shift)할지 지정합니다.
- append (bool): 계산 결과를 기존 DataFrame에 새 열로 추가할지 여부.
In [7]:
mad=df.ta.mad(length=20)
mad.plot(figsize=(10, 4))
plt.show()
pandas_ta.median()
**중앙값 (Median)**은 데이터를 크기 순으로 정렬했을 때 정중앙에 위치하는 값입니다.- 계산 원리
- 롤링 (Rolling): 함수는 지정된 기간(length)만큼의 데이터 윈도우(window)를 설정하고, 시간을 따라 이 윈도우를 한 기간씩 이동하면서 계산합니다.
- 중앙값: 각 윈도우 내의 모든 값을 정렬한 후 중간값을 선택합니다.
- 데이터 개수가 홀수: 정중앙의 값이 중앙값입니다.
- 데이터 개수가 짝수: 중앙에 있는 두 값의 평균이 중앙값입니다.
- 중앙값은 이동 평균(Moving Average, SMA)과 유사하게 가격 변동을 평활화(Smoothing)하여 추세를 확인하는 데 사용됩니다.
- 강점 (이상치에 대한 강건성): 평균은 하나의 극단적인 값(이상치, Outlier)에 의해 크게 영향을 받지만, 중앙값은 극단적인 값에 덜 민감합니다.
- 예: [10, 11, 12, 50]의 평균은 20.75이지만, 중앙값은 11.5입니다. 50이 큰 이상치여도 중앙값은 거의 변하지 않습니다.
- 용도: 이동 중앙값은 가격의 진정한 중심 경향을 왜곡 없이 파악하고, 단기적인 노이즈나 급등락의 영향을 줄여 추세를 더 확실하게 보여줄 때 유용합니다
주요 매개변수
- close (필수): 중앙값을 계산할 입력 데이터 Series (일반적으로 Close 가격).
- length (int): 중앙값을 계산할 롤링 윈도우의 크기 (기간). 기본값은 일반적으로 30입니다.
- offset (int): 결과를 몇 기간 앞이나 뒤로 이동(shift)할지 지정합니다.
- append (bool): 계산 결과를 기존 DataFrame에 새 열로 추가할지 여부.
In [8]:
med=pd.DataFrame()
med["Close"]=df["Close"]
med["5"]=df.ta.median(length=5)
med["20"]=df.ta.median(length=20)
med["60"]=df.ta.median(length=90)
med.plot(figsize=(10, 3))
plt.show()
pandas_ta.quantile()
**분위수 (Quantile)**는 데이터를 크기 순으로 정렬했을 때 전체 데이터 분포를 지정된 비율(%)로 나누는 경계점의 값입니다.계산 원리
- 기본적으로 pandas의 롤링(rolling) 기능을 활용하여 금융 시계열 데이터에 적용합니다.
- 입력 매개변수 q: 계산할 분위수의 비율을 나타내며, 0에서 1 사이의 값(0.25, 0.5, 0.75 등)을 가집니다.
- q = 0.25: 1사분위수 (25th Percentile), 데이터의 하위 25%가 이 값보다 작거나 같습니다.
- q = 0.5: 중앙값 (Median, 50th Percentile), 데이터의 절반이 이 값보다 작거나 같습니다.
- q = 0.75: 3사분위수 (75th Percentile), 데이터의 하위 75%가 이 값보다 작거나 같습니다.
- 롤링 (Rolling): 함수는 지정된 length 기간의 윈도우를 이동하면서, 해당 윈도우 내 데이터의 분위수 값을 계산하여 시계열로 반환합니다.
롤링 분위수는 가격의 동적인 범위와 변동성을 이해하는 데 유용합니다.
- 동적 지지/저항선: 예를 들어, 14일 롤링 0.1 분위수(10% 지점)와 0.9 분위수(90% 지점)를 계산하면, 가격이 최근 14일 동안 10%의 시간만 머물렀던 하단과 상단의 극단적인 가격 수준을 파악할 수 있습니다. 이는 볼린저 밴드(Bollinger Bands)와 같이 가격의 범위를 시각화하고 잠재적인 지지 또는 저항 수준을 동적으로 설정하는 데 사용됩니다.
- 가격의 극단성 측정: 현재 가격이 최근 기간 동안의 가격 분포에서 얼마나 극단적인 위치에 있는지를 측정하는 백분위 순위 오실레이터 (Percentile Rank Oscillator)와 같은 지표를 구축하는 데 기초가 됩니
주요 매개
- close (필수): 분위수를 계산할 입력 데이터 Series (일반적으로 Close 가격).
- length (int): 분위수를 계산할 롤링 윈도우의 크기 (기간). 기본값은 일반적으로 30입니다.
- q (float): 계산할 분위수의 비율. 0에서 1 사이의 값이어야 합니다. 기본값은 0.5 (중앙값)입니다.(단일 q 만 허용)
- offset (int): 결과를 몇 기간 앞이나 뒤로 이동(shift)할지 지정합니다.
- append (bool): 계산 결과를 기존 DataFrame에 새 열로 추가할지 여부.
In [9]:
quantile = pd.DataFrame()
quantile["Close"]=df["Close"]
q=[0.1, 0.5, 0.9]
for i in q:
quantile[f'{i*100}%' ]=df.ta.quantile(q=i, length=20)
quantile.plot(figsize=(10, 3))
plt.show()
pandas_ta.skew()
1. 롤링 왜도(Rolling Skewness): df.ta.skew()는 기본적으로 데이터의 **롤링 왜도(Rolling Skewness)**를 계산합니다. 이는 지정된 기간(window, length) 동안 데이터 분포의 비대칭성 정도를 측정하는 통계적 지표입니다. - 구문 예시: df.ta.skew(length=14, append=True)2. 2. 왜도(Skewness): 왜도는 데이터 분포의 꼬리가 어느 한쪽으로 더 길게 늘어져 있는지를 보여줍니다. 이는 금융 시장에서 **극단적인 움직임(outliers)**의 가능성이 어느 방향(상승 또는 하락)에 더 높은지를 파악하는 데 유용합니다.- Skewness >
- 0: 양의 왜도 (우측 꼬리)
- 분포의 꼬리가 오른쪽으로 더 길다. 평균이 중앙값보다 크다. 작은 하락은 흔하지만, 갑작스러운 큰 상승이 발생할 가능성이 높음 (흔하지 않은 큰 양수 수익률).
- Skewness < 0
- 음의 왜도 (좌측 꼬리)
- 분포의 꼬리가 왼쪽으로 더 길다. 평균이 중앙값보다 작다. 작은 상승은 흔하지만, 갑작스러운 큰 하락이 발생할 (잠재적 위험) 가능성이 높음 (흔하지 않은 큰 음수 수익률).
- $\text{Skewness} \approx 0$
- 대칭 분포
- 데이터가 정규분포(Bell Curve)와 유사하게 양쪽으로 대칭적이다. (실제 금융 데이터에서는 드뭄)
- 주요 매개변수 (Parameters)
- length: 롤링 왜도를 계산할 기간 (윈도우 크기), 기본값 = 30
- close: 왜도를 계산할 시리즈 (일반적으로 종가 Series). 기본값입니다.
- append: 계산된 결과를 기존 DataFrame에 새로운 열로 추가할지 여부, 기본값=False
팁: 금융 데이터 분석에서 왜도 지표는 일반적으로 자산의 수익률(Returns) 분포를 분석하는 데 사용되며, 시장의 하방 위험(Tail Risk)을 평가하는 데 중요한 통계량입니다.
In [ ]:
skew=df.ta.skew(length=30)
skew.plot(figsize=(10, 3))
plt.axhline(0, ls="--")
plt.show()
Out[ ]:
Date 2025-05-02 NaN 2025-05-07 NaN 2025-05-08 NaN 2025-05-09 NaN 2025-05-12 NaN Name: SKEW_30, dtype: float64
pandas_ta.stdev() (표준편차)
**표준편차(Standard Deviation)**를 계산합니다. Variance() 값의 제곱근으로, 데이터 포인트가 **평균으로부터 얼마나 퍼져 있는지(산포도)**를 원래 데이터와 동일한 단위로 나타냅니다.금융에서 롤링 표준편차는 지정된 기간 동안 가격의 변동성(Volatility)을 측정하는 가장 일반적인 방법입니다.
- 값이 높으면 가격 변동이 심하고(위험 높음)
- 값이 낮으면 가격 변동이 안정적(위험 낮음)
주요 매개
- length: 표준편차를 계산할 롤링 윈도우 크기. 기본값=30
- close: 표준편차를 계산할 입력 시리즈 (일반적으로 종가 Series). 기본값=df["Close"]
- append: 계산된 결과를 DataFrame에 새로운 열로 추가할지 여부. 기본값=False
- ddof: 분모의 자유도(Delta Degrees of Freedom), 기본값=1 (샘플 표준편차)
In [10]:
stdev=df.ta.stdev(length=20)
stdev.plot(figsize=(10, 3))
plt.show()
pandas_ta.zscore()
1. 롤링 Z-점수 계산: df.ta.zscore()는 지정된 기간(window, length) 동안의 **롤링 평균($\mu$)**과 **롤링 표준편차($\sigma$)**를 사용하여 각 데이터 포인트의 Z-점수를 계산합니다. 2. Z-점수 공식Z-점수는 다음과 같은 공식에 따라 계산됩니다. $$Z = \frac{X - \mu}{\sigma}$$ - X: 현재 데이터 포인트의 값 (예: 현재 종가) - $\mu$: 지정된 length 기간의 평균 (예: 이동평균) - $\sigma$: 지정된 length 기간의 표준편차 (예: 변동성)- Z-점수는 가격이 최근의 평균 가격에 비해 얼마나 극단적인 위치에 있는지를 나타내며, 보통 평균 회귀(Mean Reversion) 전략을 분석하는 데 사용됩니다.
| Z-점수 값 | 해석 | 금융적 의미 |
|---|---|---|
| Z = 0 | 현재 가격이 평균과 정확히 같다. | 가격이 횡보 중이거나 중립적인 상태. |
| Z >0 | 현재 가격이 평균보다 높다. | 가격이 평균으로부터 양의 방향으로 표준편차만큼 떨어져 있다. (과매수 가능성) |
| Z < 0 | 현재 가격이 평균보다 낮다. | 가격이 평균으로부터 음의 방향으로 표준편차만큼 떨어져 있다. (과매도 가능성) Z ≥ 2 또는 4. |
- 주요 매개변수 (Parameters)
- length: 롤링 평균 및 표준편차를 계산할 기간 (윈도우 크기). 기본값 = 30
- close: Z-점수를 계산할 입력 시리즈 (일반적으로 종가 Series), 기본값= df["Close"]
- append: 계산된 결과를 기존 DataFrame에 새로운 열로 추가할지 여부, 기본값=False
활용 예시:
- Z-점수 > +2: 가격이 너무 높다고 판단, 매도
- Z-점수 < -2: 가격이 너무 낮다고 판단, 매수
- 평균 회귀 기반 트레이딩 전략을 수립하는 데 사용
In [11]:
zscore=df.ta.zscore(length=20)
zscore.plot(figsize=(10, 3))
plt.axhline(2, ls="--", color="r")
plt.axhline(0, ls="--", color="g")
plt.axhline(-2, ls="--", color="b")
plt.show()
댓글
댓글 쓰기