【问题标题】:Tracking Error on a number of benchmarks多个基准的跟踪误差
【发布时间】:2017-01-08 01:47:49
【问题描述】:

我正在尝试计算多个不同基准与我正在查看的基金的跟踪误差(跟踪误差定义为基金和基准之间百分比差异的标准偏差)。基金的时间序列和所有基准都在我从文件中的 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)

【问题讨论】:

    标签: python function pandas numpy apply


    【解决方案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)
    

    【讨论】:

    • 谢谢!我明白你关于创建列表的观点。所以现在,我创建了 benchmark_columns = data.columns.tolist(),但是当我使用结构时,((data['Fund']) - data[benchmark_columns]) / data[benchmark_columns]).std() ,我得到一个错误:
    • RuntimeWarning: unorderable types: str()
    • benchmark_columns 应该是您的列的子集。从上面的代码中,您正在获取所有毫无意义的列。仅选择基准列。减法时也要使用.values
    【解决方案2】:

    假设您遵循以下跟踪错误的定义:

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

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 2011-04-26
      • 2010-09-12
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2016-04-15
      • 2014-11-04
      相关资源
      最近更新 更多