@@ -82,9 +82,15 @@ def plot(data, label, title: str = None, xlabel: str = None, ylabel: str = None,
82
82
plt .figure (figsize = figsize )
83
83
# plt.clf()
84
84
if mode == "plot" :
85
- for d in range (len (data )):
86
- plt .plot (data [d ], label = label [d ])
87
- plt .xticks (rotation = 45 )
85
+ if len (data ) > 10 :
86
+ cmap = plt .get_cmap ('tab20' )
87
+ for d in range (len (data )):
88
+ plt .plot (data [d ], label = label [d ], color = cmap (d ))
89
+ plt .xticks (rotation = 45 )
90
+ else :
91
+ for d in range (len (data )):
92
+ plt .plot (data [d ], label = label [d ])
93
+ plt .xticks (rotation = 45 )
88
94
elif mode == "bar" :
89
95
bar = plt .bar (label , data , label = "value" )
90
96
plt .bar_label (bar , label_type = 'edge' )
@@ -122,16 +128,13 @@ def accuracy(pred: pd.Series, y: pd.Series, sign: str = ">=") -> float:
122
128
return len (data_true ) / len (data )
123
129
124
130
125
- def report_all (user_account , benchmark , show_raw_value : bool = False , excess_return : bool = True , risk : bool = True ,
126
- turnover : bool = True , rf : float = 0.03 , freq : float = 1 , time = None , figsize : tuple = (10 , 6 )) -> None :
131
+ def report_all (user_account , benchmark , show_raw_value : bool = False , rf : float = 0.03 , freq : float = 1 , time = None ,
132
+ figsize : tuple = (10 , 6 )) -> None :
127
133
"""
128
134
129
135
:param user_account: account类
130
136
:param benchmark: account类
131
137
:param show_raw_value: 显示原始市值(具体金额)
132
- :param excess_return: 显示超额收益曲线
133
- :param risk: 显示风险度
134
- :param turnover: 显示换手率
135
138
:param rf: 显示无风险利率
136
139
:param freq: 频率, 日频为1,月频为30,其它类推
137
140
:param time: 显示时间轴
@@ -159,20 +162,22 @@ def report_all(user_account, benchmark, show_raw_value: bool = False, excess_ret
159
162
days += 1
160
163
days /= len (acc_ret )
161
164
162
- acc_dd = calc_drawdown (pd .Series (acc_ret ))
163
- ben_dd = calc_drawdown (pd .Series (ben_ret ))
165
+ acc_ret = pd .Series (acc_ret , name = "acc_ret" , index = time ) # 累计收益率
166
+ ben_ret = pd .Series (ben_ret , name = "ben_ret" , index = time ) # benchmark的累计收益率
167
+ excess_ret = pd .Series (excess_ret , name = "excess_ret" , index = time )
164
168
165
- ret = pd .Series (acc_ret ) # 累计收益率
166
- ben = pd .Series (ben_ret ) # benchmark的累计收益率
169
+ acc_dd = calc_drawdown (acc_ret )
170
+ ben_dd = calc_drawdown (ben_ret )
171
+ excess_dd = calc_drawdown (excess_ret )
167
172
168
- ann_return = annualized_return (ret , freq = freq )
169
- ann_std = annualized_volatility (ret , freq = freq )
170
- ben_ann_return = annualized_return (ben , freq = freq )
171
- ben_ann_std = annualized_volatility (ben , freq = freq )
173
+ ann_return = annualized_return (acc_ret , freq = freq )
174
+ ann_std = annualized_volatility (acc_ret , freq = freq )
175
+ ben_ann_return = annualized_return (ben_ret , freq = freq )
176
+ ben_ann_std = annualized_volatility (ben_ret , freq = freq )
172
177
173
- beta = ret .cov (ben ) / ben .var ()
174
- alpha = ret .mean () - beta * ben .mean ()
175
- epsilon = pd . Series ( ret - beta * ben - alpha ).std ()
178
+ beta = acc_ret .cov (ben_ret ) / ben_ret .var ()
179
+ alpha = acc_ret .mean () - beta * ben_ret .mean ()
180
+ epsilon = ( acc_ret - beta * ben_ret - alpha ).std ()
176
181
177
182
sharpe = sharpe_ratio (acc_ret , rf = rf , freq = freq * 365 )
178
183
sortino = sortino_ratio (acc_ret , ben_ret )
@@ -207,10 +212,6 @@ def report_all(user_account, benchmark, show_raw_value: bool = False, excess_ret
207
212
plt .legend ()
208
213
plt .show ()
209
214
else :
210
- acc_ret = pd .Series (acc_ret , name = "acc_ret" , index = time )
211
- ben_ret = pd .Series (ben_ret , name = "ben_ret" , index = time )
212
- excess_ret = pd .Series (excess_ret , name = "excess_ret" , index = time )
213
-
214
215
plt .figure (figsize = (10 , 6 ))
215
216
plt .plot (acc_ret , label = "return" , color = "red" )
216
217
plt .plot (ben_ret , label = "benchmark" , color = "blue" )
@@ -222,21 +223,19 @@ def report_all(user_account, benchmark, show_raw_value: bool = False, excess_ret
222
223
plt .clf ()
223
224
plt .figure (figsize = (10 , 6 ))
224
225
plt .plot (acc_dd , label = "drawdown" )
225
- plt .plot (ben_dd , label = "excess_return_drawdown" )
226
+ plt .plot (excess_dd , label = "excess_return_drawdown" )
226
227
plt .legend ()
227
228
plt .title ("Drawdown" )
228
229
plt .show ()
229
230
230
- if risk :
231
- risk = pd .DataFrame ({'risk' : user_account .risk_curve }, index = time )
232
- plot ([risk ], label = ['risk_degree' ], title = 'Risk Degree' , ylabel = 'value' , figsize = figsize )
231
+ risk = pd .DataFrame ({'risk' : user_account .risk_curve }, index = time )
232
+ plot ([risk ], label = ['risk_degree' ], title = 'Risk Degree' , ylabel = 'value' , figsize = figsize )
233
233
234
- if turnover :
235
- risk = pd .DataFrame ({'turnover' : user_account .turnover }, index = time )
236
- plot ([risk ], label = ['turnover' ], title = 'Turnover' , figsize = figsize )
234
+ risk = pd .DataFrame ({'turnover' : user_account .turnover }, index = time )
235
+ plot ([risk ], label = ['turnover' ], title = 'Turnover' , figsize = figsize )
237
236
238
237
239
- def group_return_ana (pred : pd .DataFrame | pd .Series , y_true : pd .Series , n : int = 5 , groupby : str = "time" ,
238
+ def group_return_ana (pred : pd .DataFrame | pd .Series , y_true : pd .Series , n : int = 10 , groupby : str = "time" ,
240
239
figsize : tuple = (10 , 6 )) -> None :
241
240
"""
242
241
因子对股票是否有良好的区分度, 若有, 则应出现明显的分层效应(即单调性)
@@ -283,12 +282,10 @@ def group_return_ana(pred: pd.DataFrame | pd.Series, y_true: pd.Series, n: int =
283
282
win_rate = []
284
283
mean_ret = []
285
284
for c in cols :
286
- # dt = t_df[c] + 1
287
- # data.append(dt.cumprod() - 1)
288
285
data .append (t_df [c ].cumsum ())
289
286
label .append (c )
290
- win_rate .append (len (t_df [t_df [c ] >= 0 ]) / len (t_df ))
291
- mean_ret .append (t_df [c ].cumsum ().values [- 1 ] / len (t_df ) * 100 )
287
+ win_rate .append (round ( len (t_df [t_df [c ] >= 0 ]) / len (t_df ), 4 ))
288
+ mean_ret .append (round ( t_df [c ].cumsum ().values [- 1 ] / len (t_df ) * 100 , 4 ) )
292
289
plot (data , label , title = 'Grouped Return' , xlabel = 'time_id' , ylabel = 'value' , figsize = figsize )
293
290
plot (win_rate , label = cols , title = "Win Rate of Each Group" , mode = "bar" , figsize = figsize )
294
291
plot (mean_ret , label = cols , title = "Mean Return of Each Group(%)" , mode = "bar" , figsize = figsize )
0 commit comments