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

modified risk analysis implementation

parent 9391fbd1
......@@ -11,16 +11,16 @@ import pandas as pd
from alphamind.data.neutralize import neutralize
def risk_analysis(return_series: pd.Series,
risk_return_table: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame]:
def risk_analysis(net_weight_series: pd.Series,
next_bar_return_series: pd.Series,
risk_table: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame]:
group_idx = return_series.index.values.astype(int)
return_values = return_series.values
risk_return_values = risk_return_table.values
risk_factor_cols = risk_return_table.columns
group_idx = net_weight_series.index.values.astype(int)
net_pos = net_weight_series.values.reshape((-1, 1))
risk_factor_cols = risk_table.columns
idiosyncratic, other_stats = neutralize(risk_return_values,
return_values,
idiosyncratic, other_stats = neutralize(risk_table.values,
next_bar_return_series.values,
group_idx,
output_exposure=True,
output_explained=True)
......@@ -32,25 +32,27 @@ def risk_analysis(return_series: pd.Series,
cols = ['idiosyncratic']
cols.extend(risk_factor_cols)
explained_table = pd.DataFrame(explained_table, columns=cols, index=return_series.index)
exposure_table = pd.DataFrame(exposure[:, :, 0], columns=risk_factor_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] * net_pos, columns=risk_factor_cols, index=net_weight_series.index)
return explained_table, exposure_table.groupby(level=0).first()
if __name__ == '__main__':
from matplotlib import pyplot as plt
n_samples = 360000
n_dates = 200
n_samples = 36000
n_dates = 20
n_risk_factors = 35
dates = np.sort(np.random.randint(n_dates, size=n_samples))
return_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),
columns=list(range(n_risk_factors)),
index=dates)
explained_table, exposure_table = risk_analysis(return_series, risk_return_table)
weights_series = pd.Series(data=np.random.randn(n_samples), index=dates)
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)),
index=dates)
explained_table, exposure_table = risk_analysis(weights_series - bm_series, next_bar_return_series, risk_table)
aggregated_bars = explained_table.groupby(level=0).sum()
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