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

added tests for risk analysis

parent c53b8804
...@@ -35,30 +35,3 @@ def risk_analysis(net_weight_series: pd.Series, ...@@ -35,30 +35,3 @@ def risk_analysis(net_weight_series: pd.Series,
explained_table = pd.DataFrame(explained_table * net_pos , columns=cols, index=net_weight_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) 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__':
from matplotlib import pyplot as plt
n_samples = 36000
n_dates = 20
n_risk_factors = 35
dates = np.sort(np.random.randint(n_dates, size=n_samples))
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]
aggregated_bars.sum().sort_values(ascending=False).plot(kind='bar', figsize=(16, 8))
exposure_table[top_sources.difference(['idiosyncratic'])].plot(figsize=(14, 7))
plt.show()
...@@ -5,6 +5,36 @@ Created on 2017-5-8 ...@@ -5,6 +5,36 @@ Created on 2017-5-8
@author: cheng.li @author: cheng.li
""" """
import unittest
import numpy as np
import pandas as pd
from alphamind.analysis.riskanalysis import risk_analysis from alphamind.analysis.riskanalysis import risk_analysis
class TestRiskAnalysis(unittest.TestCase):
def test_risk_analysis(self):
n_samples = 36000
n_dates = 20
n_risk_factors = 35
dates = np.sort(np.random.randint(n_dates, size=n_samples))
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)
to_explain = (weights_series - bm_series).multiply(next_bar_return_series, axis=0)
aggregated = explained_table.sum(axis=1)
np.testing.assert_array_almost_equal(to_explain.values, aggregated.values)
if __name__ == '__main__':
unittest.main()
...@@ -18,6 +18,7 @@ from alphamind.tests.portfolio.test_rankbuild import TestRankBuild ...@@ -18,6 +18,7 @@ from alphamind.tests.portfolio.test_rankbuild import TestRankBuild
from alphamind.tests.portfolio.test_percentbuild import TestPercentBuild from alphamind.tests.portfolio.test_percentbuild import TestPercentBuild
from alphamind.tests.portfolio.test_linearbuild import TestLinearBuild from alphamind.tests.portfolio.test_linearbuild import TestLinearBuild
from alphamind.tests.settlement.test_simplesettle import TestSimpleSettle from alphamind.tests.settlement.test_simplesettle import TestSimpleSettle
from alphamind.tests.analysis.test_riskanalysis import TestRiskAnalysis
if __name__ == '__main__': if __name__ == '__main__':
...@@ -27,6 +28,7 @@ if __name__ == '__main__': ...@@ -27,6 +28,7 @@ if __name__ == '__main__':
TestRankBuild, TestRankBuild,
TestPercentBuild, TestPercentBuild,
TestLinearBuild, TestLinearBuild,
TestSimpleSettle], TestSimpleSettle,
TestRiskAnalysis],
alpha_logger) alpha_logger)
runner.run() runner.run()
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