{"id":18757215,"url":"https://github.com/jaantollander/conditionalvalueatrisk","last_synced_at":"2026-03-19T06:13:34.869Z","repository":{"id":48861362,"uuid":"295396178","full_name":"jaantollander/ConditionalValueAtRisk","owner":"jaantollander","description":"Provides a concrete Julia implementation for computing the conditional value-at-risk (aka expected shortfall) for discrete probability distributions. Also works as a pseudocode for other languages.","archived":false,"fork":false,"pushed_at":"2021-09-21T06:05:14.000Z","size":73,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-29T02:52:04.325Z","etag":null,"topics":["coherent-risk-measure","conditional-value-at-risk","expected-shortfall","risk-measure"],"latest_commit_sha":null,"homepage":"https://jaantollander.com/post/measuring-tail-risk-using-conditional-value-at-risk/","language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jaantollander.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-14T11:35:26.000Z","updated_at":"2022-12-05T01:13:44.000Z","dependencies_parsed_at":"2022-09-03T13:53:00.200Z","dependency_job_id":null,"html_url":"https://github.com/jaantollander/ConditionalValueAtRisk","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaantollander%2FConditionalValueAtRisk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaantollander%2FConditionalValueAtRisk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaantollander%2FConditionalValueAtRisk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaantollander%2FConditionalValueAtRisk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jaantollander","download_url":"https://codeload.github.com/jaantollander/ConditionalValueAtRisk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239646395,"owners_count":19674031,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coherent-risk-measure","conditional-value-at-risk","expected-shortfall","risk-measure"],"created_at":"2024-11-07T17:42:00.686Z","updated_at":"2025-11-30T23:30:12.982Z","avatar_url":"https://github.com/jaantollander.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Conditional Value-at-Risk\n![](images/distributions.svg)\n\nYou can copy The Julia code from the file [`conditional-value-at-risk`](conditional-value-at-risk.jl). The example below describes the implementation and how to use it. This repository is related to my article [*Measuring Tail-Risk Using Conditional Value at Risk*](https://jaantollander.com/post/measuring-tail-risk-using-conditional-value-at-risk/), which discusses the definition, properties and implementation of conditional value at risk in more detail.\n\nWe can implement the value-at-risk and conditional value-at-risk functions in [Julia](https://julialang.org/) for discrete probability distributions as follow.\n\n```julia\n\"\"\"Value-at-risk.\"\"\"\nfunction value_at_risk(x::Vector{Float64}, f::Vector{Float64}, α::Float64)\n    i = findfirst(p -\u003e p≥α, cumsum(f))\n    if i === nothing\n        return x[end]\n    else\n        return x[i]\n    end\nend\n\n\"\"\"Conditional value-at-risk.\"\"\"\nfunction conditional_value_at_risk(x::Vector{Float64}, f::Vector{Float64}, α::Float64)\n    x_α = value_at_risk(x, f, α)\n    if iszero(α)\n        return x_α\n    else\n        tail = x .≤ x_α\n        return (sum(x[tail] .* f[tail]) - (sum(f[tail]) - α) * x_α) / α\n    end\nend\n```\n\nLet us create a random discrete probability distribution.\n\n```julia\nnormalize(v) = v ./ sum(v)\nscale(v, low, high) = v * (high - low) + low\nn = 10\nx = sort(scale.(rand(n), -1.0, 1.0))\nf = normalize(rand(n))\nα = 0.05\n```\n\nNext, we assert that the inputs are valid. Note that the states `x` do not have to be unique for the formulation to work.\n\n```julia\n@assert issorted(x)\n@assert all(f .≥ 0)\n@assert sum(f) ≈ 1\n@assert 0 ≤ α ≤ 1\n```\n\nThen, executing the function in Julia REPL gives us a result.\n\n```text\njulia\u003e conditional_value_at_risk(x, f, α)\n-0.9911100750623101\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaantollander%2Fconditionalvalueatrisk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaantollander%2Fconditionalvalueatrisk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaantollander%2Fconditionalvalueatrisk/lists"}