我试图计算许多不同基准的跟踪误差,而不是我正在研究的基金(跟踪误差定义为基金与基准之间差异百分比的标准偏差)。基金的时间序列和所有基准都在一个数据框架中,我从文件中读取excel,到目前为止我所拥有的是这个(认为arg1代表所有基准,然后应用使用applymap),但是它返回了KeyError,有什么建议吗?
import pandas as pd
import numpy as np
data = pd.read_excel('File_Path.xlsx')
def index_analytics(arg1):
tracking_err = np.std((data['Fund'] - data[arg1]) / data[arg1])
return tracking_err
data.applymap(index_analytics)
答案 0 :(得分:1)
有一些事情需要修复。首先,applymap
将所有列的每个单独值传递给您的调用函数(index_analytics
)。因此arg1
是数据框中所有值的单个标量值。除非您的所有值都是列名,否则data[arg1]
总是会返回一个键错误。
您也不需要使用apply来执行此操作。假设您的基准测试位于同一数据帧中,那么您应该可以为每个基准测试执行类似的操作。下次包含数据帧的样本。
df['Benchmark1_result'] = (df['Fund'] - data['Benchmark1']) / data['Benchmark1']
如果你想计算所有基准的所有标准差,你可以这样做
# assume you have a dataframe with a list of all the benchmark columns
benchmark_columns = [list, of, benchmark, columns]
np.std((df['Fund'].values - df[benchmark_columns].values) / df['Fund'].values, axis=1)
答案 1 :(得分:0)
假设您遵循以下跟踪错误的定义:
import pandas as pd
import numpy as np
# Example DataFrame
df = pd.DataFrame({'Portfolio_Returns': [5.00, 1.67], 'Bench_Returns': [2.89, .759]})
df['Active_Return'] = df['Portfolio_Returns'] - df['Bench_Returns']
print(df.head())
list_ = df['Active_Return']
temp_ = []
for val in list_:
x = val**2
temp_.append(x)
tracking_error = np.sqrt(sum(temp_))
print(f"Tracking Error is: {tracking_error}")
或者,如果您希望它更紧凑(因为显然很酷的孩子这样做):
df = pd.DataFrame({'Portfolio_Returns': [5.00, 1.67], 'Bench_Returns': [2.89, .759]})
tracking_error = np.sqrt(sum([val**2 for val in df['Portfolio_Returns'] - df['Bench_Returns']]))
print(f"Tracking Error is: {tracking_error}")