SIGNATE 일본거래소 그룹 뉴스 분석 도전 [모델 구축편3]

SIGNATE 일본거래소 그룹 뉴스 분석 도전[모델 구축편2][1]의 후속

규칙.

  • 100만 엔을 밑천으로 월요일 조직 포트(구매), 금요일 모두 판매
  • 중도 매매 불가
  • 5개 품목 이상 and 50만엔 이상 구매
  • 필수

    전술

  • 예측 대상: 수익(금요일close가격-월요일의open가격)/월요일의open가격)
  • 예측에 따라 포트 사진 제작(어쨌든 10만엔에 top10을 구매한 브랜드)
  • 특징량


    AAAAI 2021에서 제시한 spectral residuls라고 불리는 특징량을 사용합니다.
    개별 주식의 수익과 시장 전체의 주요 원인과 개별 주식의 주요 원인을 분리하고 시장 전체에서 주요 요소를 제거함으로써 시장 전체의 영향을 제거하는 동시에 수익을 겨냥할 수 있다.PCA를 구체적으로 구현하고 위쪽에서 몇 가지 주요 성분을 제거한다.
    이 논문은 세 가지 요소로 구성되어 있다.첫 번째 방법은 개별 주식의 수익을 색인에서 분리한 요인과 개별 주식의 요인(spectral residuls라고 불리며 샤프residuls에 효과적인 부분을 추출하는 것이다).두 번째는 Specrtral residuls에서 향후 Spectral residuls에 분포할 신경 네트워크를 예측하는 제작 방법(특히 time scale의 분형적인 구조를 고려했다)이다.셋째,portoflio의rebalance도specrtralresidual의 예측 분포가 되었다.
    요컨대 스펙트럴 리서듀얼스는 투자수익을 주식 수량 S로 활용한 협방차 행렬로, PCA가 환류했다.시간이 전진할 때의 귀환을 고려하다.그러면 리턴은 X.{t}\equiv\left[\vec{r}_{t-H},\cdots,\vec{r}_{t-1}\right]\in\mathbb{R}^{S\times H}. 행 벡터의 평균을 0\tild{X}로 설정합니다.{t} 예
    \tilde{X}_{t}=X_{t}-\frac{1}{H}\sum_{i=1}^{H}X_{i}
    이것은 특이치를 분해할 수 있다
    \tilde{X}_{t} =V_{t}{\rm diag}\left(\sigma_{1},\cdots\sigma_{S}\right)U_{t}
    여기는 뷔입니다.{t}는 직교 행렬이고 Hstep에서 얻은return은 V입니다{t}^{\top}\tilde{X}_{t}={\rm diag}\left(\sigma_{1},\cdots\sigma_{S}\right)U_{t}로 표현합니다.여기서 의미를 고려하면 S의 공간과 H의 공간에서 품종 S와 시간 H의 귀환 스트레칭이 축소된 느낌을 통일적으로 바꾼다.그러니까 V.{t}은 가장 변화된 브랜드 그룹입니다.시간 창 H가 지정된 경우 시간 t-H\leqs\leqt-1의 spectral residual 은
    \vec{\varepsilon}_{s}=V_{t}{\rm diag}\left(0,\cdots,0,1,\cdots1\right)V_{t}^{\top}\vec{r}_{s}
    이전 C 피쳐 값을 0으로 설정한 경우 반환 벡터.Hstep에서 가장 많이 변한 브랜드 조합을 제거한 것을 spectral residual이라고 하는 것이다.논문에서 H=256, C=30은 메모리의 관계로 H=64, C=7을 사용했다.
    def residual_feature(input_df, H = 64,  C = 7):
        assert C <= H
        tmp = input_df.loc[:, ['Local Code', 'EndOfDayQuote ExchangeOfficialClose']]
        ret_df = tmp[['Local Code']].copy()
        for diff in tqdm(range(1, H+1)):
            _df = tmp.groupby('Local Code').pct_change(diff).rename(columns={'EndOfDayQuote ExchangeOfficialClose': f'{diff}'})
            ret_df = pd.concat([ret_df, _df], axis=1)
        ret_df
        # noramalize
        # fillna = 0 新しいcodeの出現に対応するため
        norm_ret_df = pd.DataFrame(ret_df.drop('Local Code', axis=1).fillna(0).values - ret_df.drop('Local Code', axis=1).fillna(0).mean(1).values.reshape(-1,1), index=ret_df.index, columns=ret_df.columns[1:])
    
        norm_ret_df['Local Code'] = ret_df['Local Code']
        ret = []
        pca = sklearn.decomposition.PCA()
        for date in tqdm(norm_ret_df.reset_index()['EndOfDayQuote Date'].unique()):
            norm_ret_df = norm_ret_df
            x = norm_ret_df.loc[date].set_index('Local Code')
            x = x.fillna(0.0)
            x = x.replace([np.inf, -np.inf], 0.0)
            pca_model =  pca.fit(x)
            new_x = pca_model.transform(x)
            new_x[:, :C] = 0.0
            new_x = pca_model.inverse_transform(new_x)    
            tmp_df = pd.DataFrame(new_x, columns=x.columns, index=x.index)
            tmp_df['EndOfDayQuote Date'] = date
            ret.append(tmp_df)
        ret = pd.concat(ret, axis=0)
        ret = ret.reset_index().sort_values(['Local Code', 'EndOfDayQuote Date']).set_index('EndOfDayQuote Date')
        return ret.drop(['Local Code'], axis=1)
    
    Light gbm 배우기

    결실


    일주일의 반격량은 0.61%(좋지 않다)
    선택한 각 브랜드의 귀환

    예측된 특징량 벡터의 해석을 들었다

    특징량 벡터 재검토


    지난번까지의 특징량 벡터에spectral residuals를 더해 보세요.가까스로 시장 전체의 영향을 없애고 더한 이론적 모순을 더했다.
    1주일의 리베이트는 5.57%(미묘하다


    각주
    [2] 이전 글
    ↩︎ Deep Portfolio Optimization via Distributional Prediction of Residual Factors

    좋은 웹페이지 즐겨찾기