作者:老余捞鱼
原创不易,转载请标明出处及原作者。
写在前面的话:这是一套比较成熟的量化投资止盈方法,用预期上行潜力(EUP)和异质自回归(HAR)模型,能精准找到止盈点。通过代码实操,构建投资组合,分析数据就能确定卖出信号。快来和我一起学,能让你的投资收益更上一层楼!
在量化金融领域,风险管理和波动预测对制定止盈操作的交易策略那可是非常关键的。今天给大家分享的方法,它结合了条件风险价值(咱们国内一般叫预期上行潜力,也就是 EUP)和异质自回归模型(HAR 模型),能帮大家更科学地做出止盈决策。
我们以美股“七巨头” 股票的等权重投资组合为例来分析。
一、数据与投资组合构建
我们从雅虎财经获取这七只股票在 2020 年 1 月 1 日到 2025 年 3 月 15 日的历史调整收盘价,然后用 Python 计算出它们的每日收益率。代码如下:
import numpy as np
import pandas as pd
import yfinance as yf
import statsmodels.api as sm
import matplotlib.pyplot as plt
plt.close('all')
tickers = ["AAPL", "MSFT", "NVDA", "AMZN", "TSLA", "META", "GOOGL"]
data = yf.download(tickers, start="2020-01-01", end="2025-03-15", auto_adjust=False)["Close"]
returns = data.pct_change().dropna()
# 等权重投资组合
weights = np.ones(len(tickers)) / len(tickers)
portfolio_returns = returns.dot(weights)
portfolio_prices = (1 + portfolio_returns).cumprod() * 100 # 初始值设为100
这段代码里,先是导入了一些必要的库,像numpy
、pandas
这些都是处理数据常用的。然后用yfinance
库获取股票数据,计算出收益率。
然后构建等权重投资组合,还能算出投资组合的价格。
- 计算每只股票的日收益率(
pct_change
)。 - 构建等权重投资组合,每只股票的权重相同。
- 计算投资组合的日收益率和累计价格(以 100 为基准)。
二、计算风险价值和预期上行潜力
为了衡量风险和潜在收益,我们要计算两个重要指标:
- 风险价值(VaR 95%):就是过去 60 天收益率的第 95 百分位数。这表示在 95% 的情况下,我们的损失不会超过这个数值。
- 预期上行潜力(EUP):也就是超过第 95 百分位数的那些收益率的平均值。这能让我们知道潜在的盈利空间有多大。
具体计算代码如下:
window_eup = 60
rolling_var = portfolio_returns.rolling(window=window_eup).quantile(0.95)
def eup_cvar(x, alpha=95):
threshold = np.percentile(x, alpha)
tail = x[x >= threshold]
return tail.mean() if len(tail) > 0 else np.nan
eup_series = portfolio_returns.rolling(window=window_eup).apply(lambda x: eup_cvar(x, alpha=95), raw=True)
signal = portfolio_returns > rolling_var # 止盈触发信号
这里通过rolling
函数计算滚动数据,然后定义了一个函数eup_cvar
来计算 EUP。
得出止盈触发信号,当投资组合收益率大于滚动风险价值时,就可能触发止盈。
三、用 HAR 模型预测波动率
HAR 模型可以根据日、周、月不同周期的波动率来预测每日波动率。具体是基于以下几个窗口的波动率:
- 日波动率(2 天窗口)
- 周波动率(5 天窗口)
- 月波动率(22 天窗口)
代码片段如下:
vol_daily = portfolio_returns.rolling(window=2).std()
vol_weekly = portfolio_returns.rolling(window=5).std()
vol_monthly = portfolio_returns.rolling(window=22).std()
# 篇幅所限,非完整代码
else:
vol_data['vol_forecast'] = np.nan
这段代码先计算不同周期的波动率,然后构建数据框。接着用线性回归的方法构建 HAR 模型,进行波动率预测。
波动率预测结果如上图。
四、计算卖出比例和百分比
有了前面的数据,我们就能计算卖出比例了。
公式是:卖出比例 = 预期上行潜力(EUP) / 预测波动率。
然后根据预设的阈值,把卖出比例映射成 0% - 100% 的卖出百分比:
- 卖出比例 ≤ 1.0 → 0% 卖出
- 卖出比例 ≥ 3.0 → 100% 卖出
- 1.0 到 3.0 之间 → 按比例插值计算
部分代码如下:
common_index = portfolio_returns.index.intersection(vol_data['vol_forecast'].dropna().index)
# 篇幅所限,非完整代码
else:
return (r - threshold_min) / (threshold_max - threshold_min)
sales_percentage = ratio.dropna().apply(sale_percentage)
这段代码先找到相关数据的共同索引,然后计算卖出比例,最后通过函数把卖出比例转化为卖出百分比。
卖出比例和卖出百分比计算结果展示数据如上图。
五、打印可视化卖出信号
最后,把卖出信号打印出来,还可以用图表展示。示例代码如下:
print("最后10个卖出比例(EUP / 波动率预测):")
print(ratio.dropna().tail(10))
print("\n最后10个卖出百分比:")
print(sales_percentage.tail(10))
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(portfolio_prices.index, portfolio_prices, label="投资组合价格", color="blue")
sales_dates = sales_percentage.index
if not sales_dates.empty:
ax.scatter(sales_dates, portfolio_prices.loc[sales_dates],
color="red", marker="v", s=100, label="卖出信号")
for date in sales_dates:
perc = sales_percentage.loc[date] * 100
ax.annotate(f"{perc:.0f}%", (date, portfolio_prices.loc[date]),
textcoords="offset points", xytext=(0,10), ha="center", color="red")
ax.set_title("基于EUP(右尾CVaR)和HAR波动率模型的卖出信号")
ax.set_xlabel("日期")
ax.set_ylabel("投资组合价格(初始值100)")
ax.legend()
ax.grid(True)
plt.show()
运行这段代码,我们就能在控制台看到最后 10 个卖出比例和卖出百分比,还能生成一个图表。如下图所示,蓝色线是投资组合价格走势,红色三角就是卖出信号,旁边还标着卖出百分比。
代码的核心功能是通过计算投资组合的风险价值(VaR)、预期上行潜力(EUP)和预测波动率,生成卖出信号,并根据卖出比率和百分比进行决策。最终结果通过图表直观展示卖出信号及其强度。
以上的源代码请在我的Google Colab中申请下载(附言:csdn),内附中文构建说明。
如觉得对您有所帮助,请留言或者私信向我要完整源代码,同时请我喝杯咖啡就好。
六、观点总结
本文介绍的方法,把基于预期上行潜力(EUP)的止盈信号和 HAR 波动率模型结合起来,能根据市场情况动态调整卖出比例,相比固定的止盈阈值,这种方法更科学、更灵活。
- 确定投资组合:选取七只主要科技股构建等权重投资组合,计算投资组合收益率和价格。
- 计算关键指标:算出风险价值(VaR 95%)和预期上行潜力(EUP),以此确定止盈触发信号。
- 预测波动率:用 HAR 模型基于不同周期波动率预测每日波动率。
- 计算卖出数据:根据 EUP 和预测波动率算出卖出比例,再转化为卖出百分比。
- 展示结果:打印卖出比例和卖出百分比,并用图表可视化卖出信号。
感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。