别再乱卖股票了!这套量化止盈策略请查收

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:这是一套比较成熟的量化投资止盈方法,用预期上行潜力(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

这段代码里,先是导入了一些必要的库,像numpypandas这些都是处理数据常用的。然后用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 和预测波动率算出卖出比例,再转化为卖出百分比。
  • 展示结果:打印卖出比例和卖出百分比,并用图表可视化卖出信号。

感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!


本文内容仅限技术探讨和学习,不构成任何投资建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老余捞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值