@@ -42,12 +42,15 @@ def test_perf_attrib_simple(self):
42
42
43
43
expected_perf_attrib_output = pd .DataFrame (
44
44
index = dts ,
45
- columns = ['risk_factor1' , 'risk_factor2' , 'common_returns' ,
46
- 'specific_returns' , 'total_returns' ],
45
+ columns = ['risk_factor1' , 'risk_factor2' , 'total_returns' ,
46
+ 'common_returns' , 'specific_returns' ,
47
+ 'tilt_returns' , 'timing_returns' ],
47
48
data = {'risk_factor1' : [0.025 , 0.025 ],
48
49
'risk_factor2' : [0.025 , 0.025 ],
49
50
'common_returns' : [0.05 , 0.05 ],
50
51
'specific_returns' : [0.05 , 0.05 ],
52
+ 'tilt_returns' : [0.05 , 0.05 ],
53
+ 'timing_returns' : [0.0 , 0.0 ],
51
54
'total_returns' : returns }
52
55
)
53
56
@@ -79,12 +82,15 @@ def test_perf_attrib_simple(self):
79
82
80
83
expected_perf_attrib_output = pd .DataFrame (
81
84
index = dts ,
82
- columns = ['risk_factor1' , 'risk_factor2' , 'common_returns' ,
83
- 'specific_returns' , 'total_returns' ],
85
+ columns = ['risk_factor1' , 'risk_factor2' , 'total_returns' ,
86
+ 'common_returns' , 'specific_returns' ,
87
+ 'tilt_returns' , 'timing_returns' ],
84
88
data = {'risk_factor1' : [0.0 , 0.0 ],
85
89
'risk_factor2' : [0.0 , 0.0 ],
86
90
'common_returns' : [0.0 , 0.0 ],
87
91
'specific_returns' : [0.1 , 0.1 ],
92
+ 'tilt_returns' : [0.0 , 0.0 ],
93
+ 'timing_returns' : [0.0 , 0.0 ],
88
94
'total_returns' : returns }
89
95
)
90
96
@@ -101,6 +107,41 @@ def test_perf_attrib_simple(self):
101
107
pd .util .testing .assert_frame_equal (expected_exposures_portfolio ,
102
108
exposures_portfolio )
103
109
110
+ # test long and short positions with tilt exposure
111
+ positions = pd .Series ([1.0 , - 0.5 , 1.0 , - 0.5 ], index = index )
112
+
113
+ exposures_portfolio , perf_attrib_output = perf_attrib (returns ,
114
+ positions ,
115
+ factor_returns ,
116
+ factor_loadings )
117
+
118
+ expected_perf_attrib_output = pd .DataFrame (
119
+ index = dts ,
120
+ columns = ['risk_factor1' , 'risk_factor2' , 'total_returns' ,
121
+ 'common_returns' , 'specific_returns' ,
122
+ 'tilt_returns' , 'timing_returns' ],
123
+ data = {'risk_factor1' : [0.0125 , 0.0125 ],
124
+ 'risk_factor2' : [0.0125 , 0.0125 ],
125
+ 'common_returns' : [0.025 , 0.025 ],
126
+ 'specific_returns' : [0.075 , 0.075 ],
127
+ 'tilt_returns' : [0.025 , 0.025 ],
128
+ 'timing_returns' : [0.0 , 0.0 ],
129
+ 'total_returns' : returns }
130
+ )
131
+
132
+ expected_exposures_portfolio = pd .DataFrame (
133
+ index = dts ,
134
+ columns = ['risk_factor1' , 'risk_factor2' ],
135
+ data = {'risk_factor1' : [0.125 , 0.125 ],
136
+ 'risk_factor2' : [0.125 , 0.125 ]}
137
+ )
138
+
139
+ pd .util .testing .assert_frame_equal (expected_perf_attrib_output ,
140
+ perf_attrib_output )
141
+
142
+ pd .util .testing .assert_frame_equal (expected_exposures_portfolio ,
143
+ exposures_portfolio )
144
+
104
145
def test_perf_attrib_regression (self ):
105
146
106
147
positions = pd .read_csv ('empyrical/tests/test_data/positions.csv' ,
0 commit comments