import%20marimo%0A%0A__generated_with%20%3D%20%220.13.15%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20cvxpy%20as%20cvx%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%20The%20Conditional%20Value%20at%20Risk%0A%0A%20%20%20%20https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FExpected_shortfall%0A%0A%20%20%20%20**Thomas%20Schmelzer**%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20The%20%24%5Calpha%3D0.99%24%20tail%20of%20a%20loss%20distribution%0A%20%20%20%20-----------------------------------------------%0A%20%20%20%20%3Cimg%20src%3D%22talk%2Ftail.jpg%22%20style%3D%22margin-left%3Aauto%3B%20margin-right%3Aauto%3B%20display%3Ablock%22%3E%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20*%20In%20this%20talk%20we%20assume%20losses%20are%20positive.%20Larger%20losses%2C%20more%20pain...%20We%20want%20negative%20losses!%0A%0A%20%20%20%20*%20The%20value%20at%20risk%20%24%5Cmathtt%7BVaR%7D_%7B%5Calpha%7D%24%20at%20level%20%24%5Calpha%24%20is%20(the%20smallest)%20loss%20such%20that%0A%20%20%20%20%24%5Calpha%20%5C%25%24%20of%20losses%20are%20smaller%20than%20%24%5Cmathtt%7BVaR%7D_%7B%5Calpha%7D%24.%0A%0A%20%20%20%20*%20This%20does%20not%20say%20anything%20about%20the%20magnitude%20of%20the%20losses%20larger%20than%20the%20%24%5Cmathtt%7BVaR%7D_%7B%5Calpha%7D%24.%0A%20%20%20%20We%20can%20only%20make%20statements%20about%20their%20number%3A%20%24n(1%20-%20%5Calpha)%24%0A%0A%20%20%20%20*%20The%20%24%5Cmathtt%7BVaR%7D_%7B%5Calpha%7D%24%20has%20some%20sever%20mathematical%20flaws.%20It's%20not%20sub-additive%2C%20it's%20not%20convex.%0A%20%20%20%20It's%20broken!%20However%2C%20the%20regulator%20embraced%20it.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20*%20We%20compute%20the%20mean%20of%20the%20largest%20%24n(1-%5Calpha)%24%20entries%20of%20a%20vector%20(or%20a%20optimal%20linear%20combination%20of%20vectors)%0A%20%20%20%20without%20ever%20sorting%20the%20entries%20of%20any%20vector.%0A%0A%20%20%20%20*%20The%20resulting%20convex%20program%20is%20linear.%0A%0A%20%20%20%20*%20This%20mean%20is%20called%20Conditional%20Value%20at%20Risk%20%24%5Cmathtt%7BCVaR%7D_%7B%5Calpha%7D%24%20and%20is%20an%20upper%20bound%0A%20%20%20%20for%20the%20Value%20at%20Risk%20%24%5Cmathtt%7BVaR%7D_%7B%5Calpha%7D%24.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20Given%20a%20vector%20%24%5Cmathbf%7Br%7D%24%20we%20introduce%20a%20free%20variable%20%24%5Cgamma%24%20and%20define%20the%20function%20%24f%24%20as%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20f(%5Cgamma)%20%3D%20%5Cgamma%20%2B%20%5Cfrac%7B1%7D%7Bn%5C%2C(1-%5Calpha)%7D%5Csum%20(r_i%20-%20%5Cgamma)%5E%7B%2B%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20This%20is%20a%20continuous%20and%20convex%20function%20(in%20%24%5Cgamma%24).%20The%20first%20derivative%20is%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20f%5E%7B'%7D(%5Cgamma)%20%3D%201%20-%20%5Cfrac%7B%5C%23%5Cleft%5C%7Br_i%20%5Cgeq%20%5Cgamma%5Cright%5C%7D%7D%7Bn%5C%2C(1-%5Calpha)%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20If%20%24%5Cgamma%24%20such%20that%20%24%5C%23%5C%7Br_i%20%5Cgeq%20%5Cgamma%5C%7D%3Dn%5C%2C(1-%5Calpha)%24%3A%0A%0A%20%20%20%20-%20%24%5Cgamma%24%20is%20a%20minimizer%20of%20%24f%24.%0A%20%20%20%20-%20%24f(%5Cgamma)%20%3D%5Cmathtt%7BCVaR%7D_%5Calpha(%5Cmathbf%7Br%7D)%24.%0A%0A%20%20%20%20In%20particular%3A%0A%0A%20%20%20%20*%20%24f(%5Cmathtt%7BVaR%7D_%5Calpha(%5Cmathbf%7Br%7D))%20%3D%20%5Cmathtt%7BCVaR%7D_%5Calpha(%5Cmathbf%7Br%7D)%24.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20f(gamma%2C%20returns%2C%20alpha%3D0.99)%3A%0A%20%20%20%20%20%20%20%20excess%20%3D%20returns%20-%20gamma%0A%20%20%20%20%20%20%20%20return%20gamma%20%2B%201.0%20%2F%20(len(returns)%20*%20(1%20-%20alpha))%20*%20excess%5Bexcess%20%3E%200%5D.sum()%0A%0A%20%20%20%20%23%20note%20that%20cvar%20%3D%20(3%2B4)%2F2%20%20and%20var%20%3D%20%3F%20...%20depends%20on%20your%20definition.%202%3F%2C%203%3F%2C%202.5%3F%0A%20%20%20%20_r%20%3D%20np.array(%5B-1.0%2C%202.0%2C%203.0%2C%202.0%2C%204.0%2C%202.0%2C%200.0%2C%201.0%2C%20-2.0%2C%20-2.0%5D)%0A%20%20%20%20_x%20%3D%20np.linspace(start%3D-1.0%2C%20stop%3D5.0%2C%20num%3D1000)%0A%20%20%20%20_v%20%3D%20np.array(%5Bf(gamma%3Dg%2C%20returns%3D_r%2C%20alpha%3D0.80)%20for%20g%20in%20_x%5D)%0A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20Before%20(using%20conic%20reformulation%20of%20the%20%24x%5E%2B%24%20function)%3A%0A%0A%20%20%20%20*%20%5Cbegin%7Balign%7D%5Cmathtt%7BCVaR%7D(%5Cmathbf%7Br%7D)%3D%5Cmin_%7B%5Cgamma%20%5Cin%20%5Cmathbb%7BR%7D%2C%20%5Cmathbf%7Bt%7D%20%5Cin%20%5Cmathbb%7BR%7D%5En%7D%20%5C%2C%26%5C%2C%20%5Cgamma%20%2B%0A%20%20%20%20%5Cfrac%7B1%7D%7Bn%5C%2C(1-%5Calpha)%7D%5Csum%20t_i%5C%5C%0A%20%20%20%20%5Ctext%7Bs.t.%20%7D%26t_i%20%5Cgeq%20r_i%20-%20%5Cgamma%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%5Cmathbf%7Bt%7D%5Cgeq%200%0A%20%20%20%20%5Cend%7Balign%7D%0A%0A%20%20%20%20Now%0A%0A%20%20%20%20*%20http%3A%2F%2Fwww.cvxpy.org%2Fen%2Flatest%2Ftutorial%2Ffunctions%2F%2C%20in%20particular%20the%20%24x%5E%7B%2B%7D%20%3D%20%5Cmax%5C%7B0%2Cx%5C%7D%24%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20_r%20%3D%20%5B-1.0%2C%202.0%2C%203.0%2C%202.0%2C%204.0%2C%202.0%2C%200.0%2C%201.0%2C%20-2.0%2C%20-2.0%5D%0A%0A%20%20%20%20_n%20%3D%20len(_r)%0A%20%20%20%20%23%20We%20are%20interested%20in%20CVaR%20for%20alpha%3D0.80%2C%20e.g.%20what's%20the%20mean%20of%20the%2020%25%20of%20the%20biggest%20losses%0A%20%20%20%20_alpha%20%3D%200.80%0A%0A%20%20%20%20%23%20introduce%20the%20variable%20for%20the%20var%0A%20%20%20%20_gamma%20%3D%20cvx.Variable(1)%0A%20%20%20%20_cvar%20%3D%20minimize(objective%3D_gamma%20%2B%201.0%20%2F%20int(_n%20*%20(1%20-%20_alpha))%20*%20cvx.sum(cvx.pos(_r%20-%20_gamma)))%0A%0A%20%20%20%20print(1.0%20%2F%20(_n%20*%20(1%20-%20_alpha)))%0A%20%20%20%20print(f%22A%20minimizer%20of%20f%20(%3C%3D%20VaR)%3A%20%20%7B_gamma.value%7D%22)%0A%20%20%20%20print(f%22Minimum%20of%20f%20(%3D%3D%20CVaR)%3A%20%20%20%20%20%7B_cvar%7D%22)%0A%0A%20%20%20%20_x%20%3D%20cvx.sum_largest(_r%2C%20k%3Dint(_n%20*%20(1%20-%20_alpha)))%0A%20%20%20%20print(_x.value)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20take%20some%20random%20return%20data%0A%20%20%20%20_r%20%3D%20np.random.randn(2500%2C%20100)%0A%20%20%20%20_n%2C%20_m%20%3D%20_r.shape%0A%0A%20%20%20%20%23%20We%20are%20interested%20in%20CVaR%20for%20alpha%3D0.95%2C%20e.g.%20what's%20the%20mean%20of%20the%205%25%20of%20the%20biggest%20losses%0A%20%20%20%20_alpha%20%3D%200.95%0A%20%20%20%20_k%20%3D%20int(_n%20*%20(1%20-%20_alpha))%0A%0A%20%20%20%20_gamma%2C%20_w%20%3D%20(cvx.Variable(1)%2C%20cvx.Variable(_m))%0A%20%20%20%20_constraints%20%3D%20%5B_w%20%3E%3D%200%2C%20cvx.sum(_w)%20%3D%3D%201%5D%0A%0A%20%20%20%20_obj%20%3D%20cvx.Minimize(_gamma%20%2B%20cvx.sum(cvx.pos(_r%20%40%20_w%20-%20_gamma))%20%2F%20_k)%0A%20%20%20%20_cvar%20%3D%20cvx.Problem(objective%3D_obj%2C%20constraints%3D_constraints).solve()%0A%20%20%20%20print(f%22CVaR%3A%20%7B_cvar%7D%22)%0A%0A%20%20%20%20_obj2%20%3D%20cvx.Minimize(cvx.sum_largest(_r%20%40%20_w%2C%20k%3D_k)%20%2F%20_k)%0A%20%20%20%20_cvar2%20%3D%20cvx.Problem(objective%3D_obj2%2C%20constraints%3D_constraints).solve()%0A%20%20%20%20print(f%22CVaR%202%3A%20%7B_cvar2%7D%22)%0A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20Summary%0A%20%20%20%20-------%0A%0A%20%20%20%20*%20We%20could%20compute%20the%20%24%5Cmathtt%7BCVaR%7D%24%20for%20a%20vector%20of%20length%20%24n%24%20by%20solving%20a%20linear%20program.%0A%0A%20%20%20%20*%20We%20do%20not%20need%20to%20sort%20the%20elements%20nor%20do%20we%20need%20to%20know%20the%20Value%20at%20Risk%20%24%5Cmathtt%7BVaR%7D%24.%0A%0A%20%20%20%20In%20practice%20the%20vector%20%24%5Cmathbf%7Br%7D%24%20is%20not%20given.%20Rather%20we%20have%20%24m%24%20assets%20and%20try%20to%20find%20a%20linear%20combination%0A%20%20%20%20of%20their%20corresponding%20return%20vectors%20such%20that%20the%20resulting%20portfolio%20has%20minimal%20Conditional%20Value%20at%20Risk.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20minimize(objective%2C%20constraints%3DNone)%3A%0A%20%20%20%20%22%22%22Minimizes%20a%20given%20objective%20function%20subject%20to%20optional%20constraints.%0A%0A%20%20%20%20This%20function%20creates%20and%20solves%20a%20convex%20optimization%20problem%20to%20find%20the%0A%20%20%20%20minimum%20value%20of%20the%20provided%20objective%20function%2C%20subject%20to%20any%20specified%0A%20%20%20%20constraints.%0A%0A%20%20%20%20Args%3A%0A%20%20%20%20%20%20%20%20objective%3A%20The%20objective%20function%20to%20minimize.%0A%20%20%20%20%20%20%20%20constraints%3A%20Optional%20list%20of%20constraints%20for%20the%20optimization%20problem.%0A%0A%20%20%20%20Returns%3A%0A%20%20%20%20%20%20%20%20The%20optimal%20value%20of%20the%20objective%20function.%0A%20%20%20%20%22%22%22%0A%20%20%20%20return%20cvx.Problem(cvx.Minimize(objective)%2C%20constraints).solve()%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
ed7247c0fb72e79b1b1b964cb9f2a1ddc4f06d357659429d071e0b7a5b198484