본문 바로가기

API

[FinanceDataReader] 주가 및 소르티노비율 소르티노지수(sortino) 계산

반응형

FinanceDataReader를 이용해서 주가를 확인하고 소르티노 지수를 계산해보겠습니다.

FinanceDataReader의 설치 및 기본 사용법이 필요하신 분은 1번 참조 부탁드립니다.

1. FinanceDataReader 설치 및 주가정보 확인(Skip가능)
2. 주가 수집
3. 소르티노 비율 계산

4. 2022년 코스피의 소르티노 지수 상위 Top20

 

 

1. FinanceDataReader 설치(Skip가능)

https://yenpa.tistory.com/19

 

[FinanceDataReader] 설치 및 주식 주가 정보 가져오기(코스피, 코스닥)

국내 주식 정보를 가져와 보겠습니다. FinanceDataReader의 수집데이터의 변경이 있었네요. 내용 수정했습니다(2022/11/09) 1. FinanceDataReader 설치 2. 종목 정보 가져오기 3. 주가 정보 가져오기 1. FinanceDataR

yenpa.tistory.com

 

 

2. 주가 수집

필요 라이브러리 import 하고 거래소 전체 회사 리스트를 저장합니다.

import FinanceDataReader as fdr
from datetime import datetime, timedelta
df_list=fdr.StockListing('KRX')

삼성전자의 주가를 2010-01-01부터 불러오겠습니다.

name='삼성전자'
df_filter=df_list.loc[df_list['Name']==name]
code=df_filter['Code'].values[0]
startdate='2010-01-01'
enddate=(datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')

samsung=fdr.DataReader(code,startdate,enddate)
samsung

 

 

삼성전자의 일별 누적 수익률을 계산하겠습니다.

samsung['누적수익률']=((samsung['Change'] + 1).cumprod()-1)
samsung

 

 

3. 소르티노 비율 계산

샤프 비율은 아래와 같이 계산됩니다

Rp : 연간 투자수익률

rf : 무위험수익률

σd : 표준편차(마이너스 수익률)

 

Rp는 오늘 예제에서는 삼성전자의 주가를 사용하고, rf는 코스피 지수를 기준으로 계산해보겠습니다.
계산을 위해서는 rp의 표준편차(마이너스 수익률)가 필요합니다.

삼성전자의 전체 기간 중 수익률이 마이너스인 날들로 표준편차를 구합니다.

samstd=samsung.loc[samsung['Change']<0,'Change'].std()
samstd

삼성전자와 코스피의 수익률을 각각 저장합니다.

sam=samsung.loc[samsung.index=='2022-12-01','누적수익률'].values[0]
kos=kospi.loc[kospi.index=='2022-12-01','누적수익률'].values[0]

마지막으로 소르티노 비율을 계산하겠습니다.

2.36이라는 수치가 나왔습니다.

(sam/100-kos/100)/samstd

 

반응형

4. 2022년 코스피의 소르티노 지수 상위 Top 20

코스피 전체 회사 리스트를 저장합니다.

kospi_list=df_list.loc[df_list['Market']=='KOSPI']

2022-01-01~2022-12-02의 코스피 지수의 누적 수익률을 구하고

2022-12-01의 데이터를 kos에 저장합니다. 

연초 대비 -17%가 계산이 됩니다.

startdate='2022-01-01'
enddate='2022-12-02'

kospi=fdr.DataReader('KS11',startdate,enddate)
kospi['Change']=kospi['Close'].pct_change()
kospi['누적수익률']=((kospi['Change'] + 1).cumprod()-1)
kos=kospi.loc[kospi.index=='2022-12-01','누적수익률'].values[0]
kos

 

그다음으로는 코스피의 각 회사별로 2022년의 주가를 불러와서

누적 수익률 및 수익률이 마이너스인 날짜를 대상으로 표준편차를 구합니다.

결과를 result_all에 저장합니다.

result_all=[]
for i,r in kospi_list.iterrows():
    code=r['Code']
    stock=fdr.DataReader(code,startdate,enddate)
    stock['누적수익률']=((stock['Change'] + 1).cumprod()-1)
    sto=stock.loc[stock.index=='2022-12-01','누적수익률'].values[0]
    std=stock.loc[stock['Change']<0,'Change'].std()
    
    result={}
    
    result['date'] = enddate
    result['name'] = r['Name']
    result['누적수익률'] = sto
    result['소르티노지수']=(sto/100-kos/100)/std
    
    result_all.append(result)

 

result_all을 DataFrame으로 변환합니다.

import pandas as pd

df=pd.DataFrame(result_all)
df

2022-12-02일 기준으로 아래의 데이터의 수집 및 계산이 되었습니다.

상위 20개 회사만 구해보겠습니다.

top20=df.sort_values('소르티노지수',ascending=False).iloc[:20,:]
top20

삼천리 및 대성홀딩스 금양 등의 회사의 소르티노 지수가 높은 것을 알 수 있습니다.

 

그래프로 확인하겠습니다.

import plotly.express as px

top20_1=top20.sort_values('소르티노지수')
fig=px.bar(x=top20_1['소르티노지수'], y=top20_1['name'])
fig.show()

 

이상으로  소르티노 지수를 계산하고 그래프로 확인해봤습니다.

반응형