尝试绘制数据框中最低贝塔公司的超额回报和股价

问题描述 投票:0回答:0

我正在尝试绘制具有 5 个最低贝塔值(以及其他)的数据框公司的超额回报和价格。目前我想出了一个带有 beta 的空白图,而我的其他图似乎有效,我一直在努力弄清楚

我到目前为止的代码:

import pandas as pd, pandas_datareader as web
import yfinance as yf, numpy as np
from datetime import datetime
import statsmodels.api as sm
import matplotlib.pyplot as plt, seaborn as sns

sp=pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies',header=0)[0]
indr=sp[sp['GICS Sector']=='Industrials']
indr

indr_data=yf.download(indr['Symbol'].to_list(),start='2010-01-01',end='2023-02-21')['Adj Close']
percentage_null = indr_data.isnull().sum() / len(indr_data)
missing = percentage_null[percentage_null > 0.10].index
indr_data.drop(missing, axis=1, inplace=True)
indr_data

indr_ret = indr_data.resample('M').last().pct_change()[1:]
#Get S&P 500 Index
sp500_index = yf.download('^GSPC',start='2010-01-01',end='2023-02-21')['Adj Close']
sp500_ret = sp500_index.resample('M').last().pct_change()[1:]
all_stock_ret_data = pd.merge(indr_ret,sp500_ret, 
                              how='inner', left_index=True, right_index=True)
all_stock_ret_data = all_stock_ret_data.rename(columns= {'Adj Close':'sp500'})
all_stock_ret_data

rf = web.DataReader('TB3MS','fred',start = '2010-01-01', end= '2023-02-12')
rf.plot(title = '3-Moth T-bill Rate')
rf = (1 + (rf / 100)) ** (1 / 12) - 1
rf = rf.resample('M').last()
rf.plot(title = '3 Month T-bill Monthly Rate')
all_stock_ret_data.index = all_stock_ret_data.index.date
rf.index = rf.index.date
all_data = pd.merge(all_stock_ret_data,rf,
                            how = 'inner',
                            left_index = True,
                            right_index = True)
all_data

excess_ret = all_data.sub(all_data['TB3MS'],axis = 0).drop(columns = ['TB3MS'])
excess_ret.index = pd.to_datetime(excess_ret.index)
excess_ret

annual_sharpe = excess_ret.groupby(excess_ret.index.year).agg('mean')/excess_ret.groupby(excess_ret.index.year).agg('std')                                                                                                                             
annual_sharpe

sharpe_ratio = annual_sharpe.agg('mean').dropna()
sharpe_ratio

top_sharpe = sharpe_ratio.drop('sp500').nlargest(1).reset_index().rename(columns={'index':'security',0:'Sharpe'}) 
top_sharpe

bottom_sharpe = sharpe_ratio.drop('sp500').nsmallest(1).reset_index().rename(columns={'index':'security',0:'Sharpe'})
bottom_sharpe

portfolio1.plot()
plt.xlabel('Date')
plt.ylabel('Excess Return')
plt.title('Excess Returns: Jan 1, 2010-Feb 21,2023')
plt.show()

top10_sharpe = sharpe_ratio.drop('sp500').nlargest(10).reset_index().rename(columns={'index':'security',0:'Sharpe'})    
portfolio2  = pd.DataFrame(excess_ret, columns = top_sharpe['security'])  
portfolio2

#calculate Beta

def estimate(x,y):
    n = np.size(x)
    mean_x = np.mean(x)
    mean_y = np.mean(y)
    
    ss_xy = np.sum(x*y)-n*mean_x*mean_y
    ss_xx = np.sum(x*y)-n*mean_x*mean_x
    
    beta = ss_xy/ss_xx
    return(beta)

beta2 = pd.DataFrame()
indr_data

df = indr_data
sorted_df= df.sort_values('AAL',ascending=True)

lowest_5_beta= sorted_df.iloc[:5, :]

#lowest_5_beta.plot(x='', y=['AAL', 'AOS', 'CPRT', 'CSGP', 'ALK'], kind='line')

plt.plot()
plt.show()

特别是最后一个情节是为了显示最低的贝塔值,但它是空白的,我一直在试图获得代码

提前感谢任何能帮助我的人

python pandas matplotlib stock yahoo-finance
© www.soinside.com 2019 - 2024. All rights reserved.