robertmartin8 / PyPortfolioOpt

Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity
https://pyportfolioopt.readthedocs.io/
MIT License
4.28k stars 930 forks source link

Possibility to adjust Sharpe Ratio by ESG parameter? #444

Closed lealik closed 2 years ago

lealik commented 2 years ago

Hi,

I am trying to do a portfolio optimization based on an ESG adjusted Sharpe Ratio. Hereby, I was wondering whether it is possible to adjust the Sharpe Ratio as the following:

SR= ((μ- rf)/σ) + (ESG/σ)

Before finding this portfolio optimiser, I have tried to do it based on a Monte Carlo simulation using the following optimisation function:

optimal_portfolio = portfolios.iloc[(((portfolios['Returns']-rf)/portfolios['Volatility'])+(portfolio ['ESG Score']/portfolios['Volatility'])).idxmax()]

which however did not lead to sufficient results, due to the size of our investment universe (around 500 stocks).

Many thanks for your help in advance!

Best, Lea

robertmartin8 commented 2 years ago

Conceptually, it seems a bit strange to do it that way unless your ESG score has the same units as return.

For example, let's say your ESG scores are 1,2,3,4,5. Since returns are of order 10%, the result would be an optimiser that focuses primarily on ESG score divided by volatility.

In my view, it would make more sense to use ESG as a constraint: maximise the Sharpe ratio of the portfolio subject to an ESG constraint.

Alternatively, a nice trick might be to embed ESG into the expected returns vector. e.g you may decide "1 ESG point" is worth an extra 1% return, then just add this to the expected returns. This may seem arbitrary, but it is no different to the original proposed optimisation.

Interesting question!

lealik commented 2 years ago

Yes, we adjusted the ESG scores such that they have the same unit as returns.

But thanks, the idea of embedding ESG into the expected return vector is great!