퀀트

11. 최근 수익률이 높았던 종목 보기

만 기 2023. 1. 3. 00:34

 

최근 수익률이 높았던 종목 데이터 만들어서 그래프 그리기

 

1. .pct_change() 메서드를 이용하여 주가 변동률 구하기

# 3일간의 주가 변동률
d['adj_close'].pct_change(periods=3, axis=1)

        2021-07-26	2021-07-27	2021-07-28	2021-07-29	2021-07-30
Symbol					
A000020	       NaN	       NaN	       NaN	  0.013889	  0.017361
A000030	       NaN	       NaN	       NaN	  0.000000	  0.000000
A000040	       NaN	       NaN	       NaN	  0.012097	 -0.012000
A000050	       NaN	       NaN	       NaN	  0.011278	  0.018727
A000060	       NaN	       NaN	       NaN	  0.094298	  0.092077
...
  • .pct_change() 메서드는 periods 값만큼 이전과의 변동률을 나타낸다.
  • 결과가 %가 아닌 비율이므로 %를 구할땐 100을 곱해주면 된다.
  • 날짜를 정하면, 해당 날짜기준 n일(periods) 전에 투자했을때 해당 날짜까지의 수익률을 알 수 있게 된다.

 

2. 투자 기간에 해당하는 수익률 데이터를 만들고, 파일 데이터 딕셔너리에 추가하기

for hold_days in [1, 3, 5, 10, 20, 60, 120]:
    table_name = f'return_{hold_days}d'
    d[table_name] = d['adj_close'].pct_change(periods=hold_days, axis=1) * 100
    
    print(f"투자기간 {hold_days} 일, 테이블 {table_name} 연산 완료 !")
  • for문을 사용하여 table_name과 periods만 변경하며, d딕셔너리에 파일 데이터 추가
  • periods는 순서대로 [1일, 3일, 1주, 2주, 1개월, 3개월, 6개월]을 의미한다.

 

3. d 딕셔너리에 데이터 잘 추가되었는지 확인

print(d.keys())

# dict_keys(['adj_close', 'mc', 'sales_ttm', 'op_ttm', 'ni_ttm', 'liab', 'asset_cur', 'eq', 
#'return_1d', 'return_3d', 'return_5d', 'return_10d', 'return_20d', 'return_60d', 'return_120d'])


print(d['return_5d'].iloc[:5, -5:])

#          2021-07-26  2021-07-27  2021-07-28  2021-07-29  2021-07-30
# Symbol                                                             
# A000020   -4.635762   -3.355705   -2.364865   -1.016949    0.342466
# A000030    0.000000    0.000000    0.000000    0.000000    0.000000
# A000040   -4.247104   -3.846154   -3.515625   -3.088803   -3.137255
# A000050   -1.481481    0.375940    0.000000    0.373134    1.115242
# A000060    4.347826    6.621005    6.236080   10.643016   11.353712

 

4. 딕셔너리 d에 있는 데이터프레임에 종목 이름 데이터 붙이는 함수 작성

def get_df_with_info(data_df):
  return pd.concat([stock_info, data_df], axis=1)

 

5. 원하는 데이터프레임 만들기

: 20일 수익률 기준, 내림차순 종목 및 종목명 함께 보기
sorted_df = get_df_with_info(d['return_20d'].loc[:, view_date]).sort_values(view_date, ascending=False)

sorted_df = sorted_df.rename(columns={view_date:f'{view_date}_기준_20일_수익률'})

print(sorted_df)


	itemname	Sector	2021-07-30_기준_20일_수익률
Symbol			
A258830	세종메디칼	의료장비_및_서비스	185.148515
A189330	NaN	NaN	126.804124
A215090	이디티	상업서비스	96.511628
A307750	대신밸런스제6호스팩	NaN	93.422405
A256840	한국비엔씨	의료장비_및_서비스	88.811189
...
  • .sort_values() 메서드를 사용해서 view_date 컬럼 기준으로 내림차순 정렬
  • .rename() 으로 columns={변경전:변경후} 컬럼 이름 변경

 

6. 상승률 1등한 종목 그래프 그리기

rank1_code = sorted_df.index[0]

d['adj_close'].loc[rank1_code, '2020-03-01':].plot(figsize=(12,5));

 

7. 업종별로 상승률 정렬해보기

column_name = f'{view_date}_기준_20일_수익률'

sector_sorted_df = sorted_df.groupby('Sector').mean().sort_values(column_name, ascending=False)

sector_sorted_df.plot(figsize=(12,5), kind='bar')