STOCK/변동성돌파전략
[파이썬 주식] 변동성돌파전략 - 2. 적정 종목 선정하기
BOTTLE6
2021. 1. 23. 22:45
##2021.01.19
1. 종목명 불러오기
df_code = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
df_code=df_code[['회사명','종목코드']]
def make_code(x):
x=str(x)
return '0'*(6-len(x))+x
df_code.종목코드 = df_code.종목코드.apply(make_code)
df_code = df_code.set_index("종목코드")
#출처: https://wendys.tistory.com/173 [웬디의 기묘한 이야기]
1. 종목명 불러오기 [결과]
회사명
종목코드
155660 DSR
001250 GS글로벌
294870 HDC현대산업개발
001390 KG케미칼
011070 LG이노텍
... ...
199800 툴젠
222670 플럼라인생명과학
239890 피엔에이치테크
331660 한국미라클피플사
212310 휴벡셀
2. 데이터 돌려보기 함수
def 돌려보기(codes):
def load_data(code, k, start):
code = str(code)+".KS"
df=pd.DataFrame()
df = pdr.get_data_yahoo(code, start)
df['변동폭'] = df['High'] - df['Low']
df['목표가'] = df['Open'] + df['변동폭'].shift(1)*k
df['어제종가'] = df['Close'].shift(1)
df['내일시가'] = df['Open'].shift(-1)
df['어제거래량'] = df['Volume'].shift(1)
df['그제거래량'] = df['Volume'].shift(2)
df['시가-어제종가'] = df['Open']-df['어제종가']
df['MA3_yes'] = df['Close'].rolling(window=3).mean().shift(1)
return df
start = time.time()
a=[]
b=[]
c=[]
d=[]
e=[]
f=[]
g=[]
h=[]
i=[]
j=[]
k=[]
name=[]
for code in codes:
try:
df = load_data(code, k=0.5, start='2020-01-01')
기간 = df.shape[0] # 기간수
cond = ( df['High'] > df['목표가'] ) & ( df['목표가'] > df['MA3_yes'] ) # 구매조건
df=df[cond]
df['수익률'] = df['내일시가']/df['목표가'] - 0.0032
df['승패'] = np.where(df['수익률']>1, 1, 0)
df=df.iloc[:-2]
조건만족횟수 = df.shape[0] # 조건만족 수
조건만족비율 = 조건만족횟수/기간
조건승률 = df['승패'].value_counts()[1] / len(df['승패'])
#최근승률 = df[-1:].승패.value_counts()[1]/ len(df[-10:].승패)
보유수익률 = (df['Close'][-1]/df['Close'][0]-1)
돌파수익률 = (df.수익률.cumprod()[-1]-1)
최대수익률 = (df.loc[df.수익률.idxmax()].수익률-1)
평균수익률 = df.수익률.mean()-1
중앙수익률 = df.수익률.median()-1
최대손실률 = (df.loc[df.수익률.idxmin()].수익률-1)
기간수익률 = df.수익률.cumprod().iloc[-1]
N = (df.index[-1] - df.index[0]).days / 252
CAGR = (기간수익률 ** (1/N))-1
name.append(code)
a.append(조건만족횟수)
b.append(조건만족비율)
c.append(조건승률)
#d.append(최근승률)
e.append(보유수익률)
f.append(돌파수익률)
g.append(최대수익률)
h.append(평균수익률)
i.append(중앙수익률)
j.append(최대손실률)
k.append(CAGR)
time.sleep(1)
except :
pass
df=pd.DataFrame({"종목코드":name,"조건만족횟수":a,"조건만족비율":b,"조건승률":c,"보유수익률":e,"돌파수익률":f,"평균수익률":h,"중앙수익률":i,"최대수익률":g,"최대손실률":j,"CAGR":k})
print("완료 소요시간 :", time.time() - start) # 현재시각 - 시작시간 = 실행 시간
return df
3. 종목 돌려보기
codes = list(df_code.index)
df = 돌려보기(codes)
3. 종목 돌려보기 [결과]
완료 소요시간 : 4862.438432455063
4. 엑셀파일 저장 후 불러오기
df.to_csv('20210119_변동성돌파전략_종목검색.csv',encoding='utf-8-sig')
df= pd.read_csv('20210119_변동성돌파전략_종목검색.csv',encoding='utf-8-sig')
df.drop(columns="Unnamed: 0",axis=1,inplace=True)
def make_code(x):
x=str(x)
return '0'*(6-len(x))+x
df.종목코드 = df.종목코드.apply(make_code)
5. 순위 및 클래스 나누기
df['랭크_돌파'] = df['돌파수익률'].rank(ascending=False) #출처: https://rfriend.tistory.com/461 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]
df['랭크_중앙'] = df['중앙수익률'].rank(ascending=False) #출처: https://rfriend.tistory.com/461 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]
def 그룹화(x):
return (x//226)+1 # 4개의 클래스로 나누기 위해 226으로 나눔
df['랭크_돌파'] = df['랭크_돌파'].apply(lambda x:그룹화(x))
df['랭크_중앙'] = df['랭크_중앙'].apply(lambda x:그룹화(x))
6. 조건 지정하여 종목 고르기
cond = (df['랭크_중앙']<=2) & (df['랭크_돌파']<=2) & (df['최대손실률'] > -0.07) & (df['조건승률']>0.53 ) & (df['조건만족비율']>0.02 ) & (df['조건만족횟수']>30 ) & (df['CAGR']>0.45)
print(df[cond].shape[0])
print("평균승률 : {:.2f}".format(df[cond].조건승률.mean()))
print("평균수익률 : {:.2f}".format(df[cond].평균수익률.mean()))
print("중앙수익률 : {:.2f}".format(df[cond].중앙수익률.mean()))
print("돌파수익률 : {:.2f}".format(df[cond].돌파수익률.mean()))
df[cond].sort_values(by='조건승률',ascending=False)
6. 조건 지정하여 종목 고르기[결과]
총 35개가 조건을 만족하며 평균승률 59%, 평균 수익률 1%, 중앙수익률 0%
35
평균승률 : 0.59
평균수익률 : 0.01
중앙수익률 : 0.00
돌파수익률 : 1.04
종목코드 조건만족횟수 조건만족비율 조건승률 보유수익률 돌파수익률 평균수익률 중앙수익률 최대수익률 최대손실률 CAGR 종목이름 돌파-보유 랭크_돌파 랭크_중앙
377 068270 71 0.273077 0.661972 1.085464 1.534420 0.013954 0.006484 0.228377 -0.044674 0.913956 셀트리온 0.448956 1.0 1.0
662 000990 71 0.273077 0.661972 1.138169 1.686107 0.014672 0.013087 0.158890 -0.064284 0.960053 DB하이텍 0.547938 1.0 1.0
264 181710 66 0.253846 0.636364 0.082729 0.750181 0.008804 0.004214 0.108655 -0.031502 0.474864 엔에이치엔 0.667453 1.0 1.0
200 006360 72 0.276923 0.625000 0.421603 0.814277 0.008628 0.005117 0.102277 -0.046031 0.512154 GS건설 0.392675 1.0 1.0
486 009470 74 0.284615 0.621622 0.421538 1.372054 0.012262 0.008343 0.142431 -0.051606 0.827510 삼화전기 0.950515 1.0 1.0
124 035150 65 0.250000 0.615385 -0.370455 0.862434 0.009916 0.007553 0.106824 -0.042514 0.554961 백산 1.232889 1.0 1.0
702 002840 78 0.300000 0.615385 1.378893 0.703217 0.007019 0.003084 0.084352 -0.039793 0.451740 미원상사 -0.675676 1.0 1.0
784 005940 69 0.265385 0.608696 -0.020325 0.715484 0.008089 0.004852 0.078165 -0.036049 0.462134 NH투자증권 0.735809 1.0 1.0
874 011760 66 0.253846 0.606061 0.037791 0.767687 0.009036 0.003283 0.113905 -0.043908 0.483477 현대종합상사 0.729897 1.0 1.0
423 032560 71 0.273077 0.605634 0.223315 0.726131 0.008305 0.003923 0.152290 -0.064424 0.462294 황금에스티 0.502816 1.0 1.0
305 005380 76 0.292308 0.605263 1.139130 1.278526 0.011329 0.004504 0.110436 -0.053840 0.776905 현대자동차 0.139395 1.0 1.0
740 029460 68 0.261538 0.602941 0.502778 1.052777 0.011209 0.005411 0.205868 -0.060183 0.659054 케이씨 0.549999 1.0 1.0
422 004020 75 0.288462 0.600000 0.592845 1.427991 0.012391 0.007864 0.124646 -0.057808 0.857487 현대제철 0.835146 1.0 1.0
757 086280 84 0.323077 0.595238 0.420495 0.757480 0.007249 0.006231 0.124949 -0.066981 0.485596 현대글로비스 0.336985 1.0 1.0
339 001140 56 0.215385 0.589286 -0.229167 1.735300 0.020895 0.005075 0.414867 -0.068669 1.018627 국보 1.964467 1.0 1.0
789 017040 73 0.280769 0.589041 -0.015909 0.867859 0.009036 0.001726 0.175961 -0.034199 0.532174 광명전기 0.883768 1.0 2.0
335 001510 65 0.250000 0.584615 0.463455 2.120110 0.020226 0.001712 0.467606 -0.054611 1.208044 SK증권 1.656655 1.0 2.0
521 039490 65 0.250000 0.584615 0.783920 0.899486 0.010515 0.005357 0.131880 -0.063067 0.557304 키움증권 0.115566 1.0 1.0
672 210980 65 0.250000 0.584615 0.603774 1.020699 0.011458 0.005446 0.177888 -0.040323 0.634025 SK디앤디 0.416926 1.0 1.0
195 131390 77 0.296154 0.584416 1.040909 0.796521 0.008252 0.003365 0.149785 -0.067333 0.501864 피앤이솔루션 -0.244388 1.0 1.0
845 020760 84 0.323077 0.583333 0.914408 0.750629 0.007259 0.005531 0.096085 -0.068135 0.484795 일진디스플 -0.163779 1.0 1.0
165 003670 72 0.276923 0.583333 1.582915 0.809642 0.008824 0.003404 0.112639 -0.068707 0.509470 포스코케미칼 -0.773273 1.0 1.0
33 028050 64 0.246154 0.578125 -0.272966 0.687714 0.008767 0.003156 0.118295 -0.044176 0.451463 삼성엔지니어링 0.960679 1.0 1.0
28 204320 78 0.300000 0.576923 1.067176 1.317058 0.011503 0.008987 0.111554 -0.069985 0.792027 만도 0.249882 1.0 1.0
658 065680 82 0.315385 0.573171 3.663761 1.357322 0.011272 0.004638 0.140352 -0.069154 0.850877 우주일렉트로 -2.306439 1.0 1.0
280 005070 67 0.257692 0.567164 1.053292 0.710060 0.008595 0.010841 0.101791 -0.066548 0.461977 코스모신소재 -0.343232 1.0 1.0
817 006800 76 0.292308 0.565789 0.415094 0.843814 0.008536 0.004014 0.147609 -0.053901 0.516963 미래에셋대우 0.428720 1.0 1.0
176 011210 78 0.300000 0.564103 0.482723 1.738244 0.013952 0.004707 0.216188 -0.051779 1.008470 현대위아 1.255521 1.0 1.0
314 073490 73 0.280769 0.561644 0.889881 0.750957 0.008237 0.004800 0.178618 -0.048170 0.486641 이노와이어리스 -0.138924 1.0 1.0
485 004440 73 0.280769 0.547945 0.708333 0.947014 0.009713 0.004257 0.109476 -0.067218 0.584104 삼일씨엔에스 0.238681 1.0 1.0
670 011790 84 0.323077 0.547619 1.040230 0.958196 0.008427 0.003714 0.096941 -0.047801 0.586363 SKC -0.082034 1.0 1.0
714 035510 75 0.288462 0.546667 0.167401 0.810071 0.008514 0.002054 0.166391 -0.051587 0.518430 신세계I&C 0.642670 1.0 2.0
433 200130 68 0.261538 0.544118 0.935361 1.160225 0.012184 0.003824 0.175600 -0.047429 0.699460 콜마비앤에이치 0.224864 1.0 1.0
539 079430 70 0.269231 0.542857 0.239852 0.815490 0.009162 0.001464 0.140298 -0.067672 0.511136 현대리바트 0.575638 1.0 2.0
876 069260 81 0.311538 0.530864 0.385417 0.768054 0.007549 0.000671 0.163992 -0.044822 0.495212 휴켐스 0.382637 1.0 2.0
7. 35개 종목에 대해 다시 3개월간 돌려보기
돌려보기의 start='2020-11-01'로 변경
cond = (df['랭크_중앙']<=2) & (df['랭크_돌파']<=2) & (df['최대손실률'] > -0.07) & (df['조건승률']>0.53 ) & (df['조건만족비율']>0.02 ) & (df['조건만족횟수']>30 ) & (df['CAGR']>0.45)
codes = list(df.loc[cond,'종목코드'].values)
check_df = 돌려보기(codes)
8. 7의 결과를 바탕으로 다시 평가하기
check_cond = (check_df.CAGR>0) & (check_df.조건승률>0.5)
print(check_df[check_cond].shape[0])
print("평균승률 : {:.2f}".format(check_df[check_cond].조건승률.mean()))
print("평균수익률 : {:.2f}".format(check_df[check_cond].평균수익률.mean()))
print("중앙수익률 : {:.2f}".format(check_df[check_cond].중앙수익률.mean()))
print("돌파수익률 : {:.2f}".format(check_df[check_cond].돌파수익률.mean()))
check_df[check_cond].sort_values(by="조건승률",ascending=False)
8. 7의 결과를 바탕으로 다시 평가하기[결과]
28
평균승률 : 0.69
평균수익률 : 0.01
중앙수익률 : 0.01
돌파수익률 : 0.20
9. 종목 선정 완료
종목이름 종목코드 조건만족횟수 조건만족비율 조건승률 보유수익률 돌파수익률 평균수익률 중앙수익률 최대수익률 최대손실률 CAGR
13 셀트리온 068270 13 0.236364 0.923077 0.348973 0.390808 0.026097 0.018149 0.086231 -0.010873 2.741699
20 현대리바트 079430 7 0.127273 0.857143 0.120000 0.125655 0.017148 0.019164 0.043240 -0.001542 0.815865
29 NH투자증권 005940 15 0.272727 0.800000 0.193069 0.203099 0.012580 0.006800 0.038084 -0.031400 1.120244
22 DB하이텍 000990 15 0.272727 0.800000 0.726225 0.276865 0.016866 0.021618 0.053711 -0.056859 1.791314
25 미원상사 002840 14 0.254545 0.785714 0.281407 0.249681 0.016272 0.012710 0.072800 -0.016740 1.230882
12 국보 001140 9 0.163636 0.777778 -0.095355 0.097362 0.010534 0.007980 0.047451 -0.016006 0.477305
19 키움증권 039490 13 0.236364 0.769231 0.285068 0.283454 0.019605 0.017025 0.055624 -0.007200 1.757483
33 현대종합상사 011760 12 0.218182 0.750000 0.197987 0.139751 0.011244 0.009048 0.065502 -0.030400 0.748420
0 만도 204320 19 0.345455 0.736842 0.742600 0.487205 0.021718 0.019590 0.101789 -0.046246 4.781767
11 SK증권 001510 15 0.272727 0.733333 0.235624 0.304836 0.018393 0.009581 0.097342 -0.020452 2.001775
15 황금에스티 032560 14 0.254545 0.714286 0.292285 0.247815 0.016658 0.014323 0.094572 -0.045004 1.459261
6 GS건설 006360 17 0.309091 0.705882 0.426573 0.365978 0.018840 0.011578 0.081877 -0.011489 2.481567
14 현대제철 004020 16 0.290909 0.687500 0.454121 0.186463 0.011035 0.011443 0.068631 -0.022595 1.075648
5 피앤이솔루션 131390 16 0.307692 0.687500 0.164921 0.132425 0.007932 0.002228 0.060148 -0.008175 0.644513
34 휴켐스 069260 12 0.218182 0.666667 0.112971 0.164895 0.013061 0.012298 0.060545 -0.026316 0.919216
9 현대자동차 005380 14 0.254545 0.642857 0.401709 0.165427 0.011367 0.002899 0.067070 -0.036111 0.944760
27 케이씨 029460 14 0.254545 0.642857 0.116803 0.087189 0.006125 0.006239 0.038340 -0.020778 0.429109
4 현대위아 011210 14 0.254545 0.642857 0.627586 0.631285 0.037611 0.009821 0.216188 -0.016707 6.308547
28 현대글로비스 086280 16 0.290909 0.625000 0.116667 0.056192 0.003960 0.010139 0.077881 -0.066981 0.240186
32 일진디스플 020760 16 0.290909 0.625000 0.667081 0.130977 0.008275 0.011642 0.079905 -0.068135 0.776032
23 SKC 011790 13 0.236364 0.615385 0.257379 0.117033 0.008860 0.009864 0.064576 -0.035610 0.546178
16 콜마비앤에이치 200130 13 0.250000 0.615385 0.009940 0.077811 0.006004 0.004448 0.057319 -0.027215 0.356034
26 신세계I&C 035510 13 0.236364 0.615385 0.072874 0.009232 0.000751 0.002648 0.019112 -0.015058 0.038694
2 백산 035150 13 0.236364 0.615385 0.127162 0.093420 0.007170 0.007109 0.052144 -0.035155 0.517072
8 코스모신소재 005070 15 0.272727 0.600000 0.301325 0.130282 0.008597 0.013016 0.049791 -0.042035 0.752640
24 SK디앤디 210980 12 0.218182 0.583333 0.075328 0.173001 0.013752 0.007020 0.050563 -0.024552 0.976906
1 삼성엔지니어링 028050 18 0.327273 0.555556 0.231111 0.039956 0.002454 0.000639 0.064285 -0.029107 0.178862
31 미래에셋대우 006800 13 0.236364 0.538462 0.153846 0.117136 0.008726 0.000210 0.041233 -0.015058 0.557485