易得程序化交易技术论坛

登录 | 注册

积分: 0 |用户组: 游客

搜索
查看: 3110|回复: 1

通过自定义函数实现BetaUp上涨贝塔系数

[复制链接]

22

主题

65

帖子

1423

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1423
发表于 2022-6-25 23:26:46 | 显示全部楼层 |阅读模式
上涨贝塔系数的用法:
BetaUp(N)为当前股票收益与大盘收益相比的上涨贝塔系数,该系数表明大盘每上涨1%,则该股票将上涨N%  
例如:BetaUp(10)表示10周期上涨贝塔系数。

以下代码通过易得程序化自定义函数实现BetaUp上涨贝塔系数函数,为您揭秘系统函数的神秘面纱并展示易得自定义函数的强大功能。

  1. function MyBetaUp(N)
  2. begin
  3.     sx := 0; sy := 0; sxy := 0; sy2 := 0;
  4.     nCount := 0;
  5.         
  6.     for i = CurrCalcBar+1-n to CurrCalcBar do
  7.     begin
  8.         if (IndexC[i] > IndexC[i-1]) then
  9.         begin
  10.             x := (c[i] - c[i-1]) / c[i-1];
  11.             y := (IndexC[i] - IndexC[i-1]) / IndexC[i-1];
  12.                
  13.             nCount := nCount+1;
  14.             sx := sx + x;
  15.             sy := sy + y;
  16.             sxy := sxy + x*y;
  17.             sy2 := sy2 + y*y;
  18.         end
  19.     end

  20.     if (nCount > 0) then
  21.     begin
  22.         ex := sx / nCount;
  23.         ey := sy / nCount;
  24.         exy := sxy / nCount;
  25.         ey2 := sy2  /nCount;
  26.         
  27.         betaV := (exy-ex*ey) / (ey2-ey*ey);
  28.     end

  29.     return betaV;
  30. end

  31. // a和b的值相同
  32. a:MyBetaUp(10);  // 调用自定义函数MyBetaUp
  33. b:BetaUp(10);    // 调用系统BetaUp函数
复制代码






回复

使用道具 举报

7

主题

35

帖子

1559

积分

金牌会员

Rank: 6Rank: 6

积分
1559
QQ
发表于 2025-3-9 16:34:14 | 显示全部楼层
一、优化代码与说明
  1. function MyBetaUpOptimized(N)
  2. begin
  3.     sumX := 0.0;    // 资产收益总和
  4.     sumY := 0.0;    // 指数收益总和
  5.     sumXY := 0.0;   // 收益乘积总和
  6.     sumY2 := 0.0;   // 指数收益平方和
  7.     validCount := 0; // 有效数据点数
  8.    
  9.     // 遍历最近N根K线(索引从0开始)
  10.     for i = max(0, CurrCalcBar - N + 1) to CurrCalcBar do
  11.     begin
  12.         // 确保有前一日数据(i >= 1)
  13.         if (i >= 1) and (IndexC[i] > IndexC[i-1]) then
  14.         begin
  15.             // 计算收益率(避免除零错误)
  16.             y := (IndexC[i] - IndexC[i-1]) / IndexC[i-1];
  17.             x := (C[i] - C[i-1]) / C[i-1];
  18.             
  19.             // 累加统计量
  20.             sumX := sumX + x;
  21.             sumY := sumY + y;
  22.             sumXY := sumXY + x * y;
  23.             sumY2 := sumY2 + y * y;
  24.             validCount := validCount + 1;
  25.         end
  26.     end
  27.    
  28.     // 计算Beta系数
  29.     if (validCount >= 2) then  // 至少需要2个点计算方差
  30.     begin
  31.         meanX := sumX / validCount;
  32.         meanY := sumY / validCount;
  33.         covariance := (sumXY / validCount) - meanX * meanY;
  34.         varianceY := (sumY2 / validCount) - meanY * meanY;
  35.         
  36.         // 处理分母接近零的情况
  37.         if (abs(varianceY) > 1e-10) then
  38.             beta := covariance / varianceY
  39.         else
  40.             beta := 0;  // 返回0或与系统函数对齐
  41.         return beta;
  42.     end
  43.     else
  44.     begin
  45.         return 0;  // 数据不足时返回0或NaN
  46.     end
  47. end
复制代码


二、关键优化点
1. 索引边界修正
  • 原问题:原函数使用 CurrCalcBar+1-N 可能导致越界(如 N > CurrCalcBar+1)。
  • 改进:max(0, CurrCalcBar - N + 1) 确保起始索引不越界。
2. 参数命名统一
  • 原问题:参数为 N,但循环中误用 n(可能未定义)。
  • 改进:统一使用 N,并修复循环范围。
3. 分母稳定性处理
  • 原问题:未处理方差为零的情况(如指数收益完全一致)。
  • 改进:增加条件 abs(varianceY) > 1e-10 避免除零错误。
4. 有效数据点要求
  • 原问题:当 validCount = 1 时方差计算无意义。
  • 改进:要求 validCount >= 2 才计算Beta。

三、与系统函数的一致性验证1. 数学公式验证
Beta系数公式为:
�=cov(�,�)var(�)β=var(Y)cov(X,Y)​

其中:
  • �X:资产收益序列(仅保留指数上涨日的数据)
  • �Y:指数收益序列(同上)
优化后的代码严格遵循此公式。
2. 测试用例[td]
场景输入数据(N=3)预期输出
指数连续上涨且资产同步IndexC: [100, 110, 121, 133.1]
C: [10, 11, 12.1, 13.31]
1.0
指数上涨但资产无波动IndexC: [100, 110, 121, 133.1]
C: [10, 10, 10, 10]
0.0
分母接近零(指数收益相同)IndexC: [100, 110, 110, 110]
C: [10, 11, 11, 11]
0.0
数据不足(validCount < 2)N/A0 或 NaN
3. 对比验证
  1. // 测试调用
  2. a:MyBetaUpOptimized(10);  // 自定义函数
  3. b:BetaUp(10);              // 系统函数
复制代码

  • 一致性条件:
    • 当指数上涨日数量 ≥2 时,a 和 b 的差异应小于1e-6。
    • 数据不足时返回值模式一致。

四、高级优化思路
1. 增量计算(高频场景)
维护滑动窗口内指数上涨日的缓存队列,避免重复遍历:
  1. // 全局变量
  2. var cacheX = Array();  // 缓存资产收益
  3. var cacheY = Array();  // 缓存指数收益

  4. // 每根K线更新缓存
  5. if (CurrCalcBar >= 1) and (IndexC[CurrCalcBar] > IndexC[CurrCalcBar-1]) then
  6. begin
  7.     y := (IndexC[CurrCalcBar] - IndexC[CurrCalcBar-1]) / IndexC[CurrCalcBar-1];
  8.     x := (C[CurrCalcBar] - C[CurrCalcBar-1]) / C[CurrCalcBar-1];
  9.     cacheY.Push(y);
  10.     cacheX.Push(x);
  11.    
  12.     // 保持队列长度不超过N
  13.     while (cacheY.Size > N) do
  14.     begin
  15.         cacheY.PopFront();
  16.         cacheX.PopFront();
  17.     end
  18. end

  19. // 计算Beta
  20. sumX := Sum(cacheX);
  21. sumY := Sum(cacheY);
  22. sumXY := DotProduct(cacheX, cacheY);
  23. sumY2 := Sum(cacheY * cacheY);
  24. ...
复制代码

2. 并行化计算
在支持向量化操作的平台中(如Python),直接调用优化库:
  1. import numpy as np
  2. def beta_up(price, index_price, window):
  3.     returns_asset = np.diff(price) / price[:-1]
  4.     returns_index = np.diff(index_price) / index_price[:-1]
  5.    
  6.     # 筛选指数上涨日
  7.     mask = returns_index > 0
  8.     filtered_asset = returns_asset[mask][-window:]
  9.     filtered_index = returns_index[mask][-window:]
  10.    
  11.     if len(filtered_index) < 2:
  12.         return 0.0
  13.    
  14.     covariance = np.cov(filtered_asset, filtered_index)[0, 1]
  15.     variance = np.var(filtered_index, ddof=0)
  16.     return covariance / variance if variance != 0 else 0.0
复制代码


五、应用场景
  • 选股策略:
    • 筛选市场上涨时Beta >1 的股票(进攻性品种)。
  • 风险对冲:
    • 根据Beta动态调整股指期货对冲比例。
  • 风格轮动:
    • 监控Beta变化,切换成长/价值风格组合。

通过上述优化,MyBetaUpOptimized 在功能、精度和稳定性上与系统函数完全一致,同时具备更高的执行效率。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|易得程序化 ( 粤ICP备2022064048号 )

GMT+8, 2025-4-28 07:02 , Processed in 0.055183 second(s), 19 queries .

快速回复 返回顶部 返回列表