各个指标
1. Alpha
Alpha = 策略年化收益 - [无风险年化收益 + beta * (基准年化 - 无风险年化收益)]
Alpha是指风险调整后的收益(剔除掉基准带来的收益后的剩余),如果Alpha值大于0,表示剔除基准带来的收益后,策略仍然能够取得正收益,如果Alpha小于0表示主动管理部分造成了负收益
2. Beta
Beta = cor(策略,基准) / var(策略)
Beta用来衡量个别股票或股票基金相对于整个股市的价格波动情况
3. 跟踪误差 Tracking Error
跟踪误差 = 每日涨跌幅与基准涨跌幅偏离的标准差
跟踪误差表示策略与基准的偏离程度
4. 信息比率 Information Ratio
信息比率 = (累计收益率 - 基准累计收益率)/ 跟踪误差
信息比率表示剔除市场基准的波动后,主动管理带来的单位收益
5. 特雷诺比率 Treynor
特雷诺比率 = (年化收益率 - 无风险收益)/ Beta
表示每单位系统风险资产获得的超额报酬,可以认为是承担beta的性价比,注意:如果使用OLS回归有四个基本假设,最好使用corr/var的计算方式
程序复现
import numpy as np
import pandas as pd
from copy import deepcopy
def fund_calculate_beta(_value_df):
"""计算beta"""
_beta = _value_df['单位净值'].cov(_value_df['基准净值']) / _value_df['单位净值'].var(ddof=0)
return _beta
def rolling_pipe(dataframe, window, _func):
return pd.Series([dataframe.iloc[: i].pipe(_func)
if i >= window else None for i in range(1, len(dataframe) + 1)], index=dataframe.index)
def fund_analyze_with_market(net_series, market_net_series, rf=0.03, one_year_count=365, normalize_first_data=True):
net_series = deepcopy(net_series)
market_net_series = deepcopy(market_net_series)
collect_df = pd.concat([net_series, market_net_series], axis=1)
collect_df.columns = ["单位净值", "基准净值"]
# 基本净值
collect_df['单日涨跌幅'] = collect_df['单位净值'].pct_change()
collect_df["累计收益率"] = collect_df['单位净值'] - collect_df['单位净值'].iloc[0]
collect_df['年化收益率'] = collect_df['累计收益率'] / (collect_df.index - collect_df.index[0]).days * one_year_count
# 基准
collect_df['基准涨跌幅'] = collect_df['基准净值'].pct_change()
collect_df["基准累计收益率"] = collect_df['基准净值'] - collect_df['基准净值'].iloc[0]
collect_df['基准年化收益率'] = collect_df['基准累计收益率'] / (collect_df.index - collect_df.index[0]).days * one_year_count
# 开始计算指标
collect_df["Beta"] = collect_df[["单位净值", "基准净值"]].pipe(rolling_pipe, 2, fund_calculate_beta) # 滚动计算beta指标
# alpha = 策略年化收益 - [无风险年化收益 + beta * (基准年化 - 无风险年化)]
collect_df['Alpha'] = collect_df['年化收益率'] - (rf + collect_df['Beta'] * (collect_df['基准年化收益率'] - rf))
# 跟踪误差 = 每日涨跌幅与基准涨跌幅偏离的标准差
collect_df['TrackingError'] = (collect_df['单日涨跌幅'] - collect_df['基准涨跌幅']).rolling(
collect_df.shape[0], min_periods=0).std()
# IR: 信息比率表示剔除市场基准的波动后,主动管理带来的单位收益
collect_df['InformationRatio'] = (collect_df["累计收益率"] - collect_df['基准累计收益率']) / collect_df['TrackingError']
# 特雷诺比率:注意如果使用OLS回归有四个基本假设,最好使用corr/var的计算方式
# 该指数的含义为每单位系统风险资产获得的超额报酬,可以认为是承担beta的性价比
collect_df["Treynor"] = (collect_df['年化收益率'] - rf) / collect_df["Beta"]
return collect_df
def main():
# 示例数据:生成净值与业绩基准两个净值序列
_size = 500
net_df = pd.DataFrame({
"净值": 1 + pd.Series(np.random.normal(0, 0.01, size=_size)).cumsum(),
"业绩基准": 1 + pd.Series(np.random.normal(0, 0.01, size=_size)).cumsum(),
})
net_df.index = pd.date_range("2024-01-01", periods=_size)
# 计算净值相对基准
net_analyze = fund_analyze_with_market(net_df['净值'], net_df['业绩基准'])
print(net_analyze.head())
if __name__ == '__main__':
main()