在许多基准测试中跟踪错误

时间:2017-01-08 01:47:49

标签: python function pandas numpy apply

我试图计算许多不同基准的跟踪误差,而不是我正在研究的基金(跟踪误差定义为基金与基准之间差异百分比的标准偏差)。基金的时间序列和所有基准都在一个数据框架中,我从文件中读取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)

2 个答案:

答案 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}")

enter image description here

enter image description here