https://github.com/FinanceData/FinanceDataReader
!pip -q install finance-datareader
import FinanceDataReader as fdr
krx = fdr.StockListing('KRX')
krx
Symbol | Name | Sector | Industry | |
---|---|---|---|---|
0 | 155660 | DSR | 1차 비철금속 제조업 | 합섬섬유로프 |
1 | 001250 | GS글로벌 | 상품 종합 도매업 | 수출입업(시멘트,철강금속,전기전자,섬유,기계화학),상품중개,광업,채석업/하수처리 서... |
2 | 082740 | HSD엔진 | 일반 목적용 기계 제조업 | 대형선박용엔진,내연발전엔진 |
3 | 011070 | LG이노텍 | 전자부품 제조업 | 기타 전자부품 제조업 |
4 | 010120 | LS산전 | 전동기, 발전기 및 전기 변환 · 공급 · 제어 장치 제조업 | 고압기기,저압기기,변압기,배전반,PLC,인버터,빌딩설비,공조기,건축배관,자동화기기 ... |
... | ... | ... | ... | ... |
2350 | 234070 | 에이원알폼 | 산업용 기계 및 장비 임대업 | 건설현장용 알루미늄 거푸집 임대 |
2351 | 278380 | 원바이오젠 | 의료용품 및 기타 의약 관련제품 제조업 | 의료기기(창상피복재) |
2352 | 299480 | 지앤이헬스케어 | 기타 섬유제품 제조업 | 면생리대 |
2353 | 189350 | 코셋 | 통신 및 방송 장비 제조업 | 광통신용 증폭기 |
2354 | 331660 | 한국미라클피플사 | 기타 화학제품 제조업 | 은나노스텝, 닥터오렌지 등 |
2355 rows × 4 columns
groupby('컬럼명')
을 사용하여 컬럼명을 기준으로 묶어 줄 수 있습니다.
krx.groupby('Sector')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f2517b9e0f0>
groupby 결과에 통계함수(count, mean, sum 등)을 적용해주면 묶은 그룹별 통계량을 산출할 수 있습니다.
krx.groupby('Sector').count()
Symbol | Name | Industry | |
---|---|---|---|
Sector | |||
1차 비철금속 제조업 | 19 | 19 | 18 |
1차 철강 제조업 | 57 | 57 | 57 |
가구 제조업 | 8 | 8 | 8 |
가전제품 및 정보통신장비 소매업 | 1 | 1 | 1 |
가정용 기기 제조업 | 9 | 9 | 9 |
... | ... | ... | ... |
해상 운송업 | 5 | 5 | 5 |
해체, 선별 및 원료 재생업 | 1 | 1 | 1 |
화학섬유 제조업 | 9 | 9 | 9 |
환경 정화 및 복원업 | 1 | 1 | 1 |
회사 본부 및 경영 컨설팅 서비스업 | 12 | 12 | 11 |
156 rows × 3 columns
섹터(Sector)의 개수는 모두 156개 인것을 확인할 수 있습니다.
섹터(Sector)별로 개수(종목수)를 구하고, 가장 종목수가 많은 섹터 30개를 뽑아 봅니다.
krx.groupby('Sector').count().sort_values('Symbol', ascending=False)[:30]
Symbol | Name | Industry | |
---|---|---|---|
Sector | |||
특수 목적용 기계 제조업 | 136 | 136 | 136 |
소프트웨어 개발 및 공급업 | 129 | 129 | 128 |
전자부품 제조업 | 119 | 119 | 118 |
자동차 신품 부품 제조업 | 96 | 96 | 96 |
기타 금융업 | 88 | 88 | 86 |
의약품 제조업 | 88 | 88 | 88 |
기타 화학제품 제조업 | 83 | 83 | 83 |
금융 지원 서비스업 | 79 | 79 | 78 |
통신 및 방송 장비 제조업 | 76 | 76 | 76 |
반도체 제조업 | 58 | 58 | 58 |
1차 철강 제조업 | 57 | 57 | 57 |
자연과학 및 공학 연구개발업 | 49 | 49 | 49 |
의료용 기기 제조업 | 44 | 44 | 43 |
플라스틱제품 제조업 | 44 | 44 | 44 |
일반 목적용 기계 제조업 | 44 | 44 | 44 |
기초 화학물질 제조업 | 43 | 43 | 43 |
기타 전문 도매업 | 38 | 38 | 38 |
컴퓨터 프로그래밍, 시스템 통합 및 관리업 | 36 | 36 | 36 |
기초 의약물질 및 생물학적 제제 제조업 | 36 | 36 | 36 |
기타 식품 제조업 | 34 | 34 | 34 |
전동기, 발전기 및 전기 변환 · 공급 · 제어 장치 제조업 | 33 | 33 | 33 |
영화, 비디오물, 방송프로그램 제작 및 배급업 | 31 | 31 | 31 |
봉제의복 제조업 | 28 | 28 | 27 |
측정, 시험, 항해, 제어 및 기타 정밀기기 제조업; 광학기기 제외 | 25 | 25 | 25 |
건물 건설업 | 25 | 25 | 25 |
기타 금속 가공제품 제조업 | 23 | 23 | 23 |
기계장비 및 관련 물품 도매업 | 23 | 23 | 23 |
의료용품 및 기타 의약 관련제품 제조업 | 23 | 23 | 23 |
구조용 금속제품, 탱크 및 증기발생기 제조업 | 20 | 20 | 20 |
생활용품 도매업 | 19 | 19 | 19 |
묶은(groupby)결과를 list와 dict로 변환하면 개별 섹터(Sector)별로 종목리스트를 구분할 수 있습니다.
sectors = dict(list(krx.groupby('Sector')))
print('count:', len(sectors))
list(sectors.keys())[:10]
count: 156
['1차 비철금속 제조업', '1차 철강 제조업', '가구 제조업', '가전제품 및 정보통신장비 소매업', '가정용 기기 제조업', '가죽, 가방 및 유사제품 제조업', '개인 및 가정용품 임대업', '건물 건설업', '건물설비 설치 공사업', '건축기술, 엔지니어링 및 관련 기술 서비스업']
med_sec = sectors['의료용품 및 기타 의약 관련제품 제조업']
print('row count:', len(med_sec))
med_sec.head(10)
row count: 23
Symbol | Name | Sector | Industry | |
---|---|---|---|---|
149 | 206640 | 바디텍메드 | 의료용품 및 기타 의약 관련제품 제조업 | 기업인수합병 |
164 | 253840 | 수젠텍 | 의료용품 및 기타 의약 관련제품 제조업 | 체외진단 기기 및 시약 |
188 | 950130 | 엑세스바이오 | 의료용품 및 기타 의약 관련제품 제조업 | 말라리아 진단키트(RDT), HIV 진단키트(RDT) |
195 | 153710 | 옵티팜 | 의료용품 및 기타 의약 관련제품 제조업 | 옵티케어, 메디피그 등 |
437 | 059210 | 메타바이오메드 | 의료용품 및 기타 의약 관련제품 제조업 | 생체분해성봉합사,근관충전재 |
484 | 174900 | 앱클론 | 의료용품 및 기타 의약 관련제품 제조업 | 항체의약품 |
527 | 228760 | 지노믹트리 | 의료용품 및 기타 의약 관련제품 제조업 | 암 조기진단 제품 |
746 | 064550 | 바이오니아 | 의료용품 및 기타 의약 관련제품 제조업 | 합성유전자,시약및유전자분석장비 |
824 | 086890 | 이수앱지스 | 의료용품 및 기타 의약 관련제품 제조업 | 항체치료제,효소치료제 |
853 | 046210 | 파나진 | 의료용품 및 기타 의약 관련제품 제조업 | 의료용품및 기타 의약관련 제품 제조업 |
!pip -q install finance-datareader
개별 종목의 가격을 가져오고, 개별 종목의 종가(Close)를 데이터 프레임(med_pirces)에 컬럼으로 추가합니다.
import pandas as pd
import FinanceDataReader as fdr
med = pd.DataFrame()
for ix, row in med_sec.iterrows():
code, name = row['Symbol'], row['Name']
print(code, name)
# 개별 종목의 가격을 가져옵니다
df = fdr.DataReader(code, '2019-01-01', '2019-12-31')
# 가격 데이터의 종가(Close)를 컬럼으로 추가합니다
# (컬럼명은 종목명을 지정합니다)
med[name] = df['Close']
206640 바디텍메드 253840 수젠텍 950130 엑세스바이오 153710 옵티팜 059210 메타바이오메드 174900 앱클론 228760 지노믹트리 064550 바이오니아 086890 이수앱지스 046210 파나진 138610 나이벡 096530 씨젠 246720 아스타 100700 세운메디칼 260660 알리코제약 241820 피씨엘 042520 한스바이오메드 205470 휴마시스 233250 메디안디노스틱 142280 녹십자엠에스 216080 제테마 303360 프로테옴텍 278380 원바이오젠
# 23개 종목 1년간의 종가(Close) 데이터를 수집하였습니다
med
바디텍메드 | 수젠텍 | 엑세스바이오 | 옵티팜 | 메타바이오메드 | 앱클론 | 지노믹트리 | 바이오니아 | 이수앱지스 | 파나진 | 나이벡 | 씨젠 | 아스타 | 세운메디칼 | 알리코제약 | 피씨엘 | 한스바이오메드 | 휴마시스 | 메디안디노스틱 | 녹십자엠에스 | 제테마 | 프로테옴텍 | 원바이오젠 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date | |||||||||||||||||||||||
2019-01-02 | 10400 | 12900 | 4410 | 9130 | 2960 | 42700 | 27550 | 7540 | 6170 | 4475 | 9358 | 15600 | 8290 | 3780 | 12100 | 9530 | 24600 | 1335 | 27000 | 9866 | NaN | 19400 | NaN |
2019-01-03 | 9990 | 13000 | 4180 | 9030 | 2920 | 40900 | 27500 | 7200 | 6010 | 4380 | 8696 | 14750 | 8120 | 3830 | 11650 | 9360 | 23450 | 1310 | 27450 | 9661 | NaN | 18800 | NaN |
2019-01-04 | 10200 | 12950 | 4365 | 9260 | 2965 | 40800 | 27500 | 7380 | 6200 | 4505 | 9140 | 15000 | 8030 | 3805 | 11950 | 9630 | 24100 | 1330 | 27450 | 9784 | NaN | 18850 | NaN |
2019-01-07 | 10250 | 12950 | 4470 | 9100 | 3020 | 39350 | 27700 | 7210 | 6350 | 4665 | 9140 | 15200 | 7970 | 3780 | 12200 | 9700 | 24650 | 1340 | 27450 | 9784 | NaN | 18900 | NaN |
2019-01-08 | 9980 | 12900 | 4305 | 9080 | 3040 | 37550 | 27700 | 7080 | 6300 | 4600 | 9053 | 15600 | 7800 | 3730 | 12150 | 9720 | 24800 | 1340 | 27500 | 9702 | NaN | 18450 | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2019-12-23 | 9600 | 5400 | 2030 | 9070 | 2700 | 36700 | 22150 | 6570 | 6700 | 2215 | 9710 | 29700 | 5090 | 3235 | 13600 | 7910 | 23550 | 1375 | 39200 | 5140 | 19300.0 | 15450 | 9700.0 |
2019-12-24 | 9450 | 5210 | 2065 | 8840 | 2630 | 35950 | 21250 | 6500 | 6490 | 2185 | 10150 | 30300 | 5040 | 3200 | 12400 | 7870 | 23550 | 1355 | 39200 | 5060 | 19150.0 | 14450 | 9500.0 |
2019-12-26 | 9670 | 5270 | 2015 | 8810 | 2675 | 36600 | 22100 | 6620 | 6460 | 2320 | 10500 | 30300 | 4960 | 3225 | 12750 | 7890 | 24100 | 1355 | 39200 | 5110 | 20050.0 | 14000 | 9900.0 |
2019-12-27 | 9650 | 5450 | 2060 | 8900 | 2750 | 38150 | 22800 | 6690 | 6540 | 2345 | 10750 | 30650 | 4850 | 3230 | 12850 | 8010 | 24200 | 1385 | 40000 | 5250 | 20450.0 | 14000 | 9880.0 |
2019-12-30 | 9650 | 5480 | 2060 | 9040 | 2785 | 40100 | 23450 | 6790 | 6650 | 2345 | 11100 | 30650 | 4860 | 3225 | 14100 | 8060 | 24950 | 1390 | 40000 | 5250 | 20650.0 | 13950 | 9900.0 |
246 rows × 23 columns
2019년 중에 신규상장한 2개 종목은 제외합니다. (1년간 기간 수익률을 구하는 것이므로)
결측치(NaN)이 포함된 컬럼을 제외합니다.
med = med.dropna(axis=1)
med
바디텍메드 | 수젠텍 | 엑세스바이오 | 옵티팜 | 메타바이오메드 | 앱클론 | 지노믹트리 | 바이오니아 | 이수앱지스 | 파나진 | 나이벡 | 씨젠 | 아스타 | 세운메디칼 | 알리코제약 | 피씨엘 | 한스바이오메드 | 휴마시스 | 메디안디노스틱 | 녹십자엠에스 | 프로테옴텍 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date | |||||||||||||||||||||
2019-01-02 | 10400 | 12900 | 4410 | 9130 | 2960 | 42700 | 27550 | 7540 | 6170 | 4475 | 9358 | 15600 | 8290 | 3780 | 12100 | 9530 | 24600 | 1335 | 27000 | 9866 | 19400 |
2019-01-03 | 9990 | 13000 | 4180 | 9030 | 2920 | 40900 | 27500 | 7200 | 6010 | 4380 | 8696 | 14750 | 8120 | 3830 | 11650 | 9360 | 23450 | 1310 | 27450 | 9661 | 18800 |
2019-01-04 | 10200 | 12950 | 4365 | 9260 | 2965 | 40800 | 27500 | 7380 | 6200 | 4505 | 9140 | 15000 | 8030 | 3805 | 11950 | 9630 | 24100 | 1330 | 27450 | 9784 | 18850 |
2019-01-07 | 10250 | 12950 | 4470 | 9100 | 3020 | 39350 | 27700 | 7210 | 6350 | 4665 | 9140 | 15200 | 7970 | 3780 | 12200 | 9700 | 24650 | 1340 | 27450 | 9784 | 18900 |
2019-01-08 | 9980 | 12900 | 4305 | 9080 | 3040 | 37550 | 27700 | 7080 | 6300 | 4600 | 9053 | 15600 | 7800 | 3730 | 12150 | 9720 | 24800 | 1340 | 27500 | 9702 | 18450 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2019-12-23 | 9600 | 5400 | 2030 | 9070 | 2700 | 36700 | 22150 | 6570 | 6700 | 2215 | 9710 | 29700 | 5090 | 3235 | 13600 | 7910 | 23550 | 1375 | 39200 | 5140 | 15450 |
2019-12-24 | 9450 | 5210 | 2065 | 8840 | 2630 | 35950 | 21250 | 6500 | 6490 | 2185 | 10150 | 30300 | 5040 | 3200 | 12400 | 7870 | 23550 | 1355 | 39200 | 5060 | 14450 |
2019-12-26 | 9670 | 5270 | 2015 | 8810 | 2675 | 36600 | 22100 | 6620 | 6460 | 2320 | 10500 | 30300 | 4960 | 3225 | 12750 | 7890 | 24100 | 1355 | 39200 | 5110 | 14000 |
2019-12-27 | 9650 | 5450 | 2060 | 8900 | 2750 | 38150 | 22800 | 6690 | 6540 | 2345 | 10750 | 30650 | 4850 | 3230 | 12850 | 8010 | 24200 | 1385 | 40000 | 5250 | 14000 |
2019-12-30 | 9650 | 5480 | 2060 | 9040 | 2785 | 40100 | 23450 | 6790 | 6650 | 2345 | 11100 | 30650 | 4860 | 3225 | 14100 | 8060 | 24950 | 1390 | 40000 | 5250 | 13950 |
246 rows × 21 columns
데이터의 첫날(1월 2일)을 기준으로 일일 누적 수익률을 구하기 위해 다음과 같이 연산합니다.
acc_rets = med / med.iloc[0] - 1.0
acc_rets
바디텍메드 | 수젠텍 | 엑세스바이오 | 옵티팜 | 메타바이오메드 | 앱클론 | 지노믹트리 | 바이오니아 | 이수앱지스 | 파나진 | 나이벡 | 씨젠 | 아스타 | 세운메디칼 | 알리코제약 | 피씨엘 | 한스바이오메드 | 휴마시스 | 메디안디노스틱 | 녹십자엠에스 | 프로테옴텍 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Date | |||||||||||||||||||||
2019-01-02 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
2019-01-03 | -0.039423 | 0.007752 | -0.052154 | -0.010953 | -0.013514 | -0.042155 | -0.001815 | -0.045093 | -0.025932 | -0.021229 | -0.070742 | -0.054487 | -0.020507 | 0.013228 | -0.037190 | -0.017838 | -0.046748 | -0.018727 | 0.016667 | -0.020778 | -0.030928 |
2019-01-04 | -0.019231 | 0.003876 | -0.010204 | 0.014239 | 0.001689 | -0.044496 | -0.001815 | -0.021220 | 0.004862 | 0.006704 | -0.023296 | -0.038462 | -0.031363 | 0.006614 | -0.012397 | 0.010493 | -0.020325 | -0.003745 | 0.016667 | -0.008311 | -0.028351 |
2019-01-07 | -0.014423 | 0.003876 | 0.013605 | -0.003286 | 0.020270 | -0.078454 | 0.005445 | -0.043767 | 0.029173 | 0.042458 | -0.023296 | -0.025641 | -0.038601 | 0.000000 | 0.008264 | 0.017838 | 0.002033 | 0.003745 | 0.016667 | -0.008311 | -0.025773 |
2019-01-08 | -0.040385 | 0.000000 | -0.023810 | -0.005476 | 0.027027 | -0.120609 | 0.005445 | -0.061008 | 0.021070 | 0.027933 | -0.032592 | 0.000000 | -0.059107 | -0.013228 | 0.004132 | 0.019937 | 0.008130 | 0.003745 | 0.018519 | -0.016623 | -0.048969 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2019-12-23 | -0.076923 | -0.581395 | -0.539683 | -0.006572 | -0.087838 | -0.140515 | -0.196007 | -0.128647 | 0.085900 | -0.505028 | 0.037615 | 0.903846 | -0.386007 | -0.144180 | 0.123967 | -0.169990 | -0.042683 | 0.029963 | 0.451852 | -0.479019 | -0.203608 |
2019-12-24 | -0.091346 | -0.596124 | -0.531746 | -0.031763 | -0.111486 | -0.158080 | -0.228675 | -0.137931 | 0.051864 | -0.511732 | 0.084633 | 0.942308 | -0.392039 | -0.153439 | 0.024793 | -0.174187 | -0.042683 | 0.014981 | 0.451852 | -0.487128 | -0.255155 |
2019-12-26 | -0.070192 | -0.591473 | -0.543084 | -0.035049 | -0.096284 | -0.142857 | -0.197822 | -0.122016 | 0.047002 | -0.481564 | 0.122035 | 0.942308 | -0.401689 | -0.146825 | 0.053719 | -0.172088 | -0.020325 | 0.014981 | 0.451852 | -0.482060 | -0.278351 |
2019-12-27 | -0.072115 | -0.577519 | -0.532880 | -0.025192 | -0.070946 | -0.106557 | -0.172414 | -0.112732 | 0.059968 | -0.475978 | 0.148750 | 0.964744 | -0.414958 | -0.145503 | 0.061983 | -0.159496 | -0.016260 | 0.037453 | 0.481481 | -0.467869 | -0.278351 |
2019-12-30 | -0.072115 | -0.575194 | -0.532880 | -0.009858 | -0.059122 | -0.060890 | -0.148820 | -0.099469 | 0.077796 | -0.475978 | 0.186151 | 0.964744 | -0.413752 | -0.146825 | 0.165289 | -0.154250 | 0.014228 | 0.041199 | 0.481481 | -0.467869 | -0.280928 |
246 rows × 21 columns
종목별 12월 30일의 최종 수익률은 마지막 행(row)가 됩니다.
returns = acc_rets.iloc[-1]
returns
바디텍메드 -0.072115 수젠텍 -0.575194 엑세스바이오 -0.532880 옵티팜 -0.009858 메타바이오메드 -0.059122 앱클론 -0.060890 지노믹트리 -0.148820 바이오니아 -0.099469 이수앱지스 0.077796 파나진 -0.475978 나이벡 0.186151 씨젠 0.964744 아스타 -0.413752 세운메디칼 -0.146825 알리코제약 0.165289 피씨엘 -0.154250 한스바이오메드 0.014228 휴마시스 0.041199 메디안디노스틱 0.481481 녹십자엠에스 -0.467869 프로테옴텍 -0.280928 Name: 2019-12-30 00:00:00, dtype: float64
수익률이 큰 종목부터 나열해 봅니다
returns.sort_values(ascending=False)
씨젠 0.964744 메디안디노스틱 0.481481 나이벡 0.186151 알리코제약 0.165289 이수앱지스 0.077796 휴마시스 0.041199 한스바이오메드 0.014228 옵티팜 -0.009858 메타바이오메드 -0.059122 앱클론 -0.060890 바디텍메드 -0.072115 바이오니아 -0.099469 세운메디칼 -0.146825 지노믹트리 -0.148820 피씨엘 -0.154250 프로테옴텍 -0.280928 아스타 -0.413752 녹십자엠에스 -0.467869 파나진 -0.475978 엑세스바이오 -0.532880 수젠텍 -0.575194 Name: 2019-12-30 00:00:00, dtype: float64
2019년 1년의 연간 수익률에서 가장 높은 수익률을 보인 것은 씨젠 96.4% 이고, 가장 낮은 수익률을 보인것은 수젠텍 -57.5% 입니다.
returns.mean()
-0.07462202024155605
21개 종목의 평균수익률은 -7.4% 입니다.
기간을 달리해서 수익률을 추출해 봅니다.
df = med['2019-12-01':'2019-12-30'] # 특정 기간(12월 1달) 동안
acc_rets = df / df.iloc[0] - 1.0
acc_rets.iloc[-1]
바디텍메드 0.040992 수젠텍 -0.041958 엑세스바이오 -0.021378 옵티팜 0.030787 메타바이오메드 0.096457 앱클론 0.134371 지노믹트리 0.015152 바이오니아 0.046225 이수앱지스 0.047244 파나진 -0.062000 나이벡 0.082927 씨젠 0.104505 아스타 -0.063584 세운메디칼 0.028708 알리코제약 0.084615 피씨엘 0.002488 한스바이오메드 0.012170 휴마시스 0.007246 메디안디노스틱 0.000000 녹십자엠에스 -0.062500 프로테옴텍 -0.041237 Name: 2019-12-30 00:00:00, dtype: float64
'2019-12-30' 시점을 기준으로 과거 5일, 10일, 20일, 60일, 120일, 240일 각각 수익률을 구해봅니다.
각 기간의 (시작날짜, 끝날짜)는 다음과 같이 생성할 수 있습니다.
from datetime import datetime, timedelta
the_day = datetime(2019, 12, 30)
for days in [5, 10, 20, 60, 120, 240]:
start = the_day - timedelta(days)
end = the_day
print(start, '~', end)
2019-12-25 00:00:00 ~ 2019-12-30 00:00:00 2019-12-20 00:00:00 ~ 2019-12-30 00:00:00 2019-12-10 00:00:00 ~ 2019-12-30 00:00:00 2019-10-31 00:00:00 ~ 2019-12-30 00:00:00 2019-09-01 00:00:00 ~ 2019-12-30 00:00:00 2019-05-04 00:00:00 ~ 2019-12-30 00:00:00
from datetime import datetime, timedelta
the_day = datetime(2019, 12, 30)
row_dict = {}
for days in [5, 10, 20, 60, 120, 240]:
start = the_day - timedelta(days)
end = the_day
df = med[start:end] # 특정 기간
acc_rets = df / df.iloc[0] - 1.0
row_dict[days] = acc_rets.iloc[-1]
df_rets = pd.DataFrame(row_dict)
df_rets
5 | 10 | 20 | 60 | 120 | 240 | |
---|---|---|---|---|---|---|
바디텍메드 | -0.002068 | 0.013655 | 0.025505 | 0.128655 | 0.084270 | -0.138393 |
수젠텍 | 0.039848 | 0.000000 | -0.035211 | -0.094215 | -0.125997 | -0.619444 |
엑세스바이오 | 0.022333 | -0.026005 | -0.011990 | -0.021378 | -0.072072 | -0.492611 |
옵티팜 | 0.026107 | -0.010941 | 0.018018 | 0.008929 | -0.030043 | -0.174429 |
메타바이오메드 | 0.041121 | 0.029575 | 0.067050 | 0.052930 | 0.127530 | -0.068562 |
앱클론 | 0.095628 | 0.088195 | 0.049738 | 0.116992 | 0.029525 | -0.343699 |
지노믹트리 | 0.061086 | 0.093240 | -0.071287 | 0.132850 | 0.522727 | -0.366216 |
바이오니아 | 0.025680 | 0.057632 | 0.046225 | -0.089812 | -0.015942 | -0.317588 |
이수앱지스 | 0.029412 | 0.000000 | 0.024653 | -0.027778 | -0.019174 | -0.149616 |
파나진 | 0.010776 | 0.008602 | -0.022917 | -0.099808 | -0.192771 | -0.475978 |
나이벡 | 0.057143 | 0.110000 | 0.131498 | 0.140802 | 0.707692 | 0.149068 |
씨젠 | 0.011551 | 0.040747 | 0.122711 | 0.442353 | 0.377528 | 0.261317 |
아스타 | -0.020161 | -0.067179 | -0.074286 | -0.356291 | -0.041420 | -0.370466 |
세운메디칼 | 0.000000 | 0.001553 | 0.036977 | -0.034431 | -0.066570 | -0.161248 |
알리코제약 | 0.105882 | 0.014388 | 0.060150 | -0.037543 | 0.602273 | 0.184874 |
피씨엘 | 0.021546 | 0.010025 | 0.053595 | -0.122004 | 0.083333 | -0.085131 |
한스바이오메드 | 0.035270 | 0.052743 | 0.068522 | 0.091904 | 0.118834 | -0.105735 |
휴마시스 | 0.025830 | -0.007143 | 0.014599 | -0.014184 | -0.047945 | -0.268421 |
메디안디노스틱 | 0.020408 | 0.020408 | 0.000000 | -0.024390 | 0.002506 | 0.261830 |
녹십자엠에스 | 0.027397 | -0.003795 | 0.023392 | -0.275862 | 0.013514 | -0.414193 |
프로테옴텍 | -0.003571 | -0.041237 | -0.041237 | -0.097087 | -0.057432 | -0.066890 |
# 섹터 전체 기간별 수익률
df_rets.mean()
5 0.030058 10 0.018308 20 0.023129 60 -0.008541 120 0.095256 240 -0.179121 dtype: float64
def color_negative_red(val):
color = 'red' if val < 0 else 'black'
return 'color: %s' % color
def highlight_max(s):
is_max = s == s.max()
return ['background-color: yellow' if v else '' for v in is_max]
df_rets.style.\
applymap(color_negative_red).\
apply(highlight_max)
5 | 10 | 20 | 60 | 120 | 240 | |
---|---|---|---|---|---|---|
바디텍메드 | -0.00206825 | 0.0136555 | 0.0255048 | 0.128655 | 0.0842697 | -0.138393 |
수젠텍 | 0.0398482 | 0 | -0.0352113 | -0.0942149 | -0.125997 | -0.619444 |
엑세스바이오 | 0.0223325 | -0.0260047 | -0.0119904 | -0.0213777 | -0.0720721 | -0.492611 |
옵티팜 | 0.0261067 | -0.0109409 | 0.018018 | 0.00892857 | -0.0300429 | -0.174429 |
메타바이오메드 | 0.0411215 | 0.0295749 | 0.0670498 | 0.0529301 | 0.12753 | -0.0685619 |
앱클론 | 0.0956284 | 0.0881954 | 0.0497382 | 0.116992 | 0.029525 | -0.343699 |
지노믹트리 | 0.061086 | 0.0932401 | -0.0712871 | 0.13285 | 0.522727 | -0.366216 |
바이오니아 | 0.0256798 | 0.0576324 | 0.046225 | -0.0898123 | -0.015942 | -0.317588 |
이수앱지스 | 0.0294118 | 0 | 0.0246533 | -0.0277778 | -0.019174 | -0.149616 |
파나진 | 0.0107759 | 0.00860215 | -0.0229167 | -0.0998081 | -0.192771 | -0.475978 |
나이벡 | 0.0571429 | 0.11 | 0.131498 | 0.140802 | 0.707692 | 0.149068 |
씨젠 | 0.0115512 | 0.040747 | 0.122711 | 0.442353 | 0.377528 | 0.261317 |
아스타 | -0.0201613 | -0.0671785 | -0.0742857 | -0.356291 | -0.0414201 | -0.370466 |
세운메디칼 | 0 | 0.0015528 | 0.0369775 | -0.0344311 | -0.0665702 | -0.161248 |
알리코제약 | 0.105882 | 0.0143885 | 0.0601504 | -0.0375427 | 0.602273 | 0.184874 |
피씨엘 | 0.0215463 | 0.0100251 | 0.0535948 | -0.122004 | 0.0833333 | -0.0851305 |
한스바이오메드 | 0.0352697 | 0.0527426 | 0.0685225 | 0.0919037 | 0.118834 | -0.105735 |
휴마시스 | 0.0258303 | -0.00714286 | 0.0145985 | -0.0141844 | -0.0479452 | -0.268421 |
메디안디노스틱 | 0.0204082 | 0.0204082 | 0 | -0.0243902 | 0.00250627 | 0.26183 |
녹십자엠에스 | 0.0273973 | -0.00379507 | 0.0233918 | -0.275862 | 0.0135135 | -0.414193 |
프로테옴텍 | -0.00357143 | -0.0412371 | -0.0412371 | -0.0970874 | -0.0574324 | -0.0668896 |
## 엑셀로 저장
df_rets.style.\
applymap(color_negative_red).\
apply(highlight_max).\
to_excel('기간별수익률데이터(2019.12.30).xlsx', engine='openpyxl')
# 구글 colab 에서 실행한 경우 엑셀 파일을 다음과 같이 다운로드 합니다.
from google.colab import files
files.download('기간별수익률데이터(2019.12.30).xlsx')