# 使用numpy
import numpy as np
R = [0.01, 0.05, 0.02, -0.03]
var1 = np.var(R)
std1 = np.std(R)
#
# 使用pandas
import pandas as pd
R = pd.Series([0.01, 0.05, 0.02, -0.03])
var2 = R.var()
std2 = R.std()
import pandas as pd
import tushare as ts
pro = ts.pro_api()
wanke = pro.daily(ts_code='000002.SZ', start_date='20170101')
pingan = pro.daily(ts_code='601318.SH', start_date='20170101')
wanke.head()
#下行風險
def cal_downside_risk(r):_r = r.map(lambda x: x / 100)mean = _r.mean()r_adjust = _r.map(lambda x: min(x-mean, 0))risk = np.sqrt((r_adjust ** 2).mean())return riskwanke_risk = cal_downside_risk(wanke.pct_chg)
pingan_risk = cal_downside_risk(pingan.pct_chg)
print('萬科下行風險:', wanke_risk)
print('平安下行風險:', pingan_risk)
#風險價值
# 歷史模擬法
wanke_var = wanke.pct_chg.quantile(0.05) / 100
pingan_var = pingan.pct_chg.quantile(0.05) / 100
print('歷史模擬法')
print('萬科VaR(0.05,1天):', wanke_var)
print('平安VaR(0.05,1天):', pingan_var)
#
# 協方差矩陣法
from scipy.stats import norm
wanke_var = norm.ppf(0.05, wanke.pct_chg.mean(), wanke.pct_chg.std()) / 100
pingan_var = norm.ppf(0.05, pingan.pct_chg.mean(), pingan.pct_chg.std()) / 100
print('協方差矩陣法')
print('萬科VaR(0.05,1天):', wanke_var)
print('平安VaR(0.05,1天):', pingan_var)
,pandas Series對象的quantile()方法會返回分位數,在前邊我們已經明確,歷史模擬法計算VaR直接求0.05分位數即可;pandas Series對象的mean()方法和std()方法分別返回其均值和標準差;scipy.stats.norm函數可以根據我們輸入的置信區間、均值和標準差來求得對應的分位數。
#期望虧空
VaR_wanke = wanke.pct_chg.quantile(0.05)
ES_wanke = wanke.query('pct_chg <= @VaR_wanke')['pct_chg'].mean()
print('萬科近兩年風險價值:', VaR_wanke)
print('萬科近兩年期望虧空:', ES_wanke)
#最大回撤
import pandas as pd
import tushare as ts
pro = ts.pro_api()
index_sh = pro.index_daily(ts_code='000001.SH', start_date='20180101')
index_sh.index = pd.to_datetime(index_sh.trade_date)
index_sh = index_sh.sort_index(ascending=True)
index_sh.head()
value = (index_sh.pct_chg / 100 + 1).cumprod()
value.plot();
MDD = (value.cummax() - value).max()
print('最大回撤:', MDD)
mdd = ((value.cummax() - value) / value.cummax()).max()
print('最大回撤率:', mdd)