파이썬으로 나만의 투자 전략 세우기 - 1주차
판다스를 활용하여 금융 데이터 만지기 & 트레이딩 기초 지식
개념
- Pandas
python을 활용해 데이터 분석을 하기 위해 사용하는 필수 패키지 Python에서 사용할 수 있는 형태의 DataFrame을 제공
- Pandas DataFrame
- list, dictionary, series, ndarrayemd 타입으로 사용가능
데이터를 표 형태로 처리하는 자료구조
공통 사용메소드
Pandas Library
read_csv(): csv 파일을 읽어 데이터 프레임 만들기
- stocks.csv

import pandas as pd
stocks = pd.read_csv("stocks.csv", header = [0, 1], index_col = [0], parse_dates = [0])
- header = [0, 1] 을 통해 상위 2개의 row를 header(= column index)로 지정
- index_col = [0] 을 통해 첫 번째 column을 index로 지정
- parse_dates = [0] 을 통해 첫 번째 column을 datetime Type으로 변경
- 결과

데이터 프레임 다루기
stocks.head() # 데이터프레임의 처음 5개의 row 출력
stocks.tail() # 데이터프레임의 마지막 5개의 row 출력
stocks.info() # 데이터프레임의 정보 출력, -> 데이터프레임을 구성하는 행과 열의 크기, 컬럼명, 컬럼을 구성하는 값의 자료형 등을
stocks.to_csv("stocks.csv") # 해당 데이터 프레임으로 csv 파일 저장
stocks.columns = stocks.columns.to_flat_index() # 2개이상의 header(column index)가 있을때 1개의 header로 합치기
stocks.columns = pd.MultiIndex.from_tuples(stocks.columns) # 합쳐진 index 되돌리기
stocks.loc["2013-01-01 01:00:00"] # 2013-01-01 01:00:00 값의 row index로 값 뽑아내기
stocks.iloc[0,1] # 0,1 에 있는 값 꺼내기
stocks.describe() # 각 row의 전체개수, 표준편차, 최소값, 최대값 등등 구하기
stocks.pct_change() # 각 col에 대해 row+1 값을 row 값으로 나누고 -1을 한 값(=((row+1)/row)-1), 맨 첫 row는 값이 없다는 'Nan'으로 표시
stocks.dropna() # dropna() 를 통해 Nan 값 삭제
목표1. 일별 평균 수익과 표준 편차
주식데이터를 받아 각 주식의 일별 평균 수익(Return)을 계산하고 그에 대한 표준 편차(Risk)를 구한다. → 금융 분야에선 리스크와 수익의 지표로 평균 수익과 수익의 표준편차를 사용한다.

⇒ 우측으로 갈수록 High Risk (고 위험), 위로 갈수록 High Return (고 수익)
순서
- stock.csv에서 값 가져오기
stocks = pd.read_csv("stocks.csv", header = [0,1], index_col= [0], parse_dates= [0])
- stocks에서 종가를 의미하는 Close 값만 가져오기
close = stocks.loc[:, "Close"].copy()
- close에서 모든 주식의 일별 수익을 계산
- 중간 확인
ret = close.pct_change().dropna()

- ret 값에서 일별 평균 수익과 표준편차 구하기
# cf. ret.describe() # describe() 를 통해 전체개수, 표준편차, 최소수익, 최대수익 등등 구하기
ret.describe().T.loc[:, ["mean", "std"]] # T(transpose) 속성을 통해 요약 통계를 하고 열에는 평균과 표준편차만 남긴다.

- 차트로 그리기
summary = ret.describe().T.loc[:, ["mean", "std"]]
summary["mean"] = summary["mean"]*252 # 일별 수익을 연별 수익으로, 주식 거래일은 통상 252일
summary["std"] = summary["std"] * np.sqrt(252) # 일별 표준편차를 연별 표준편차로
summary.plot(kind = "scatter", x = "std", y = "mean", figsize = (15,12), s = 50, fontsize = 15)
for i in summary.index:
plt.annotate(i, xy=(summary.loc[i, "std"]+0.002, summary.loc[i, "mean"]+0.002), size = 15)
plt.xlabel("ann. Risk(std)", fontsize = 15) # 표준편차를 Risk로 표현
plt.ylabel("ann. Return", fontsize = 15) # 수익을 Return으로 표현
plt.title("Risk/Return", fontsize = 20)
plt.show()
목표2. 공분산과 상관관계
어떠한 주식이 상승 또는 하락할때 다른 주식들이 상승 or 하락하는지를 비교하는 기법

ret.cov()
, 여기서 ret은 목표 1에서 ret
공분산
ret.corr()
상관관계로 -1 부터 1의 값을 갖는다. 해당 데이터가 공분산 보다 더 중요, 1=두 주식이 완벽히 같이 움직인다는 의미
- 목표1에서 했던 값을 활용하여 상관 관계를 표로 출력
import seaborn as sns
plt.figure(figsize=(12,8))
sns.set(font_scale=1.4)
sns.heatmap(ret.corr(), cmap = "Reds", annot = True, annot_kws={"size":15}, vmax = 0.6)
plt.show()
심화 지식
기술적 분석과 트레이딩
기본적 분석 VS 기술적 분석
- 기본적 분석 : 회사의 내재가치를 재무제표를 통해 확인해서 하는 방식
- 기술적 분석 : 주가, 거래량, 보조지표 등으로 패턴을 찾아서 하는 방식
투자 VS 트레이딩
- 투자 : 기업을 산다 (회사의 내재 가치, 현재 트렌드, 경영진 등 고려)
- 트레이딩 : 가격을 산다 (신발 리셀러와 같은 느낌)
카지노에서 트레이딩 원칙
- 확률적 우위
- 최대한 많은 거래
- 리스크 관리
로그 수익률
단순 수익률

로그 수익률

금융권에서 로그 수익률을 쓰는 이유
- 단순 수익률은 수익률 합계와 최종 수익률이 다르지만, 로그 수익률에서는 둘이 같기 때문이다.
- 단순 수익률은 상승 퍼센트와 하락 퍼센트가 다르게 나오지만, 로그 수익률에서는 같게 나와 직관적으로 보기 편하기 때문이다.
장기 이동평균선과 단기 이동평균선의 관계
이동평균선 : 평균 + 이동
- 평균의 관점

- 이동의 관점

장기 이동평균선 VS 장기 이동평균선

PPT 파일
본 스터디는 Udemy의 <【한글자막】 알고리즘 거래와 투자의 기술적 분석 with Python> 강의를 활용해 진행됐습니다. 강의에 대한 자세한 정보는 아래에서 확인하실 수 있습니다.
프밍 스터디는 Udemy Korea와 함께 합니다.