or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

constraints-advanced.mdhierarchical-clustering.mdindex.mdparameter-estimation.mdplotting-visualization.mdportfolio-optimization.mdreports.mdrisk-functions.md

risk-functions.mddocs/

0

# Risk Functions

1

2

Comprehensive collection of 45+ risk measures and portfolio analysis functions including dispersion measures, downside risk measures, drawdown measures, range measures, and performance metrics for quantitative portfolio risk analysis.

3

4

## Capabilities

5

6

### Dispersion Risk Measures

7

8

Risk measures based on the distribution of returns around the mean.

9

10

```python { .api }

11

def MAD(X):

12

"""

13

Mean Absolute Deviation.

14

15

Parameters:

16

- X (DataFrame): Returns data

17

18

Returns:

19

float: MAD risk measure

20

"""

21

22

def SemiDeviation(X, MAR=0):

23

"""

24

Semi-standard deviation (downside deviation).

25

26

Parameters:

27

- X (DataFrame): Returns data

28

- MAR (float): Minimum acceptable return

29

30

Returns:

31

float: Semi-deviation

32

"""

33

34

def Kurtosis(X):

35

"""

36

Square root of kurtosis.

37

38

Parameters:

39

- X (DataFrame): Returns data

40

41

Returns:

42

float: Square root of kurtosis

43

"""

44

45

def SemiKurtosis(X, MAR=0):

46

"""

47

Square root of semi-kurtosis.

48

49

Parameters:

50

- X (DataFrame): Returns data

51

- MAR (float): Minimum acceptable return

52

53

Returns:

54

float: Square root of semi-kurtosis

55

"""

56

57

def GMD(X):

58

"""

59

Gini Mean Difference.

60

61

Parameters:

62

- X (DataFrame): Returns data

63

64

Returns:

65

float: Gini Mean Difference

66

"""

67

```

68

69

### Downside Risk Measures

70

71

Risk measures focusing on negative returns and tail risks.

72

73

```python { .api }

74

def VaR_Hist(X, alpha=0.05):

75

"""

76

Historical Value at Risk.

77

78

Parameters:

79

- X (DataFrame): Returns data

80

- alpha (float): Significance level

81

82

Returns:

83

float: Value at Risk

84

"""

85

86

def CVaR_Hist(X, alpha=0.05):

87

"""

88

Historical Conditional Value at Risk (Expected Shortfall).

89

90

Parameters:

91

- X (DataFrame): Returns data

92

- alpha (float): Significance level

93

94

Returns:

95

float: Conditional Value at Risk

96

"""

97

98

def WR(X):

99

"""

100

Worst Realization (minimum return).

101

102

Parameters:

103

- X (DataFrame): Returns data

104

105

Returns:

106

float: Worst realization

107

"""

108

109

def LPM(X, MAR=0, p=1):

110

"""

111

Lower Partial Moment.

112

113

Parameters:

114

- X (DataFrame): Returns data

115

- MAR (float): Minimum acceptable return

116

- p (float): Moment order

117

118

Returns:

119

float: Lower partial moment

120

"""

121

122

def Entropic_RM(X, z=1, alpha=0.05):

123

"""

124

Entropic Risk Measure.

125

126

Parameters:

127

- X (DataFrame): Returns data

128

- z (float): Entropic parameter

129

- alpha (float): Significance level

130

131

Returns:

132

float: Entropic risk measure

133

"""

134

135

def EVaR_Hist(X, alpha=0.05, solver="CLARABEL"):

136

"""

137

Entropic Value at Risk.

138

139

Parameters:

140

- X (DataFrame): Returns data

141

- alpha (float): Significance level

142

- solver (str): Optimization solver (default: "CLARABEL")

143

144

Returns:

145

float: Entropic Value at Risk

146

"""

147

148

def RLVaR_Hist(X, alpha=0.05, kappa=0.30, solver="CLARABEL"):

149

"""

150

Relativistic Value at Risk.

151

152

Parameters:

153

- X (DataFrame): Returns data

154

- alpha (float): Significance level

155

- kappa (float): Deformation parameter

156

- solver (str): Optimization solver (default: "CLARABEL")

157

158

Returns:

159

float: Relativistic Value at Risk

160

"""

161

```

162

163

### Drawdown Risk Measures

164

165

Risk measures based on peak-to-trough declines in portfolio value.

166

167

```python { .api }

168

def MDD_Abs(X):

169

"""

170

Maximum Drawdown (absolute).

171

172

Parameters:

173

- X (DataFrame): Returns data

174

175

Returns:

176

float: Maximum drawdown

177

"""

178

179

def ADD_Abs(X):

180

"""

181

Average Drawdown (absolute).

182

183

Parameters:

184

- X (DataFrame): Returns data

185

186

Returns:

187

float: Average drawdown

188

"""

189

190

def DaR_Abs(X, alpha=0.05):

191

"""

192

Drawdown at Risk (absolute).

193

194

Parameters:

195

- X (DataFrame): Returns data

196

- alpha (float): Significance level

197

198

Returns:

199

float: Drawdown at Risk

200

"""

201

202

def CDaR_Abs(X, alpha=0.05):

203

"""

204

Conditional Drawdown at Risk (absolute).

205

206

Parameters:

207

- X (DataFrame): Returns data

208

- alpha (float): Significance level

209

210

Returns:

211

float: Conditional Drawdown at Risk

212

"""

213

214

def EDaR_Abs(X, alpha=0.05):

215

"""

216

Entropic Drawdown at Risk (absolute).

217

218

Parameters:

219

- X (DataFrame): Returns data

220

- alpha (float): Significance level

221

222

Returns:

223

float: Entropic Drawdown at Risk

224

"""

225

226

def RLDaR_Abs(X, alpha=0.05, kappa=0.30):

227

"""

228

Relativistic Drawdown at Risk (absolute).

229

230

Parameters:

231

- X (DataFrame): Returns data

232

- alpha (float): Significance level

233

- kappa (float): Deformation parameter

234

235

Returns:

236

float: Relativistic Drawdown at Risk

237

"""

238

239

def UCI_Abs(X):

240

"""

241

Ulcer Index (absolute).

242

243

Parameters:

244

- X (DataFrame): Returns data

245

246

Returns:

247

float: Ulcer Index

248

"""

249

250

# Relative Drawdown Functions

251

def MDD_Rel(X):

252

"""

253

Maximum Drawdown (relative/compounded).

254

255

Parameters:

256

- X (DataFrame): Returns data

257

258

Returns:

259

float: Relative maximum drawdown

260

"""

261

262

def ADD_Rel(X):

263

"""

264

Average Drawdown (relative/compounded).

265

266

Parameters:

267

- X (DataFrame): Returns data

268

269

Returns:

270

float: Relative average drawdown

271

"""

272

273

def DaR_Rel(X, alpha=0.05):

274

"""

275

Drawdown at Risk (relative/compounded).

276

277

Parameters:

278

- X (DataFrame): Returns data

279

- alpha (float): Significance level

280

281

Returns:

282

float: Relative Drawdown at Risk

283

"""

284

285

def CDaR_Rel(X, alpha=0.05):

286

"""

287

Conditional Drawdown at Risk (relative/compounded).

288

289

Parameters:

290

- X (DataFrame): Returns data

291

- alpha (float): Significance level

292

293

Returns:

294

float: Relative Conditional Drawdown at Risk

295

"""

296

297

def EDaR_Rel(X, alpha=0.05, solver="CLARABEL"):

298

"""

299

Entropic Drawdown at Risk (relative/compounded).

300

301

Parameters:

302

- X (DataFrame): Returns data

303

- alpha (float): Significance level

304

- solver (str): Optimization solver

305

306

Returns:

307

float: Relative Entropic Drawdown at Risk

308

"""

309

310

def RLDaR_Rel(X, alpha=0.05, kappa=0.30, solver="CLARABEL"):

311

"""

312

Relativistic Drawdown at Risk (relative/compounded).

313

314

Parameters:

315

- X (DataFrame): Returns data

316

- alpha (float): Significance level

317

- kappa (float): Deformation parameter

318

- solver (str): Optimization solver

319

320

Returns:

321

float: Relative Relativistic Drawdown at Risk

322

"""

323

324

def UCI_Rel(X):

325

"""

326

Ulcer Index (relative/compounded).

327

328

Parameters:

329

- X (DataFrame): Returns data

330

331

Returns:

332

float: Relative Ulcer Index

333

"""

334

335

# Additional Missing Functions

336

def VRG(X, alpha=0.05, beta=0.05):

337

"""

338

VaR Range (VaR of gains - VaR of losses).

339

340

Parameters:

341

- X (DataFrame): Returns data

342

- alpha (float): Significance level for losses

343

- beta (float): Significance level for gains

344

345

Returns:

346

float: VaR Range

347

"""

348

```

349

350

### Range Risk Measures

351

352

Risk measures based on the range and spread of returns distribution.

353

354

```python { .api }

355

def TG(X, alpha=0.05):

356

"""

357

Tail Gini coefficient.

358

359

Parameters:

360

- X (DataFrame): Returns data

361

- alpha (float): Significance level

362

363

Returns:

364

float: Tail Gini

365

"""

366

367

def RG(X):

368

"""

369

Range (max - min).

370

371

Parameters:

372

- X (DataFrame): Returns data

373

374

Returns:

375

float: Range

376

"""

377

378

def CVRG(X, alpha=0.05, beta=0.05):

379

"""

380

CVaR Range (CVaR of gains - CVaR of losses).

381

382

Parameters:

383

- X (DataFrame): Returns data

384

- alpha (float): Significance level for losses

385

- beta (float): Significance level for gains

386

387

Returns:

388

float: CVaR Range

389

"""

390

391

def TGRG(X, alpha=0.05, a_sim=100):

392

"""

393

Tail Gini Range.

394

395

Parameters:

396

- X (DataFrame): Returns data

397

- alpha (float): Significance level

398

- a_sim (int): Number of simulations

399

400

Returns:

401

float: Tail Gini Range

402

"""

403

404

def EVRG(X, alpha=0.05, beta=0.05):

405

"""

406

Entropic Value at Risk Range.

407

408

Parameters:

409

- X (DataFrame): Returns data

410

- alpha (float): Significance level for losses

411

- beta (float): Significance level for gains

412

413

Returns:

414

float: Entropic VaR Range

415

"""

416

417

def RVRG(X, alpha=0.05, beta=0.05, kappa=0.30):

418

"""

419

Relativistic Value at Risk Range.

420

421

Parameters:

422

- X (DataFrame): Returns data

423

- alpha (float): Significance level for losses

424

- beta (float): Significance level for gains

425

- kappa (float): Deformation parameter

426

427

Returns:

428

float: Relativistic VaR Range

429

"""

430

```

431

432

### Portfolio Analysis Functions

433

434

Functions for portfolio performance analysis and risk decomposition.

435

436

```python { .api }

437

def Sharpe(X, rf=0):

438

"""

439

Sharpe ratio.

440

441

Parameters:

442

- X (DataFrame): Returns data

443

- rf (float): Risk-free rate

444

445

Returns:

446

float: Sharpe ratio

447

"""

448

449

def Sharpe_Risk(X, rm='MV', rf=0, alpha=0.05):

450

"""

451

Sharpe ratio with custom risk measure.

452

453

Parameters:

454

- X (DataFrame): Returns data

455

- rm (str): Risk measure code

456

- rf (float): Risk-free rate

457

- alpha (float): Significance level

458

459

Returns:

460

float: Risk-adjusted Sharpe ratio

461

"""

462

463

def Risk_Contribution(w, cov, rm='MV', alpha=0.05):

464

"""

465

Risk contribution analysis.

466

467

Parameters:

468

- w (DataFrame): Portfolio weights

469

- cov (DataFrame): Covariance matrix

470

- rm (str): Risk measure

471

- alpha (float): Significance level

472

473

Returns:

474

DataFrame: Risk contributions by asset

475

"""

476

477

def Risk_Margin(w, cov, alpha=0.05):

478

"""

479

Risk margin calculation.

480

481

Parameters:

482

- w (DataFrame): Portfolio weights

483

- cov (DataFrame): Covariance matrix

484

- alpha (float): Significance level

485

486

Returns:

487

DataFrame: Risk margins

488

"""

489

490

def Factors_Risk_Contribution(w, cov, B, rm='MV'):

491

"""

492

Factor risk contribution analysis.

493

494

Parameters:

495

- w (DataFrame): Portfolio weights

496

- cov (DataFrame): Factor covariance matrix

497

- B (DataFrame): Factor loadings

498

- rm (str): Risk measure

499

500

Returns:

501

DataFrame: Factor risk contributions

502

"""

503

504

def BrinsonAttribution(Ra, Rb, Wa, Wb):

505

"""

506

Brinson performance attribution analysis.

507

508

Parameters:

509

- Ra (DataFrame): Portfolio returns

510

- Rb (DataFrame): Benchmark returns

511

- Wa (DataFrame): Portfolio weights

512

- Wb (DataFrame): Benchmark weights

513

514

Returns:

515

DataFrame: Attribution analysis results

516

"""

517

518

def NEA(w):

519

"""

520

Number of Effective Assets.

521

522

Parameters:

523

- w (DataFrame): Portfolio weights

524

525

Returns:

526

float: Number of effective assets

527

"""

528

529

def L_Moment(X, k=4):

530

"""

531

L-moments calculation.

532

533

Parameters:

534

- X (DataFrame): Returns data

535

- k (int): Number of L-moments

536

537

Returns:

538

DataFrame: L-moments

539

"""

540

541

def L_Moment_CRM(X, w, k=4):

542

"""

543

L-moment coherent risk measure.

544

545

Parameters:

546

- X (DataFrame): Returns data

547

- w (DataFrame): L-moment weights

548

- k (int): Number of L-moments

549

550

Returns:

551

float: L-moment risk measure

552

"""

553

```

554

555

## Usage Example

556

557

```python

558

import riskfolio as rp

559

import pandas as pd

560

import numpy as np

561

562

# Load returns data

563

returns = pd.read_csv('returns.csv', index_col=0, parse_dates=True)

564

565

# Calculate various risk measures

566

portfolio_returns = returns.mean(axis=1) # Equal-weighted portfolio

567

568

# Dispersion measures

569

mad_risk = rp.MAD(portfolio_returns)

570

semi_dev = rp.SemiDeviation(portfolio_returns, MAR=0)

571

gmd_risk = rp.GMD(portfolio_returns)

572

573

# Downside measures

574

var_95 = rp.VaR_Hist(portfolio_returns, alpha=0.05)

575

cvar_95 = rp.CVaR_Hist(portfolio_returns, alpha=0.05)

576

worst_return = rp.WR(portfolio_returns)

577

578

# Drawdown measures

579

max_dd = rp.MDD_Abs(portfolio_returns)

580

avg_dd = rp.ADD_Abs(portfolio_returns)

581

cdar_95 = rp.CDaR_Abs(portfolio_returns, alpha=0.05)

582

583

# Performance measures

584

sharpe_ratio = rp.Sharpe(portfolio_returns, rf=0.02)

585

sharpe_cvar = rp.Sharpe_Risk(portfolio_returns, rm='CVaR', rf=0.02)

586

587

print(f"MAD: {mad_risk:.4f}")

588

print(f"VaR (95%): {var_95:.4f}")

589

print(f"CVaR (95%): {cvar_95:.4f}")

590

print(f"Max Drawdown: {max_dd:.4f}")

591

print(f"Sharpe Ratio: {sharpe_ratio:.4f}")

592

593

# Portfolio risk contribution analysis

594

port = rp.Portfolio(returns=returns)

595

port.assets_stats()

596

w = port.optimization(obj='Sharpe', rm='CVaR')

597

598

# Calculate risk contributions

599

risk_contrib = rp.Risk_Contribution(w, port.cov, rm='CVaR')

600

print("\nRisk Contributions:")

601

print(risk_contrib.sort_values('Risk', ascending=False).head())

602

```

603

604

## Risk Measure Codes

605

606

```python

607

# Available risk measures

608

rmeasures = [

609

"MV", # Mean Variance (Standard Deviation)

610

"KT", # Square Root Kurtosis

611

"MAD", # Mean Absolute Deviation

612

"GMD", # Gini Mean Difference

613

"MSV", # Mean Square Variation

614

"SKT", # Square Root Semi-Kurtosis

615

"FLPM", # First Lower Partial Moment

616

"SLPM", # Second Lower Partial Moment

617

"CVaR", # Conditional Value at Risk

618

"TG", # Tail Gini

619

"EVaR", # Entropic Value at Risk

620

"RLVaR", # Relativistic Value at Risk

621

"WR", # Worst Realization

622

"CVRG", # CVaR Range

623

"TGRG", # Tail Gini Range

624

"EVRG", # Entropic VaR Range

625

"RVRG", # Relativistic VaR Range

626

"RG", # Range

627

"MDD", # Maximum Drawdown

628

"ADD", # Average Drawdown

629

"CDaR", # Conditional Drawdown at Risk

630

"EDaR", # Entropic Drawdown at Risk

631

"RLDaR", # Relativistic Drawdown at Risk

632

"UCI" # Ulcer Index

633

]

634

```