Commit c53b8804 authored by Dr.李's avatar Dr.李

modified risk analysis implementation

parent 9391fbd1
...@@ -11,16 +11,16 @@ import pandas as pd ...@@ -11,16 +11,16 @@ import pandas as pd
from alphamind.data.neutralize import neutralize from alphamind.data.neutralize import neutralize
def risk_analysis(return_series: pd.Series, def risk_analysis(net_weight_series: pd.Series,
risk_return_table: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame]: next_bar_return_series: pd.Series,
risk_table: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame]:
group_idx = return_series.index.values.astype(int) group_idx = net_weight_series.index.values.astype(int)
return_values = return_series.values net_pos = net_weight_series.values.reshape((-1, 1))
risk_return_values = risk_return_table.values risk_factor_cols = risk_table.columns
risk_factor_cols = risk_return_table.columns
idiosyncratic, other_stats = neutralize(risk_return_values, idiosyncratic, other_stats = neutralize(risk_table.values,
return_values, next_bar_return_series.values,
group_idx, group_idx,
output_exposure=True, output_exposure=True,
output_explained=True) output_explained=True)
...@@ -32,25 +32,27 @@ def risk_analysis(return_series: pd.Series, ...@@ -32,25 +32,27 @@ def risk_analysis(return_series: pd.Series,
cols = ['idiosyncratic'] cols = ['idiosyncratic']
cols.extend(risk_factor_cols) cols.extend(risk_factor_cols)
explained_table = pd.DataFrame(explained_table, columns=cols, index=return_series.index) explained_table = pd.DataFrame(explained_table * net_pos , columns=cols, index=net_weight_series.index)
exposure_table = pd.DataFrame(exposure[:, :, 0], columns=risk_factor_cols, index=return_series.index) exposure_table = pd.DataFrame(exposure[:, :, 0] * net_pos, columns=risk_factor_cols, index=net_weight_series.index)
return explained_table, exposure_table.groupby(level=0).first() return explained_table, exposure_table.groupby(level=0).first()
if __name__ == '__main__': if __name__ == '__main__':
from matplotlib import pyplot as plt from matplotlib import pyplot as plt
n_samples = 360000 n_samples = 36000
n_dates = 200 n_dates = 20
n_risk_factors = 35 n_risk_factors = 35
dates = np.sort(np.random.randint(n_dates, size=n_samples)) dates = np.sort(np.random.randint(n_dates, size=n_samples))
return_series = pd.Series(data=np.random.randn(n_samples), index=dates) weights_series = pd.Series(data=np.random.randn(n_samples), index=dates)
risk_return_table = pd.DataFrame(data=np.random.randn(n_samples, n_risk_factors), bm_series = pd.Series(data=np.random.randn(n_samples), index=dates)
next_bar_return_series = pd.Series(data=np.random.randn(n_samples), index=dates)
risk_table = pd.DataFrame(data=np.random.randn(n_samples, n_risk_factors),
columns=list(range(n_risk_factors)), columns=list(range(n_risk_factors)),
index=dates) index=dates)
explained_table, exposure_table = risk_analysis(return_series, risk_return_table) explained_table, exposure_table = risk_analysis(weights_series - bm_series, next_bar_return_series, risk_table)
aggregated_bars = explained_table.groupby(level=0).sum() aggregated_bars = explained_table.groupby(level=0).sum()
top_sources = aggregated_bars.sum().abs().sort_values(ascending=False).index[:10] top_sources = aggregated_bars.sum().abs().sort_values(ascending=False).index[:10]
......
# -*- coding: utf-8 -*-
"""
Created on 2017-5-8
@author: cheng.li
"""
# -*- coding: utf-8 -*-
"""
Created on 2017-5-8
@author: cheng.li
"""
from alphamind.analysis.riskanalysis import risk_analysis
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment