트랜드 분석 - 시퀀스-일일 단순 등락 레이블링

데이터의 구간을 시간단위로 나누어서 레이블링 해야할 경우가 있다.(ex. 캔들차트 분석) seq_len의 길이로 묶어진 데이터는 하나의 데이터처럼 취급되며 연속된 두 레이블링된 데이터는 공통된 데이터를 가지게 된다.

(원래데이터의 길이 - seq_len + 1) 의 길이를 가진 레이블링된 데이터가 생성된다.

만들어진 데이터셋을 어떻게 레이블링 할 것인지는 정하기 나름인데, 이 예제에서는 각 시퀀스의 바로 다음 하루가 마지막날대비 상승했는지, 하락했는지에 따라서 1 또는 0으로 레이블링 하였다.

def seqEnd_trend(fname, seq_len):
    print("Creating label . . .")
    print("type : sequence_end")
    
    df = pd.read_csv(fname, parse_dates=True, index_col=0)
    df.fillna(0)
    df.reset_index(inplace=True)
    
    outputname = "{}_label_{}.txt".format(fname[0:-4], seq_len) # ticker 명과 sequence 길이를 파일이름에 포함
    removeOutput(outputname)
        
    df['Date'] = df['Date'].map(mdates.date2num) # Y-M-D 포멧에서 num 포멧으로 변경
    
    for i in range(0, len(df)-int(seq_len)):
        tmp_df = df.iloc[i:i + int(seq_len)]  # seq_len 만큼 데이터프레임 슬라이싱
        starting = 0
        endvalue = 0
        label = ""
        starting = tmp_df["Open"].iloc[-2] # seq 마지막날의 전날 종가
        endvalue = tmp_df["Close"].iloc[-1] # seq 마지막날 종가
        tmp_rtn = endvalue / starting - 1 
        
        if tmp_rtn > 0:
            label = 1
        else:
            label = 0
        
        with open(outputname, 'a') as the_file:
            the_file.write("{}--{},{}".format(outputname, i, label))
            the_file.write("\n")
        
    print("Create label finished.")

소스코드 & 코드설명

Updated: