ta-lib-python icon indicating copy to clipboard operation
ta-lib-python copied to clipboard

beta function with high low price series or is this a typo?

Open qiuxiaomu opened this issue 3 years ago • 7 comments

Thanks for the great work!

I noticed that BETA function on your homepage comes with args of high and low, what do they refer to? CAPM beta normally goes with two different stocks' adjusted close or close price series.

Thank you!

qiuxiaomu avatar Dec 26 '21 16:12 qiuxiaomu

You can read about it here:

https://github.com/TA-Lib/ta-lib/blob/master/src/ta_func/ta_BETA.c#L207

   /** DESCRIPTION OF ALGORITHM:
    *   The Beta 'algorithm' is a measure of a stocks volatility vs from index. The stock prices
    *   are given in inReal0 and the index prices are give in inReal1. The size of these vectors
    *   should be equal. The algorithm is to calculate the change between prices in both vectors
    *   and then 'plot' these changes are points in the Euclidean plane. The x value of the point
    *   is market return and the y value is the security return. The beta value is the slope of a
    *   linear regression through these points. A beta of 1 is simple the line y=x, so the stock
    *   varies percisely with the market. A beta of less than one means the stock varies less than
    *   the market and a beta of more than one means the stock varies more than market. A related
    *   value is the Alpha value (see TA_ALPHA) which is the Y-intercept of the same linear regression.
    */

mrjbq7 avatar Dec 26 '21 17:12 mrjbq7

We call them real0 and real1:

Help on function BETA in module talib._ta_lib:

BETA(...)
    BETA(real0, real1[, timeperiod=?])
    
    Beta (Statistic Functions)
    
    Inputs:
        real0: (any ndarray)
        real1: (any ndarray)
    Parameters:
        timeperiod: 5
    Outputs:
        real

mrjbq7 avatar Dec 26 '21 17:12 mrjbq7

Looks like a bug in the docs, for some reason it says high/low.

mrjbq7 avatar Dec 26 '21 17:12 mrjbq7

that's what I read in code as well (when I ran into an exception with the args passed in). Thanks a lot!

qiuxiaomu avatar Dec 27 '21 08:12 qiuxiaomu

@mrjbq7 Hi John I agree that the docs need to be updated. Unfortunately I believe I have the right setup but am getting nan's as the output.

# get beta weight
@app.route('/dev/api/equity/beta', methods=["POST"])
@cross_origin(origin="*")
def get_beta():
    req = request.get_json()
    timeperiod = 5 # default 5
    indices = ['^GSPC','^DJI','^IXIC']
    named_indices = ['SPY500', 'DJI', 'NASDAQ']

    end_date = date.today()
    start_date = end_date - timedelta(days=timeperiod)
    req_prices = si.get_data(req['symbol'], start_date, end_date)
    arr = []
    i = 0

    for index in indices:
        index_prices = si.get_data(index, start_date, end_date)
        index_prices_array = index_prices['adjclose'].to_numpy()
        req_prices_array = req_prices['adjclose'].to_numpy()
        beta = talib.BETA(req_prices_array, index_prices_array, timeperiod)
        betaObj = {}
        betaObj[named_indices[i]] = beta[-1]
        arr.append(betaObj)
        i += 1
 
    return jsonify(arr)
    ```

mpaccione avatar Jan 16 '22 18:01 mpaccione

Do you have an example?

NaN in the beginning are required by look back period, NaN in the middle are because your data has NaN in the middle.

On Jan 16, 2022, at 10:26 AM, Michael Paccione @.***> wrote:

 @mrjbq7 Hi John I agree that the docs need to be updated. Unfortunately I believe I have the right setup but am getting nan's as the output.

get beta weight

@app.route('/dev/api/equity/beta', methods=["POST"]) @cross_origin(origin="*") def get_beta(): req = request.get_json() timeperiod = 5 # default 5 indices = ['^GSPC','^DJI','^IXIC'] named_indices = ['SPY500', 'DJI', 'NASDAQ']

end_date = date.today()
start_date = end_date - timedelta(days=timeperiod)
req_prices = si.get_data(req['symbol'], start_date, end_date)
arr = []
i = 0

for index in indices:
    index_prices = si.get_data(index, start_date, end_date)
    index_prices_array = index_prices['adjclose'].to_numpy()
    req_prices_array = req_prices['adjclose'].to_numpy()
    beta = talib.BETA(req_prices_array, index_prices_array, timeperiod)
    betaObj = {}
    betaObj[named_indices[i]] = beta[-1]
    arr.append(betaObj)
    i += 1

return jsonify(arr)
```

— Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android. You are receiving this because you were mentioned.

mrjbq7 avatar Jan 16 '22 18:01 mrjbq7

I believe it was a time period problem. I don't understand what the timeperiod param is in talib. Is this supposed to be days? The higher the timeperiod I put in the more nans I receive in the function.

mpaccione avatar Apr 18 '22 20:04 mpaccione