Files
QuanTAlib/lib/statistics/beta/beta.pine

72 lines
2.5 KiB
Plaintext

// Licensed under the Apache License, Version 2.0
// © mihakralj
//@version=6
indicator("Beta Function (BETA)", "BETA", overlay=false)
//@function Calculates the financial Beta indicator comparing src1 volatility to src2
//@param src1 series float Series to analyze
//@param src2 series float src2 series to compare against
//@param period simple int Lookback period for calculation
//@returns float Beta value showing src1 volatility relative to src2
//@optimized for performance and dirty data
beta(series float src1, series float src2, simple int period) =>
if period <= 0
runtime.error("Period must be greater than 0")
var float last_src1 = na
var float last_src2 = na
src1_return = last_src1 != 0 and not na(last_src1) ? (src1 - last_src1) / last_src1 : na
bench_return = last_src2 != 0 and not na(last_src2) ? (src2 - last_src2) / last_src2 : na
last_src1 := src1
last_src2 := src2
var int count = 0
var float sum_sr = 0.0, var float sum_br = 0.0
var float sum_sr2 = 0.0, var float sum_br2 = 0.0
var float sum_sbr = 0.0
var sr_buf = array.new_float(period)
var br_buf = array.new_float(period)
var int index = 0
if not na(src1_return) and not na(bench_return)
old_sr = array.get(sr_buf, index)
old_br = array.get(br_buf, index)
if count >= period
sum_sr -= old_sr, sum_br -= old_br
sum_sr2 -= old_sr * old_sr, sum_br2 -= old_br * old_br
sum_sbr -= old_sr * old_br
else
count += 1
sum_sr += src1_return, sum_br += bench_return
sum_sr2 += src1_return * src1_return
sum_br2 += bench_return * bench_return
sum_sbr += src1_return * bench_return
array.set(sr_buf, index, src1_return)
array.set(br_buf, index, bench_return)
index := (index + 1) % period
if count > 0
mean_sr = sum_sr / count
mean_br = sum_br / count
cov = (sum_sbr / count) - (mean_sr * mean_br)
var_bench = (sum_br2 / count) - (mean_br * mean_br)
if var_bench > 1e-10
cov / var_bench
else
na
else
na
// ---------- Main loop ----------
// Inputs
i_symbol = input.symbol("SPY", "src2 Symbol")
i_period = input.int(14, "Period", minval=1)
i_src1 = input.source(close, "src1")
// Get src2 data
src2Price = request.security(i_symbol, timeframe.period, close)
// Calculate beta
beta_value = beta(i_src1, src2Price, i_period)
// Plot
plot(beta_value, "Beta", color=color.yellow, linewidth=2)