Back to Community
How can I build a function to calculate weighted standard deviation/coefficient of variation?

I actually want to calculate exponential weighted coefficient of variation. The market volatility is related with normal coefficient of variation. Now I want to see if it is more volatile with more recent price change.

hist_spy = data.history(spy, 'price', 30 , '1m')
std = hist.std()
mean = hist.mean()
cov = std/mean

Could anyone give me some hints to build a weighted one?

2 responses

One can get exponentially weighted values by using the pandas ewmmethod (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.ewm.html). So something like this would work.

spy = symbol('SPY')  
hist_spy = get_pricing(spy, 'price', 30, '1m')  
std = hist_spy.std()  
mean = hist_spy.mean()

# adjust the weighting with any of the ewm parameters as desired  
# Take only the last value (ie -1)  
ewma = hist_spy.ewm(span=1).mean().iat[-1]  
cov = std/mean

# The exponentially weighted coefficient of variation  
ewm_cov = std/ewma

One can also do something similar but using daily pipeline data and the ExponentialWeightedMovingAverage factor (https://www.quantopian.com/docs/api-reference/pipeline-api-reference#quantopian.pipeline.factors.ExponentialWeightedMovingAverage). No need for a custom factor.

You will need to specify the weighting decay as desired. The pandas documentation has some examples. May want to implement in a notebook first to view the results and verify they are doing what you want.

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

Thanks, Dan. I dont know there's such easy way to do it.

ewma = hist_spy.ewm(span=1).mean().iat[-1]
ewmstd = hist_spy.ewm(span=1).std().iat[-1]
ewm_cov = ewmstd/ewma