```
import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams ['font.sans-serif'] ='SimHei' #显示中文
plt.rcParams ['axes.unicode_minus']=False #显示负号
three_factors=pd.read_csv('fivefactor_daily.csv')[['trddy','mkt_rf','smb','hml','rmw','cma']].rename(columns={'trddy':'日期'}).set_index('日期')
three_factors=three_factors.loc['2023-04-01':'2024-03-31',:]
three_factors.index=pd.to_datetime(three_factors.index)
three_factors.head(3)
def sum_return_ratio(price_list):
'''实际总收益率'''
price_list=price_list.to_numpy()
return (price_list[-1]-price_list[0])/price_list[0]
def MaxDrawdown(price_list):
'''最大回撤率'''
i = np.argmax((np.maximum.accumulate(price_list) - price_list) / np.maximum.accumulate(price_list)) # 结束位置
if i == 0:
return 0
j = np.argmax(price_list[:i]) # 开始位置
return (price_list[j] - price_list[i]) / (price_list[j])
def sharpe_ratio(price_list,rf=0.000041):
'''夏普比率'''
#公式 夏普率 = (回报率均值 - 无风险率) / 回报率的标准差
# pct_change()是pandas里面的自带的计算每日增长率的函数
daily_return = price_list.pct_change()
return daily_return.mean()-rf/ daily_return.std()
def Information_Ratio(price_list,rf=0.000041):
'''信息比率'''
chaoer=sum_return_ratio(price_list)-((1+rf)**365-1)
return chaoer/np.std(price_list.pct_change()-rf)
def deal(code='', mode='五因子'):
day_return = return_dict[code] # ['收益率']
day_return.index = pd.to_datetime(day_return.index)
实际总收益率 = sum_return_ratio(day_return['收盘'])
最大回测率 = MaxDrawdown(day_return['收盘'])
夏普比率 = sharpe_ratio(day_return['收盘'])
信息比率 = Information_Ratio(day_return['收盘'])
zgpa_threefactor = pd.merge(three_factors, day_return, left_index=True, right_index=True)
if mode == '五因子':
result = sm.OLS(zgpa_threefactor['收益率'],
sm.add_constant(zgpa_threefactor.loc[:, ['mkt_rf', 'smb', 'hml', 'rmw', 'cma']])).fit()
betas = result.params
return pd.DataFrame(
{'阿尔法': betas[0], '市场风险因子MKT': betas[1], '市值因子SMB': betas[2], '账面市值因子HML': betas[3],
'盈利能力因子RMW': betas[4], '投资风格因子CMA': betas[5],
'实际总收益率': 实际总收益率, '最大回测率': 最大回测率, '夏普比率': 夏普比率, '信息比率': 信息比率,
'股票代码': code}, index=[0])
else:
# zgpa_threefactor = pd.merge(three_factors, day_return,left_index=True, right_index=True)
result = sm.OLS(zgpa_threefactor['收益率'],
sm.add_constant(zgpa_threefactor.loc[:, ['mkt_rf', 'smb', 'hml']])).fit()
betas = result.params
return pd.DataFrame(
{'阿尔法': betas[0], '市场风险因子MKT': betas[1], '市值因子SMB': betas[2], '账面市值因子HML': betas[3],
'实际总收益率': 实际总收益率, '最大回测率': 最大回测率, '夏普比率': 夏普比率, '信息比率': 信息比率,
'股票代码': code}, index=[0])
df_results = pd.DataFrame()
for code, df_one in return_dict.items():
result = deal(code=code,mode='五因子'); result['股票名称'] = code_name[code]
df_results = pd.concat([df_results, result], axis=0, ignore_index=True)
df_results=df_results[['股票代码', '股票名称','阿尔法', '市场风险因子MKT', '市值因子SMB', '账面市值因子HML', '实际总收益率', '最大回测率', '夏普比率', '信息比率']].sort_values(by='阿尔法',ascending=False)
df_results
### 储存结果
df_results.to_csv('五因子结果.csv',index=False)```代码运行错误怎样更改
最新发布