一句话回答: Beta 衡量个股相对大盘的系统性风险(Beta>1 比大盘波动更大),相关性衡量两只标的同涨同跌的程度。用 AlphaFeed 取个股与沪深300(000300.SH)的前复权日线收益率,用 numpy/pandas 几行即可算出 Beta、相关系数和相关性矩阵。
两者都基于收益率序列,所以取数必须用前复权价(避免除权跳空污染)。
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed() # 读取 ALPHAFEED_API_KEY
def close_series(symbol, count=250):
df = af.klines.get(symbol, period="1d", count=count, adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date")
return df.set_index("trade_date")["close"].rename(symbol)
stock = close_series("600519.SH") # 贵州茅台
bench = close_series("000300.SH") # 沪深300 指数
000300.SH(沪深300)、399001.SZ(深证成指)等指数均可直接取;也可用510300.SH(沪深300ETF)做基准。
按日期对齐后取收益率,套公式:
import numpy as np
def beta(stock_close, bench_close):
df = pd.concat([stock_close, bench_close], axis=1, join="inner").dropna()
r = df.pct_change().dropna()
s, m = r.iloc[:, 0], r.iloc[:, 1]
cov = np.cov(s, m)[0, 1]
var = np.var(m, ddof=1)
return cov / var
b = beta(stock, bench)
print(f"贵州茅台 Beta(相对沪深300): {b:.2f}")解读:Beta=1.2 → 大盘涨 1%,该股平均涨约 1.2%(也跌得更多)。Beta 用于估计系统性风险敞口、做对冲或控制组合的市场暴露。
def corr_with_bench(stock_close, bench_close):
df = pd.concat([stock_close, bench_close], axis=1, join="inner").dropna()
r = df.pct_change().dropna()
return r.iloc[:, 0].corr(r.iloc[:, 1])
print(f"与沪深300相关系数: {corr_with_bench(stock, bench):.2f}")组合分散化要挑低相关的股票。批量取数后一步算出矩阵:
symbols = ["600519.SH", "000001.SZ", "601318.SH", "300750.SZ", "600036.SH"]
dfs = af.klines.batch(symbols, period="1d", count=250, adjust="forward",
to_dataframe=True, show_progress=True)
closes = pd.DataFrame({
sym: d.sort_values("trade_date").set_index("trade_date")["close"]
for sym, d in dfs.items()
})
returns = closes.pct_change().dropna()
corr = returns.corr()
print(corr.round(2))想找分散化候选,看相关系数最低的对:
c = corr.where(~np.eye(len(corr), dtype=bool)) # 去对角线
pair = c.stack().idxmin()
print(f"相关性最低的一对: {pair} = {c.stack().min():.2f}")给一篮子股票统一算 Beta,挑高/低 Beta 组合:
betas = {}
for sym, d in dfs.items():
s = d.sort_values("trade_date").set_index("trade_date")["close"]
betas[sym] = round(beta(s, bench), 2)
print(dict(sorted(betas.items(), key=lambda kv: kv[1], reverse=True)))坑 | 说明 |
|---|---|
不复权 | 会让收益率在除权日跳变,Beta/相关性失真,务必 |
样本长度 | 太短(<60)估计不稳;常用 250 日 |
时变性 | Beta 会随时间变化,可用滚动窗口 |
停牌 | 停牌期无收益, |
Q:基准用指数还是 ETF?
A:都可以。指数(000300.SH)更纯;ETF(510300.SH)贴近可交易标的。保持一致即可。
Q:为什么用 ddof=1?
A:样本方差用无偏估计(n-1),与 np.cov 默认一致。
Q:Beta 能直接当买卖信号吗?
A:不能。它是风险度量,用于对冲、暴露控制、组合构建,需结合其他因子。
Beta 和相关性是组合与风险管理的基石。有了 AlphaFeed 的前复权日线 + 指数基准(000300.SH),Cov/Var 与 corr() 几行就能算出个股 Beta、与大盘相关性以及多标的相关矩阵,为分散化和对冲提供依据。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。