@@ -371,7 +371,7 @@ def ts_neg_count(data: pd.Series, n_period: int) -> pd.Series:
371
371
372
372
373
373
def decay_n (x : pd .Series , n : int ) -> pd .Series :
374
- arr = np .arange (1 , n + 1 )
374
+ arr = np .arange (1 , n + 1 )
375
375
weights = arr / sum (arr )
376
376
return x .rolling (n ).apply (lambda y : np .dot (y , weights ), raw = True )
377
377
@@ -530,10 +530,12 @@ def cs_beta(x1: pd.Series, x2: pd.Series) -> pd.Series:
530
530
var = cs_variance (x1 )
531
531
return cov / var
532
532
533
+
533
534
def cs_alpha (x1 : pd .Series , x2 : pd .Series ) -> pd .Series :
534
535
beta = cs_beta (x1 , x2 )
535
536
return cs_mean (x2 ) - cs_mean (x1 ) * beta
536
537
538
+
537
539
def cs_resid (x1 : pd .Series , x2 : pd .Series ) -> pd .Series :
538
540
beta = cs_beta (x1 , x2 )
539
541
alpha = cs_mean (x2 ) - cs_mean (x1 ) * beta
@@ -628,11 +630,11 @@ def neutralize(data: pd.DataFrame | pd.Series, target: pd.Series, features: list
628
630
:return: pd.DataFrame, 包括中性化后的因子和未中性化的其它因子
629
631
"""
630
632
if isinstance (data , pd .Series ):
631
- return cs_resid (data , target )
633
+ return cs_resid (target , data )
632
634
else :
633
635
features = data .columns if features is None else features
634
636
other_cols = [c for c in data .columns if c not in features ]
635
- factor_neu = Parallel (n_jobs = n_jobs )(delayed (cs_resid )(data [f ], target ) for f in features )
637
+ factor_neu = Parallel (n_jobs = n_jobs )(delayed (cs_resid )(target , data [f ]) for f in features )
636
638
data_neu = pd .concat (factor_neu , axis = 1 )
637
639
data_neu .columns = features
638
640
return pd .concat ([data_neu , data [other_cols ]], axis = 1 )
0 commit comments