퀀트

29. 이평선 투자 전략 : 정배열 또는 역배열에 매수하는 경우

만 기 2023. 1. 25. 21:22

 

이평선을 이용한 투자전략 : 정배열 또는 역배열에 매수하는 경우

 

 

이평선 데이터들을 데이터프레임으로 합치기

# 이평선 데이터들을 데이터프레임으로 합치기
allsma_df = pd.DataFrame({f'adj_close_sma{win}d': d[f'adj_close_sma{win}d'].stack(dropna=False) for win in sma_winli})

# 맨 앞 열에 수정주가 데이터 추가
allsma_df.insert(0, 'adj_close', d['adj_close'].stack(dropna=False))
  • for문으로 딕셔너리 생성해서 데이터프레임으로 만든다.

 

 

정배열, 역배열 조건 쿼리 만들기

_cn_li = allsma_df.columns    # 수정종가 ~ 120이평선

_qrli = list()        # 정배열 리스트
_inv_qrli = list()    # 역배열 리스트
for i, cn in enumerate(_cn_li):
    if i > 0:
        _qrli.append(f"{_cn_li[i-1]} >= {_cn_li[i]}")        # 정배열 조건
        _inv_qrli.append(f"{_cn_li[i-1]} <= {_cn_li[i]}")    # 역배열 조건
_qr = ' and '.join(_qrli)
_inv_qr = ' and '.join(_inv_qrli)

print(_qr)
# adj_close >= adj_close_sma5d and adj_close_sma5d >= adj_close_sma10d 
# and adj_close_sma10d >= adj_close_sma20d and adj_close_sma20d >= adj_close_sma40d 
# and adj_close_sma40d >= adj_close_sma60d and adj_close_sma60d >= adj_close_sma120d

 

 

이평선 데이터프레임에서 조건(쿼리)에 맞는 인덱스 저장

# 정배열
aligned_midxs = allsma_df.query(_qr).index

# 역배열
inv_aligned_midxs = allsma_df.query(_inv_qr).index

# 나머지 경우
other_midxs = set(allsma_df.index) - set(aligned_midxs) - set(inv_aligned_midxs)

 

 

정배열, 역배열 조건에 해당하는 기간별 수익 데이터

exp['ret_sma_aligned'] = get_all_return_df_by(d, aligned_midxs)
exp['ret_sma_inverse_aligned'] = get_all_return_df_by(d, inv_aligned_midxs)
exp['ret_sma_not_aligned'] = get_all_return_df_by(d, other_midxs)

 

 

집계, 데이터 보기

# 이평선 정배열에서 매수할 경우
describe_and_aggperf(exp['ret_sma_aligned'])

draw_meanmed_boxplot(exp['ret_sma_aligned'], f'정배열 상황에서 매수');


# 이평선 역배열에서 매수할 경우
describe_and_aggperf(exp['ret_sma_inverse_aligned'])

draw_meanmed_boxplot(exp['ret_sma_inverse_aligned'], f'역배열 상황에서 매수');