mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-07-28 01:37:43 +00:00
72 lines
2.5 KiB
Plaintext
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)
|