u010137797 2024-03-22 21:45 采纳率: 0%
浏览 4

python在投资组合分析里的应用

关于python用于投资组合分析
本人为大二,目前在上金融数据分析

img

img

img

img

给了两份数据,由于不能上传文件,我就将部分数据以及列名截图
假设date,Mkt-RF,SMB,HML,RF在名为FF3的文件里,PERMNO,DATE,SHRCD,EXCHCD,RET,SPRTRN,price,shrout在名为df的文件里
df文件有422321 rows × 8 columns FF3文件有1165 rows × 5 columns
目的就是首先使用有着shrout和price的文件进行Summary statistics,这一步我已经完成,我主要是不会第二步,希望有可以帮我解答,本人学艺不精还请赐教
首先是断点的选取,我是用:
num_p = 5
msf_dec = df.sort_values(['DATE'])
msf_dec['quintile'] = df.groupby('DATE')['Size'].transform(lambda x: pd.qcut(x, num_p, labels=False))+1
msf_dec.head(5)
来分成五组
而后要求使用merge函数来进行assign size group to all months,从这里开始我就有些不懂了,不管怎么都是错的,希望可以得到解答
同时我也不是很能理解最后的result presenting里t-value和ff3 adjusted alpha要怎么算,希望可以倾囊相授

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-22 21:45
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    针对您的问题,我将提供以下回答,分为三部分,包括数据预处理、投资组合分析和结果展示。 一、数据预处理
    1. 读取数据 首先需要将FF3文件和df文件读入python中,推荐使用pandas库中的read_csv函数进行读取操作。
    import pandas as pd
    FF3 = pd.read_csv('FF3.csv')
    df = pd.read_csv('df.csv')
    
    1. 数据清洗 接着对数据进行清洗和处理,确保数据格式正确,并能够进行后续分析操作。
    # 检查数据的缺失值并进行处理
    FF3.isnull().sum()
    df.isnull().sum()
    FF3 = FF3.dropna()
    df = df.dropna()
    # 将日期转换为datetime格式
    FF3['DATE'] = pd.to_datetime(FF3['DATE'], format='%Y-%m-%d')
    df['DATE'] = pd.to_datetime(df['DATE'], format='%Y-%m-%d')
    # 将PERMNO和DATE转换为整数格式
    df['PERMNO'] = df['PERMNO'].astype(int)
    df['DATE'] = df['DATE'].astype(int)
    # 将RET和SPRTRN转换为小数格式
    df['RET'] = df['RET'].astype(float)
    df['SPRTRN'] = df['SPRTRN'].astype(float)
    # 将Size计算并加入到df表格中
    df['Size'] = df['price'] * df['shrout']
    
    1. 数据合并 根据题目给出的数据情况,需要将FF3文件和df文件通过日期和证券代码进行合并。可以使用pandas库中的merge函数进行合并操作。
    data = pd.merge(FF3, df, on=['DATE'], how='inner')
    data = data.drop(columns=['SHRCD', 'EXCHCD'])
    
    1. 分组处理 根据问题的要求,需要将数据分组处理,这里采用的是按日期对Size进行分组。
    num_p = 5
    data = data.sort_values(['DATE'])
    data['quintile'] = data.groupby('DATE')['Size'].transform(lambda x: pd.qcut(x, num_p, labels=False)) + 1
    

    二、投资组合分析 在数据预处理之后,就可以进行投资组合分析了。首先,需要按照日期和Size分组,计算各组的平均收益率和风险(方差),然后计算各组的收益率和风险的差异,并将其用来构建投资组合。

    # 按日期和Size分组,计算收益率的平均值和方差
    grouped = data.groupby(['DATE', 'quintile'])
    ret_mean = grouped['RET'].mean()
    ret_var = grouped['RET'].var()
    # 计算各组收益率和方差之间的差异
    diff_ret = ret_mean - ret_mean.mean()
    diff_var = ret_var - ret_var.mean()
    # 构建投资组合
    w = diff_var / (diff_var.sum())
    portfolio_return = (w * ret_mean).sum()
    portfolio_risk = (((w ** 2) * ret_var).sum()) ** 0.5
    

    三、结果展示 最后,将计算结果进行展示。这里展示的内容包括: 1. 投资组合的平均收益率和风险; 2. 每个资产在投资组合中的权重; 3. T统计量和FF3调整后的alpha值。

    # 显示投资组合的平均收益率和风险
    print("Portfolio Return: %.2f%%" % (portfolio_return * 100))
    print("Portfolio Risk: %.2f%%" % (portfolio_risk * 100))
    # 显示每个资产在投资组合中的权重
    print()
    print("Asset Weights:")
    print(w)
    # 计算T统计量和FF3调整后的alpha值
    n = len(data)
    Rm = data['Mkt-RF'].mean()
    SMB = data['SMB'].mean()
    HML = data['HML'].mean()
    alpha = (portfolio_return - data['RF'].mean()) / 12
    T = alpha / ((w ** 2 * ret_var).sum() ** 0.5 / n) ** 0.5
    alpha_ff3 = alpha - 0.5 * T ** 2 * w.var() * diff_var.mean() - Rm * w.sum() - SMB * w[:5].sum() - HML * w[5:].sum()
    # 显示T统计量和FF3调整后的alpha值
    print()
    print("T-Statistic: %.2f" % T)
    print("FF3 Adjusted Alpha: %.2f%%" % (alpha_ff3 * 100))
    

    完整代码示例:

    import pandas as pd
    # 读取数据
    FF3 = pd.read_csv('FF3.csv')
    df = pd.read_csv('df.csv')
    # 数据清洗
    FF3.isnull().sum()
    df.isnull().sum()
    FF3 = FF3.dropna()
    df = df.dropna()
    FF3['DATE'] = pd.to_datetime(FF3['DATE'], format='%Y-%m-%d')
    df['DATE'] = pd.to_datetime(df['DATE'], format='%Y-%m-%d')
    df['PERMNO'] = df['PERMNO'].astype(int)
    df['DATE'] = df['DATE'].astype(int)
    df['RET'] = df['RET'].astype(float)
    df['SPRTRN'] = df['SPRTRN'].astype(float)
    df['Size'] = df['price'] * df['shrout']
    # 数据合并
    data = pd.merge(FF3, df, on=['DATE'], how='inner')
    data = data.drop(columns=['SHRCD', 'EXCHCD'])
    # 分组处理
    num_p = 5
    data = data.sort_values(['DATE'])
    data['quintile'] = data.groupby('DATE')['Size'].transform(lambda x: pd.qcut(x, num_p, labels=False)) + 1
    # 投资组合分析
    grouped = data.groupby(['DATE', 'quintile'])
    ret_mean = grouped['RET'].mean()
    ret_var = grouped['RET'].var()
    diff_ret = ret_mean - ret_mean.mean()
    diff_var = ret_var - ret_var.mean()
    w = diff_var / (diff_var.sum())
    portfolio_return = (w * ret_mean).sum()
    portfolio_risk = (((w ** 2) * ret_var).sum()) ** 0.5
    # 结果展示
    print("Portfolio Return: %.2f%%" % (portfolio_return * 100))
    print("Portfolio Risk: %.2f%%" % (portfolio_risk * 100))
    print()
    print("Asset Weights:")
    print(w)
    print()
    n = len(data)
    Rm = data['Mkt-RF'].mean()
    SMB = data['SMB'].mean()
    HML = data['HML'].mean()
    alpha = (portfolio_return - data['RF'].mean()) / 12
    T = alpha / ((w ** 2 * ret_var).sum() ** 0.5 / n) ** 0.5
    alpha_ff3 = alpha - 0.5 * T ** 2 * w.var() * diff_var.mean() - Rm * w.sum() - SMB * w[:5].sum() - HML * w[5:].sum()
    print("T-Statistic: %.2f" % T)
    print("FF3 Adjusted Alpha: %.2f%%" % (alpha_ff3 * 100))
    

    以上是对您提出的问题的回答和解决方案,如有疑问,请再次提出。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月22日
  • 创建了问题 3月22日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见