제2회 KRX 주식 투자 알고리즘 경진대회

알고리즘 | 정형 | 시계열 | 포트폴리오 구성 | 금융 | 샤프 지수

  • moneyIcon 상금 : 5,000 만원
  • 1,323명 마감
마감

 

[팀_쥬혁이]MVO손실함수에_따른_1DCNN_LSTM_포트폴리오_모형

공동작성자

stroke
2023.07.31 23:54 1,205 조회 language
로그인이 필요합니다
0 / 1000
젤리제리
2023.08.01 00:00


데이터 수집은 다음과 같은 방법으로 했습니다.
def process_dataframe(fdf, rename_dict):
    fdf = fdf.reset_index()
    fdf = fdf.rename(columns=rename_dict)
    fdf['date'] = pd.to_datetime(fdf['date'])
    return fdf

def get_ohlcv(ticker, start_date, end_date):
    fdf = stock.get_market_ohlcv(start_date, end_date, ticker, adjusted=True) # 종가 기준 수집
    fdf = process_dataframe(fdf, {'날짜': 'date', '시가': 'Open', '고가': 'High', '저가': 'Low', '종가': 'Close', '거래량': 'Volume'})
    return fdf

젤리제리
2023.08.01 00:00

# Pykrx를 통한 수정주가 수집
df = pd.read_csv('train.csv')
df.columns = ['date', 'ticker', 'name', 'volume', 'open', 'high', 'low', 'Close']
df.sort_values(by=['ticker', 'date'], ascending=True, inplace=True)
df.reset_index(drop=True, inplace=True)
df['ticker'] = df['ticker'].apply(lambda x: x[1:])
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df_ticker = df['ticker'].unique()

n=0
# Public
# start = '20210601'
# end = '20230530'

# Private
start = '20230601'
end = '20230728'

for i, ticker in tqdm(enumerate(df_ticker)):
  try :
    ohclv = get_ohlcv(ticker, start, end)
    ohclv['ticker'] = ticker

    if n == 0:
        total = ohclv
    else :
        total = pd.concat([total, ohclv], axis=0)
    n+=1
  except :
    n+=1
    print(n, 'error')
    continue
#total.to_parquet('/data/final_data.parquet', index=False)
total.to_parquet('/data/new_data_append.parquet', index=False)

젤리제리
2023.08.01 00:24

삭제된 댓글입니다

bullbear
2023.08.01 00:22

[쥬혁이]팀 본 게시물로 제출합니다.

검은짱돌의계략
2023.08.01 17:47

portfolio = portfolio * 250 / 2

연화율 부분인거 같은데 Trading day 15가 아닌 2로 하신 이유가 무엇인지 궁금합니다..! 알려주실 수 있으신지요

젤리제리
2023.08.01 19:24

검은짱돌의계략님이 생각하신 연율화된 총자산 최종 수익률은 
annualized_total_return = total_return * 250 / (trading_days) 로,
여기서 trading_days = 15일입니다.

portfolio = portfolio * 250 / 2 는 연율화된 일간 수익률을 의미합니다.
여기서 나누기 2를 한 이유는 (A)일간 매수수익률의 평균값과
(B)일간 공매도 수익률의 평균값을 더한 값의 평균값{(A+B)/2}을 구하기 때문입니다.

혹시 이해 안 되는 거 있으시면 또 질문해주세요! :)

검은짱돌의계략
2023.08.01 20:53

아하. 답변이 되었습니다. 감사합니다