在 pine 脚本中计算 beta:我做错了什么?

问题描述 投票:0回答:3

我编写了以下 pine 脚本代码来计算 beta 比率,但我得到的结果对我来说似乎太小了。我在许多网站上检查了 beta 的定义,一切似乎都是正确的。我做错了什么?

//@version=4
study("BETA")

// % change for current symbol close
sym_change = roc(close, 1)

// getting close value for SP500
spx_close = security("SPX", timeframe.period, close)
// % change for SP500 close
spx_change = roc(spx_close, 1)

// arrays get instantiated on first script exec
var sym_chg_arr = array.new_float(0)
var spx_chg_arr = array.new_float(0)

// adding a new value to both arrays for each bar
array.push(sym_chg_arr, sym_change)
array.push(spx_chg_arr, spx_change)

covariance = array.covariance(sym_chg_arr, spx_chg_arr)
variance = array.variance(sym_chg_arr)

beta = covariance / variance

// plotting calculated beta
plot(beta, color=color.yellow, linewidth=2, histbase=0)
// plotting zero line
hline(0)

添加指向我用来实现上述代码的 beta 定义之一的链接 https://www.investopedia.com/ask/answers/102714/how-do-you-calculate-beta-excel.asp

pine-script
3个回答
1
投票

我认为你的长度是问题所在。雅虎每月使用 5 年的数据进行计算,这意味着“每月”期间的长度为 60。

现在正在做同样的事情...

编辑

只有在每月时间范围内,我才能获得与雅虎财经相同的价值。

// This source code is subject to the terms of the Mozilla Public 

License 2.0 at https://mozilla.org/MPL/2.0/
// © piram.manickam

//@version=4
study(title='BETA (SPX 5y)', overlay=true)
//Adapted from script written by Ricardo Santos

length = input(61)
smooth = input(1)

return_percent(src) =>
    change(src) * 100 / src[1]

instrument = security(syminfo.tickerid, "M", ema(close, smooth))
benchmark = security(input('SP:SPX'), "M", ema(close, smooth))

inst_return = return_percent(instrument)
bench_return = return_percent(benchmark)
avg_inst_return = sma(inst_return, length)
avg_bench_return = sma(bench_return, length)

sum = 0.0
for idx = length to 0
    inst_variance = inst_return[idx] - avg_inst_return
    bench_variance = bench_return[idx] - avg_bench_return
    sum := sum + inst_variance * bench_variance
  
covariance = sum/(length-1)
beta = covariance / variance(bench_return, length)

var testTable = table.new(position = position.top_right, columns = 2, rows = 1, bgcolor = color.yellow, border_width = 1)
if barstate.islast
    table.cell(table_id = testTable, column = 0, row = 0, text = "Beta is " + tostring(beta))
 
 
//plot(beta)

希望有帮助!


0
投票

Marco您是正确的,雅虎财经等各个网站上提供的贝塔值是使用每月收盘值计算的,具体来说是每 5 年一次。不管怎样,我还在我的脚本中发现了一个错误,因为方差必须根据基准计算,而不是安全性。下面是正确的脚本,当 timeframe.period =“1M”时,该脚本返回热门网站提供的 Beta 版。

//@version=4
study("BETA")

// % change for current symbol close
sym_change = roc(close, 1)

// getting close value for SP500
spx_close = security("SPX", timeframe.period, close)
// % change for SP500 close
spx_change = roc(spx_close, 1)

// arrays get instantiated on first script exec
var sym_chg_arr = array.new_float(0)
var spx_chg_arr = array.new_float(0)

// adding a new value to both arrays for each bar
array.push(sym_chg_arr, sym_change)
array.push(spx_chg_arr, spx_change)

// keeping only the last 60 months (5 years)
if(array.size(sym_chg_arr) == 61)
    array.shift(sym_chg_arr)

// keeping only the last 60 months (5 years)
if(array.size(spx_chg_arr) == 61)
    array.shift(spx_chg_arr)

covariance = array.covariance(sym_chg_arr, spx_chg_arr)
variance = array.variance(spx_chg_arr)

beta = covariance / variance

// plotting calculated beta
plot(beta, color=color.yellow, linewidth=2, histbase=0)
// plotting zero line
hline(0)

0
投票

有什么变化吗(pinescript 方面)?与我尝试过的其他计算相比,这曾经给我提供了完美的值或至少非常相似,但现在突然它的结果(值)低得多,以至于它根本不匹配任何数据。就像我看到的所有值都是负值,而我的观察列表中的真实值都是正值,为什么会发生这种变化?

© www.soinside.com 2019 - 2024. All rights reserved.