Knowledge Map
ETF 상관계수 최소값 구하기 (동일 기간) 본문
동일 기간 동안 211개의 ETF 상관계수 값을 구하고 각각의 ETF에 대해서 가장 최소 상관계수와 ETF종목을 구해보았다.
기간이 5월 19일 부터라서 기간이 굉장히 짧은데 'ARIRANG 스마트베타4종결합' <== 이것의 시작일이 5월 19일이라서 그렇다;;
일단 동일 기간으로 구하는게 쉽기 때문에 먼저 해보았는데 생각보다 애를 먹었다;; 왠만하면 그냥 엑셀 쓰세요 ㅋㅋㅋ
연습삼아 만들어본 것이고 기간이 한달도 채 안되기 때문에 이건 코드만 참고하시길..
엑셀 파일이 조금 바뀌었다. 그대로 쓰면 작동 안될 가능성이 많이 높아서 다시 올려놓았다.
A열 : 이름, B열 : 코드, C열 : 시각, D열 : 각 etf의 가격 갯수
ETF 상관계수 최소값 가져오기 (동일 기간 : 2016-05-19일 부터)
- ETF코드를 엑셀로부터 가져온다.
- ETF코드의 데이터를 datareader로 가져온다.
- 모든 ETF의 상관관계를 구한다.
# -*- coding: utf-8 -*-
import pandas_datareader.data as pdata
import pandas as pd
import numpy as np
import xlrd
# numpy의 ndarray는 한행의 요소가 모드 같은 자료형이어야 한다.
# 리스트 생성
etf_code = []
# 엑셀 파일에서 값을 가져오기
def excel_reader():
workbook = xlrd.open_workbook("C:\ABC\excelData\Etf_Code.xlsx")
worksheet = workbook.sheet_by_index(0)
ncol = worksheet.ncols
nrow = worksheet.nrows
return [ worksheet.row_values(i)[1:] for i in range(nrow) ]
# datareader로 개별 etf price 가지옴 // testdata : 152100
cnt = 1
def get_ETFdata(code):
# print code,
global cnt
cnt += 1
# if cnt % 10 == 0 : print ''
return pdata.DataReader(code, data_source='google', start='1/1/2008')
# 추가로 가격, 거래량 데이터추가
def add_ETFdata(list):
# print range(len(list))
tmp_data = []
for i in range(len(list)):
tmp_data = get_ETFdata(list[i][1])
list[i].append(tmp_data)
# 리스트에 etf 이름 , etf코드 입력
etf_code = excel_reader()
add_ETFdata(etf_code)
# 제대로 되었는지 확인
# print etf_code[0][1] # ETF 코드
# print etf_code[0][2] # 2008-01-01 이후 시작 날짜
# print etf_code[0][3] # 현재까지의 갯수
# print etf_code[0][4] # 가격 데이터
# 가장 최근에 시작한 날짜를 구해보자.
def check_recentData():
tmp_number = 0
for i in range(len(etf_code)):
if ( etf_code[tmp_number][2] < etf_code[i][2]):
tmp_number = i
print "가장 최근에 시작된 날짜는",etf_code[tmp_number][2]
return etf_code[tmp_number][2]
recent_date = check_recentData()
pandas dataframe 사용방법
- data = {'test':[1,2,3,5,5,6,6,7,8,],'test123':[3,3,2,352,34,2,2]}
- corr_list = pd.DataFrame(data)
ETF 상관계수 구하기
- tmp_list에 임시저장 -> corr_list에 dataframe 형식으로 넣는다.
- 한글은 그대로 입력하면 인식을 못하기 때문에 숫자 0 ~ 211 까지로 부여
- 한글 이름 리스트를 만들어서 그 숫자에 대응되는 이름 출력으로 하는 것으로 확인가능
# 한글 이름 리스트
corr_listname = [etf_code[i][0] for i in range(len(etf_code))]
# 임시 리스트
tmp_list = {}
for i in range(len(etf_code)):
tmp_list[i] = etf_code[i][4]['Close'][recent_date :]
# 임시 리스트에 상관계수를 계산하여 corr_list에 값을 준다.
corr_list = pd.DataFrame(tmp_list).corr()
# pandas DataFrame은 index 함수가 없어서 특정 값의 인덱스 값을 부를수가 없다.
# 간단한 함수를 만들자
def find_index(value, num):
for i in range(211):
if value == corr_list[num][i]:
return i
for i in range(len(corr_list_result)):
print corr_listname[i],"<==>",corr_listname[find_index(corr_list[i].min(),i)],
print "[", corr_list[i].min(),"]", find_index(corr_list[i].min(),i)
# print corr_listname[i],"최소값",corr_list_result[i].min(),"index =>",find_index(corr_list_result[i].min(),i)
상관관계 히트맵 (211 X 211)
참고 출처 : http://www.slideshare.net/plusjune/py-con-2014-47762297
'경제 & 투자' 카테고리의 다른 글
네이버 파이낸스에서 etf 코드 가져오기 (0) | 2016.06.03 |
---|---|
WorldBank Indicator 정리 (0) | 2016.05.31 |
WorldBank Country 정리 (0) | 2016.05.31 |
구글 파이낸스 스크리너 (0) | 2016.05.30 |
pandas, finance를 이용한 데이터 가져오기 (0) | 2016.05.30 |