본문 바로가기
2. Data Science Basics/Python

Python 을 이용하여 MDD / Sharp Ratio 구하기

by Mojito 2022. 1. 3.
import yfinance as yf
import pandas as pd

def get_returns():
    returns_list = []
    for i in range(len(stock_data)-1):
        today_close = stock_data.iloc[i+1]['Close']
        yesterday_close = stock_data.iloc[i]['Close']
        
        returns = (today_close - yesterday_close) / yesterday_close * 100
        returns_list.append(returns)
    returns_list.insert(0,0) # 첫번째 자리에 0 넣어주기
    return returns_list

def get_max_drawdown():
    mdd = (max(stock_data['Close'])-min(stock_data['Close']))/max(stock_data['Close']) * 100
    return mdd

def get_risk_free_rate():
    rf = []
    ten_years_government_bond = 0.0164
    inflation_rate = 0.042
    rfr = (1+ten_years_government_bond)/(1+inflation_rate)-1 #risk free rate
    for i in range(len(stock_data)):
        rf.append(rfr*100)
    return rf

def get_sharp_ratio(stock_data):
    stock_data['returns'] = get_returns()
    stock_data['risk free rate'] = get_risk_free_rate()
    stock_data['excess return'] = stock_data['returns'] - stock_data['risk free rate']
    mean_er = stock_data['excess return']. mean()
    std_er = stock_data['excess return'].std()
    sharp_ratio = mean_er / std_er
    return sharp_ratio

Ticker, duration = list(map(str, input("Enter Ticker: ").split())), int(input('Enter Duration(month): '))
# print(Ticker)
# Ticker = 'TSLA'
for i in range(len(Ticker)):
    company = yf.Ticker(Ticker[i])
    stock_data = company.history(period="{}mo".format(duration))
    # print(AAL)

    ## 유동비율 , 당좌비율 100%이상 준수
    cpb = company.balance_sheet
    mdd = get_max_drawdown()
    유동비율 = cpb.loc['Total Assets']/cpb.loc['Total Current Liabilities'] *100
    당좌비율 = (cpb.loc['Total Assets']-cpb.loc['Inventory'])/cpb.loc['Total Current Liabilities'] *100
    ##부채비율 200 미만 준수 400 이상 위험
    부채비율 = cpb.loc['Total Current Liabilities']/cpb.loc['Total Stockholder Equity']*100
    print("\n{}\n\nMDD: {}\n\n유동비율:(100%이상 준수) {}\n\n 당좌비율:(100%이상 준수) {}\n\n 부채비율:(200미만 준수, 400 이상 위험) {}".format(Ticker[i], mdd, 유동비율, 당좌비율, 부채비율))
    if get_sharp_ratio(stock_data) <= 1:
        print(get_sharp_ratio(stock_data), ' sharp ratio is sub-optimal.')
    elif 1 < get_sharp_ratio(stock_data) <=2:
        print(get_sharp_ratio(stock_data), ' sharp ratio is optimal.')
    elif 2 < get_sharp_ratio(stock_data) <=3:
        print(get_sharp_ratio(stock_data), ' sharp ratio is very-good.')
    else:
        print(get_sharp_ratio(stock_data), ' sharp ratio is excellent.')
반응형

댓글