【问题标题】:Can I generate Beta(of stocks) for all columns (holding stocks returns) at one go without having to loop through each column in a Pandas frame我可以一次为所有列(持有股票收益)生成 Beta(股票),而不必遍历 Pandas 框架中的每一列
【发布时间】:2020-09-10 22:20:43
【问题描述】:

我有一个数据框 (df),其中包含多只股票的月度回报(以列形式)。最后一列是基准回报。数据框索引是 YYYYMM 格式的月末日期。我需要为每只股票生成 beta。虽然我可以遍历每一列并生成相应的测试版,但我希望 Python 有一个更优雅的解决方案,不涉及循环。有人可以帮帮我吗。谢谢。

【问题讨论】:

  • 编写函数来计算 β,它在列中包含您的回报。使用df.apply(beta_func)
  • 好的。谢谢你。我会试试这个。
  • 我怀疑您需要 2 个时间序列来计算 β、股票和市场。所以更好的方法是编写一个函数来接收股票收益和市场收益,它仍然会遍历股票 df 的列。如果您正在寻找更好的东西,请展示您的代码并告诉我们您希望在哪里改进它。
  • 是的。我有大约 150 个股票回报(T.S. 1)和一个市场回报向量(T.S. 2)。我需要这 150 只股票中的每只股票的贝塔值。虽然我可以编写一个循环并遍历股票和市场回报的每种组合,但我希望 Python 有一个更优雅的解决方案。谢谢。
  • 总会有一个循环,要么是你看到的 for 循环,要么是通过df.apply() 隐藏的循环。如果你想重用它,你可以将它隐藏到一个函数中。

标签: python pandas dataframe


【解决方案1】:

如果您不想使用循环,则必须使用 numpy 进行一些矩阵乘法。例如

from pandas_datareader import data
import pandas as pd 
import numpy as np

# download prices
tickers = ['PYPL', 'JPM', 'NKE']
stock = data.DataReader(tickers, 'yahoo', '2019-08-31', '2020-08-31')
bench = data.DataReader('^GSPC', 'yahoo', '2019-08-31', '2020-08-31')

# returns from prices
bench_returns = bench['Adj Close'].pct_change()[1:]
stock_returns = stock['Adj Close'].pct_change()[1:]

# Matrix multiplication
A = np.array(bench_returns)
B = np.array(stock_returns)

betas = 1 / np.dot(A, A.transpose()) * np.dot(A.transpose(), B)
betas 

结果:

array([1.16944123, 1.31768569, 0.9873832 ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多