2017-11-13 15 views
0

나는 시계열 데이터 X와 Y를 사용하여 매일 회귀를 시도하며, 이전 날짜의 X 데이터를 현재 날짜의 Y 값으로 회귀 분석합니다. X는 차원 날짜, 주가 및 인수가있는 3 차원 데이터 배열이고, Y는 차원 날짜와 주식이있는 2 차원 데이터 배열입니다. 누구든지 효율적인 방법으로 어떻게하는지 말해 줄 수 있습니까?xarray를 통해 python에서 회귀를 수행하는 방법은 무엇입니까?

# -*- coding: utf-8 -*- 
import pandas as pd 
import numpy as np 
import xarray as xr 
import os 
import warnings 
from functools import reduce 
import math as mt 
import statsmodels.api as sm 
from lib.gftTools import gftIO 
import datetime 
import logging 

time = pd.date_range('2000-01-01', freq='D', periods=365) 
X = xr.DataArray(
    np.random.randn(365, 10, 3), [('date', time), ('stock', list('abcdefghij')), 
            ('factor', list('xyz'))]) 

Y = xr.DataArray(
    np.random.randn(365, 10), [('date', time), ('stock', list('abcdefghij'))]) 

답변

0
# create regression result dateframe 
params = pd.DataFrame(index=X.date, columns=X.factor) 
residuals = pd.DataFrame(index=X.date, columns=X.symbol) 

# get the datetimeindex 
idx_date = y.get_index('date') 
idx_symbol = X.get_index('symbol') 

for dt in y.date.values: 
    logger.debug('regression on %s', dt) 
    cur_date = pd.Timestamp(dt) 
    # get the position of current date 
    dt_pos = idx_date.get_loc(cur_date) 
    if dt_pos == 0: 
     continue 
    dt_pre_pos = dt_pos - 1 
    # symbols having valid value(not nan) 
    s = X[:, dt_pre_pos].notnull().all(axis=0) 
    valid_x = X[:, dt_pre_pos, s].symbol.values 

    w = y.loc[cur_date].notnull() 
    valid_y = y.loc[cur_date, w].symbol.values 

    valid_symbol = np.intersect1d(valid_x, valid_y) 
    try: 
     model = sm.RLM(
      y.loc[cur_date, valid_symbol].values, 
      X.isel(
       date=dt_pre_pos, 
       symbol=idx_symbol.get_indexer(valid_symbol)).values.T, 
      M=sm.robust.norms.HuberT()) 
     results = model.fit() 
    except ValueError: 
     continue 
    params.loc[cur_date] = results.params 
    residuals.loc[cur_date, valid_symbol] = results.resid