Python 我是否可以一次生成所有列(持有股票收益)的Beta(股票),而不必在一个框架中循环遍历每一列

Python 我是否可以一次生成所有列(持有股票收益)的Beta(股票),而不必在一个框架中循环遍历每一列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框架(df),它保存多支股票的月度回报(列)。最后一列是基准回报。数据帧索引是YYYYMM格式的月末日期。我需要为每个股票生成beta。虽然我可以循环遍历每一列并生成相应的beta,但我希望使用Python有一个不涉及循环的更优雅的解决方案。谁能帮帮我吗。谢谢。如果你不想使用循环,你必须用numpy做一些矩阵乘法。例如 from pandas_datareader import data import pandas as pd import numpy as np # downl

我有一个数据框架(df),它保存多支股票的月度回报(列)。最后一列是基准回报。数据帧索引是YYYYMM格式的月末日期。我需要为每个股票生成beta。虽然我可以循环遍历每一列并生成相应的beta,但我希望使用Python有一个不涉及循环的更优雅的解决方案。谁能帮帮我吗。谢谢。

如果你不想使用循环,你必须用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 ])

编写函数来计算β,β以列形式接收您的收益。使用
df.apply(beta_func)
Ok。非常感谢。我会试试这个。我想你需要两个时间序列来计算β,股票和市场。因此,更好的方法是编写一个函数,该函数接受股票回报和市场回报,它仍然会遍历股票df的列。如果您正在寻找更好的东西,请显示您的代码并告诉我们您希望改进的地方。是的。我有大约150支股票的回报(T.S.1)和一个市场回报向量(T.S.2)。我需要这150只股票中的每一只的贝塔。虽然我可以编写一个循环并遍历股票和市场回报的每个组合,但我希望Python有一个更优雅的解决方案。谢谢。总有一个循环,或者是您看到的for循环,或者是通过
df.apply()
隐藏的循环。但是,如果希望重用它,可以将其隐藏到函数中。