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