티스토리 뷰

1편에서는 S&P 500 및 KOSPI 데이터 수집, 정제, 상관 분석하는 방법을 알아봤습니다.

2편에서는 삼성뿐 아니라 다른 기업들 정보를 활용하여 상관 분석을 수행하고, 관련이 있는 기업들을 추출한 후, S&P 500 Index가 올랐을 때 주식을 샀다가 팔면 이득인지 시뮬레이션을 돌려보도록 하겠습니다.

 

1. 함수 생성

기업별로 데이터를 가져와 S&P 500 Index와 상관분석을 수행합니다. 이를 위해 1에서 전처리한 코드들을 함수로 생성하여 사용합니다.

# 9. 기업 일별 주식 정보 가져오는 함수
def get_company_stock(start_date, end_date, code):
    df = stock.get_market_ohlcv(start_date, end_date, code, "d")    
    return df.reset_index()


# 한국 주식 날짜 타입 변경하는 함수
def change_date_type(df):
    df['날짜'] = pd.to_datetime(df['날짜']).dt.strftime('%Y-%m-%d')
    return df
    
    
# 11. join 함수
def merge_df(sp_df, k_df):
    df = sp_df.merge(k_df, left_on="Date", right_on="날짜", how="inner")
    return df
    
    
 # 12. 상관분석 함수
def show_correlation(df, company_name):
    print(company_name)
    print(f"{x}, {y}: {stats.pearsonr(df["stock_plus_minus"], df["sp_plus_minus"])}")

 

 

2.  S&P 500 plus_minus 컬럼 추가

sp_df는 매번 재사용됩니다.

sp_df에 Close-Open으로 구한 Index 증감 값을 만들어 놓습니다.

sp_df["sp_plus_minus"] = df["Close"] - df['Open']

 

3. 모든 기업 S&P 500 Index 상관 분석

루프문을 통해 KOSPI에 상장한 기업들의 주식 증감과 S&P 500 Index 증감과의 상관을 분석합니다.

이를 통해 관련이 있는 기업들을 추출합니다.

def get_under_p_value_company(p_value=0.05):
    p_value_under_code_company_dct = {}
    p_value_under_code_r_dct = {}
    s_date = "20240124" #S&P data와 날짜 맞춰주기
    e_date = "20240419" #S&P data와 날짜 맞춰주기
    for code, company_name in c_company_dct.items():
        df = get_company_stock(start_date=s_date, end_date=e_date, code=code)
        df = change_date_type(df=df)
        df["kospi_plus_minus"] = df["종가"] - df['시가']
        df = merge_df(sp_df=sp_df, k_df=df)
        c_p_value = stats.pearsonr(df["sp_plus_minus"], df["kospi_plus_minus"])
        if c_p_value[1] <= p_value:
            p_company_code_dct[code] = company_name
            p_value_under_code_r_dct[code] = c_p_value
            print(company_name, c_p_value)
    return p_value_under_code_company_dct, p_value_under_code_r_dct

 

결과는 다음과 같습니다.

BYC우 PearsonRResult(statistic=-0.3041487761199125, pvalue=0.037661855815723774)
CJ씨푸드1우 PearsonRResult(statistic=0.4144222637915005, pvalue=0.0037783656730073084)
KPX케미칼 PearsonRResult(statistic=0.2895175683840675, pvalue=0.04839477578314808)
LIG넥스원 PearsonRResult(statistic=0.3417248683799405, pvalue=0.018726937690968965)
S-Oil PearsonRResult(statistic=0.31177929459365483, pvalue=0.03289283959440415)
SH에너지화학 PearsonRResult(statistic=0.3143365180130889, pvalue=0.03141097639205093)
SNT에너지 PearsonRResult(statistic=0.305339266290172, pvalue=0.03688243949489405)
경보제약 PearsonRResult(statistic=-0.3660099921324736, pvalue=0.011401680906954611)
남성 PearsonRResult(statistic=0.31130203001358653, pvalue=0.033175708242393555)
대원전선우 PearsonRResult(statistic=0.29247465461568456, pvalue=0.046045955051511725)
동원F&B PearsonRResult(statistic=-0.3529293831828689, pvalue=0.014962800038167998)
두산에너빌리티 PearsonRResult(statistic=0.2892283166876017, pvalue=0.048629655844805914)
미래아이앤지 PearsonRResult(statistic=0.2893898818054964, pvalue=0.04849834693635607)
미래에셋생명 PearsonRResult(statistic=-0.39069661880415196, pvalue=0.006623510349908629)
사조동아원 PearsonRResult(statistic=-0.35854101150827916, pvalue=0.013333482667996808)
삼성전기 PearsonRResult(statistic=0.30032045818416575, pvalue=0.04026053124328716)
삼양식품 PearsonRResult(statistic=-0.4195362074478592, pvalue=0.003330034400215497)
세아베스틸지주 PearsonRResult(statistic=0.33403710263975106, pvalue=0.021748679728881747)
세아홀딩스 PearsonRResult(statistic=-0.32224389605820747, pvalue=0.027174651006320733)
신세계 I&C PearsonRResult(statistic=-0.31226943138003005, pvalue=0.032604420913461)
신풍 PearsonRResult(statistic=-0.43646836254219396, pvalue=0.002161266493482895)
써니전자 PearsonRResult(statistic=0.3263166989315946, pvalue=0.025185663862581968)
아모레G3우(전환) PearsonRResult(statistic=-0.3119781148083324, pvalue=0.032775591428992806)
아세아제지 PearsonRResult(statistic=-0.36318438746878134, pvalue=0.012102225073417279)
영흥 PearsonRResult(statistic=0.2925698688183534, pvalue=0.04597189603241513)
웅진씽크빅 PearsonRResult(statistic=0.2961771628914495, pvalue=0.043236697148925224)
웰바이오텍 PearsonRResult(statistic=-0.34724352846391715, pvalue=0.01678348220082103)
인디에프 PearsonRResult(statistic=0.31037339621878957, pvalue=0.03373186220718158)
일정실업 PearsonRResult(statistic=0.3421487563502448, pvalue=0.018571205523011343)
일진홀딩스 PearsonRResult(statistic=0.29087489263073574, pvalue=0.0473048567908812)
자화전자 PearsonRResult(statistic=0.31624935851499353, pvalue=0.03033906095448699)
전방 PearsonRResult(statistic=-0.2884985651549743, pvalue=0.049226344947667665)
조일알미늄 PearsonRResult(statistic=0.3109485918939041, pvalue=0.03338648016421841)
코오롱모빌리티그룹우 PearsonRResult(statistic=-0.31226173236956006, pvalue=0.032608935129936095)
코오롱플라스틱 PearsonRResult(statistic=0.29004853067320785, pvalue=0.047966016416027504)
티에이치엔 PearsonRResult(statistic=0.31036282936461695, pvalue=0.033738234686978355)
하이트론 PearsonRResult(statistic=0.3847849759317869, pvalue=0.007571451046600162)
한국ANKOR유전 PearsonRResult(statistic=0.379319465970421, pvalue=0.008550189945791228)
한국전자홀딩스 PearsonRResult(statistic=-0.32954864025397695, pvalue=0.023695297009790263)
한국특강 PearsonRResult(statistic=-0.32905461366101285, pvalue=0.023918205655129414)
한창 PearsonRResult(statistic=-0.3448246579831927, pvalue=0.017613161333313275)
한화에어로스페이스 PearsonRResult(statistic=0.29515020006760023, pvalue=0.04400149567669158)

 

4. 단타 시뮬레이션

S&P 500 index와 양의 상관관계를 가진 기업들을 대상으로 

S&P 500 index가 올랐을 때 시가에 사고, 당일 종가에 파는 단타 전략을 펼친다면 어떤 결과가 나올까요?

혹은 보유만 하고 있다면 어떤 결과가 나올까요? 

100만원 씨드가 있다는 것을 가정으로 1월 24일부터 4월 23일까지의 데이터로 시뮬레이션을 돌려보았습니다.

결과는 다음과 같습니다.

 

기업명 수익(단타) 수익(보유)
CJ씨푸드1우 -₩42,650 -₩19,200
KPX케미칼 ₩49,050 ₩46,000
LIG넥스원 ₩309,400 ₩277,600
S-Oil ₩67,200 ₩139,500
SH에너지화학 -₩26,615 -₩81,282
SNT에너지 ₩58,607 ₩474,012
남성 -₩20,434 -₩140,700
대원전선우 ₩41,650 ₩1,178,025
두산에너빌리티 -₩5,670 -₩7,260
미래아이앤지 ₩113,864 -₩10,725
삼성전기 ₩6,100 -₩4,800
세아베스틸지주 ₩118,250 ₩9,800
써니전자 -₩34,154 -₩153,126
영흥 ₩6,883 -₩57,288
웅진씽크빅 ₩7,945 -₩177,450
인디에프 -₩39,738 -₩106,110
일진홀딩스 ₩109,035 ₩109,880
자화전자 ₩189,500 -₩203,050
조일알미늄 ₩16,455 ₩226,920
코오롱플라스틱 ₩61,090 -₩36,450
티에이치엔 ₩144,780 ₩74,500
하이트론 ₩99,726 ₩134,863
한국ANKOR유전 -₩1,161 -₩33,579
한화에어로스페이스 ₩634,400 ₩588,700

 

단타: 7.8% 수익률

보유: 9.3% 수익률

 

두 가지 전략 모두 수익을 내는 것으로 확인되었으며, 단타 < 보유가 1.5% 정도 수익률이 높은 것으로 나타났습니다.

 

단타 시뮬레이션 코드는 다음과 같습니다.

# 시뮬레이션 돌려보기
def day_trading_simulation():
    s_date = "20240124"
    e_date = "20240419"
    for code, company_name in p_company_code_dct.items():
        try:
            money = 1000000
            df = get_company_stock(start_date=s_date, end_date=e_date, code=code)
            df = change_date_type(df=df)
            df = merge_df(sp_df=sp_df, k_df=df)
            df = df.sort_values(by=["날짜"], ascending=True)
            r_p_values = p_company_code_r_dct[code]
            if r_p_values[0] > 0:
                for idx, row in df.iterrows():
                    if row["o_c_d"] > 0:
                        stock_cnt = int(money/row['시가'])
                        remain_money = money - row['시가'] * stock_cnt
                        money = stock_cnt*row['종가'] + remain_money
                        #print(company_name, row["날짜"], money, row['시가'], row['종가'], stock_cnt)
                print(company_name, money)
        except:
            pass

 

보유 시뮬레이션 코드는 다음과 같습니다.

def holding_simulation():
    s_date = "20240124"
    e_date = "20240419"
    for code, company_name in p_company_code_dct.items():
        try:
            money = 1000000
            remain_money = 0
            df = get_company_stock(start_date=s_date, end_date=e_date, code=code)
            df = change_date_type(df=df)
            df = merge_df(sp_df=sp_df, k_df=df)
            df = df.sort_values(by=["날짜"], ascending=True)
            r_p_values = p_company_code_r_dct[code]
            df = df.reset_index(drop=True)
            if r_p_values[0] > 0:                
                stock_cnt = int(money/df.at[0, '시가'])
                remain_money = money - df.at[0, '시가'] * stock_cnt
            if remain_money != 0:
                remain_money += df.at[len(df)-1, '종가'] * stock_cnt
            else:
                remain_money += money
            if remain_money != 1000000:
                print(company_name, remain_money)
        except:
            pass
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함