Skip to content

Commit cc07945

Browse files
authored
修正了long_only时的权重bug
1 parent 66db299 commit cc07945

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

scutquant/alpha.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ def neutralize_single_factor(f_name: str) -> pd.Series:
692692
return pd.concat([data_neu, concat_data[other_cols]], axis=1)
693693

694694

695-
def market_neutralize(x: pd.Series) -> pd.Series:
695+
def market_neutralize(x: pd.Series, long_only=False) -> pd.Series:
696696
"""
697697
市场组合中性化:
698698
(1) 对所有股票减去其截面上的因子均值
@@ -703,16 +703,17 @@ def market_neutralize(x: pd.Series) -> pd.Series:
703703
"""
704704
mean = x.groupby(level=0).mean()
705705
x -= mean
706-
abs_sum = abs(x).groupby(level=0).sum()
706+
if long_only: # 考虑到A股有做空限制, 因此将权重为负的股票(即做空的股票)的权重调整为0(即纯多头), 并相应调整多头的权重
707+
x[x.values < 0] = 0
708+
abs_sum = x[x.values > 0].groupby(level=0).sum()
709+
else:
710+
abs_sum = abs(x).groupby(level=0).sum()
707711
x /= abs_sum
708712
return x
709713

710714

711715
def get_factor_portfolio(feature: pd.Series, label: pd.Series, long_only: bool = False) -> pd.Series:
712-
x_neu = market_neutralize(feature)
713-
if long_only:
714-
x_neu[x_neu < 0] = 0 # 考虑到A股有做空限制, 因此将权重为负的股票(即做空的股票)的权重调整为0(即纯多头)
715-
x_neu *= 2
716+
x_neu = market_neutralize(feature, long_only=long_only)
716717
X = pd.DataFrame({"feature": x_neu, "label": label})
717718
X.dropna(inplace=True)
718719
X["factor_return"] = X["feature"] * X["label"]

0 commit comments

Comments
 (0)