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



我已经编写了以下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

我认为你的长度是问题所在。雅虎每月计算5y的数据,这意味着长度为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)

希望有帮助!

Marco,你是正确的,在雅虎财经等不同网站上提供的测试版是使用每月接近值计算的,具体来说是5年的间隔。无论如何,我也在我的脚本中发现了一个错误,因为方差必须在基准上计算,而不是在安全性上。下面的正确脚本,其中返回流行网站提供的测试版时的时间框架。

//@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)

相关内容

最新更新