2X2=5-1

[파이썬] pandas과 matplotlib를 이용한 주식 데이터받기 본문

IT/Python

[파이썬] pandas과 matplotlib를 이용한 주식 데이터받기

OSHenry 2018. 7. 3. 10:46

Python 3.6에서는 DataReader의 web을 통해 구글과 야후 파이낸스 주식자료를 뽑아내는 API가 사실상 막혔다. 야후는 fix_yahoo_finance (https://pypi.org/project/fix-yahoo-finance/) 자료를 구해서 작성을 하면 된다. 하지만, 그럴 경우에는 web.DataReader가 아니라, data.get_data_yahoo 라는 메소드를 써야기에 내가 공부하는 의도와는 멀어진다.

 다행스럽게 morningstar에서 자료추출이 가능하다. 한국주식은 안되지만, 미국주식과 ETF 등은 자유롭게 데이터를 받아와 불러올수 있다. 

 불러오는 것 까지는 괜찮은데, 추출한 자료를 가지고 그래프를 그릴 때, 오류가 생긴다. new_tesla.index를 하면 MultiIndex가 출력된다. y축은 주식가격이라고 했을 경우, x축은 시계열, 시간으로 설정해야 원하는 그래프가 그려지는데, 아래와 같이 하면, x축 index를 전혀 인식을 못하고 있다.


import pandas as pd

import pandas_datareader.data as web

import matplotlib.pyplot as plt


#TESLA Data from Morningstar

tesla = web.DataReader('TSLA', 'morningstar', '2016-01-01', '2018-03-01')

print(tesla)

tesla.info()


new_tesla = tesla[tesla['Volume'] != 0]

print(new_tesla)

tesla.info()


#Moving Average

ma5 = new_tesla['Close'].rolling(window=5).mean()

ma20 = new_tesla['Close'].rolling(window=20).mean()

ma60 = new_tesla['Close'].rolling(window=60).mean()

ma120 = new_tesla['Close'].rolling(window=120).mean()


#Insert Columns

new_tesla.insert(len(new_tesla.columns), 'MA5', ma5)

new_tesla.insert(len(new_tesla.columns), 'MA20', ma20)

new_tesla.insert(len(new_tesla.columns), 'MA60', ma60)

new_tesla.insert(len(new_tesla.columns), 'MA120', ma120)


new_tesla.index

#Plot

plt.plot(new_tesla.index.level, new_tesla['Close'], label='Close')

plt.plot(new_tesla.index.level, new_tesla['MA5'], label='MA5')

plt.plot(new_tesla.index.level, new_tesla['MA20'], label='MA20')

plt.plot(new_tesla.index.level, new_tesla['MA60'], label='MA60')

plt.plot(new_tesla.index.level, new_tesla['MA120'], label='MA120')


plot.legend(loc='best')

plt.grid()

plt.show()



 Facebook의 Python Korea(https://www.facebook.com/groups/pythonkorea/) 에 질의하여 피드백 받은 결과로 new_tesla의 Dataframe 확인해보니 index가 두 개가 잡혀있는 것으로 확인이 되어서(짧은 견문으로 확인된 index는 Symbols과 Date 보여짐), 하나의 index로 설정해야된다. 


import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt

#TESLA Data from Morningstar
tesla = web.DataReader('TSLA', 'morningstar', '2016-01-01', '2018-03-01')
print(tesla)
tesla.info()

new_tesla = tesla[tesla['Volume'] != 0]
print(new_tesla)
tesla.info()

#Moving Average
ma5 = new_tesla['Close'].rolling(window=5).mean()
ma20 = new_tesla['Close'].rolling(window=20).mean()
ma60 = new_tesla['Close'].rolling(window=60).mean()
ma120 = new_tesla['Close'].rolling(window=120).mean()

#Insert Columns
new_tesla.insert(len(new_tesla.columns), 'MA5', ma5)
new_tesla.insert(len(new_tesla.columns), 'MA20', ma20)
new_tesla.insert(len(new_tesla.columns), 'MA60', ma60)
new_tesla.insert(len(new_tesla.columns), 'MA120', ma120)

new_tesla.index
df = new_tesla.reset_index() #MultiIndex로 잡힌 new_tesla의 Dataframe을 Datetimeindex로 설정
df = df.set_index('Date')
#Plot
plt.plot(df['Close'], label = 'Close')
plt.plot(df['MA5'], label = 'MA5')
plt.plot(df['MA20'], label = 'MA20')
plt.plot(df['MA60'], label = 'MA60')
plt.plot(df['MA120'], label = 'MA120')

plt.legend(loc = 'best')
plt.grid()
plt.show()

위와 같이 작성하면, 아주 행복하게 아래와 같이 그래프를 얻을 수 있다. 크기를 조정해서 그래프를 더 늘릴 수도 있다.


  • Dataframe의 index가 2개인 new_tesla에서 바로 불러서 그래프를 그릴 수 없을까? 한 번 더 고민해봐야겠다.
  • Big tip은 python 3.4버전에서는 야후에서 주식 데이터를 불러올 수 있다. 국내주식도 당연히 불러와진다!!


Comments