본문 바로가기
미래걱정/주식

yfinance로 주가 저장 및 크롤링하기, csv저장, 그래프 그리기 등 (with chat gpt)

by JHistory_ 2023. 1. 26.
반응형

● 엄청난 선생님을 만났다 !

 최근 장안의 화제인 chat gpt를 통해 python을 공부한다는 사람이 있다는 힌트를 얻어서 원하는 것을 한 번 시도하는 과정을 거쳐봤다. 답답하기도 한데, 구글링 보다 훨씬 빠르고 효과적인 것 같아서 그 과정을 소개해본다. 대화형이라 굉장히 좋다.

 저번에 열심히 블로그 찾고 지지고 볶았는데, 와 이렇게 한 번에 나타내주다니! 좀더 수월하게 파이썬 코딩을 배울 수 있을 것 같다. pandas-datareader이라는 패키지로도 가능하다고 하는데, 일단 yfinance로 더 가보자.

import yfinance as yf

# Define the ticker symbol
ticker = "AAPL"

# Get the historical market data
data = yf.download(ticker, start="2010-01-01", end="2022-01-01")

# Print the data
print(data)

● csv파일로 저장해보자 !

이런식으로 물어봤더니 아래와 같이 대답해줬다.

import yfinance as yf

# Define the ticker symbol
ticker = "AAPL"

# Get the historical market data
data = yf.download(ticker, start="2010-01-01", end="2022-01-01")

# Save the data to a CSV file
data.to_csv(f"{ticker}.csv")

 코드를 실행하니 오오 미친!! 아래와 같이 파일이 하나 생겼다. data.to_csv라는 함수를쓰고 f"{ticker}.csv"로 저장하는구나를 배웠다. 

저장을 하니 Open, High, Low Close, Adj Close, Volume으로 도시되었다. Open은 장이 시작했을 때 가격, High는 그 날 최고가 Low는 그날 최저가, CLose는 종가, Adj Close는 배당이나 배분 신주 발생 등 여러가지 이슈를 고려하여 주식의 가격을 조정해둔 가격이라고 한다. Volume은 거래량이다.

그리고 csv로 저장하는 방법 2가지를 더 알려줬다. 

data.to_csv("path/to/directory/AAPL.csv")

 이 것은 특정한 경로로의 path를 지정하여 csv를 저장해주는 방식이고

data[['Open', 'High', 'Low', 'Close']].to_csv("path/to/directory/AAPL.csv")

 이 것은 열의 정류를 제한하고 특정 경로로의 path를 지정하여 csv를 저장해주는 방식이다.

● 아 귀찮아~ 그래프 까지 그려줘 ! - Candle Chart

 일단 증권사 HTS처럼 캔들차트를 한 번 그려보기로 하였다. (큰 의미가 있나?)

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.widgets import Cursor

# Read the CSV file
df = pd.read_csv("AAPL.csv", index_col='Date', parse_dates=True)

# Create the candle chart
fig, ax = plt.subplots(figsize=(15,8))
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
cursor = Cursor(ax, useblit=True, color='red', linewidth=1)
candlestick_ohlc(ax, zip(mdates.date2num(df.index.to_pydatetime()),
                         df['Open'], df['High'],
                         df['Low'], df['Close']),
                         width=.6, colorup='green', colordown='red')
plt.xlabel("Year-Month")
plt.ylabel("Stock Price")
plt.title(f"{ticker} Stock Price")
plt.show()

그리고 chat gpt선생님의 설명은

 

This code will read the CSV file named AAPL.csv, create the candle chart using the candlestick_ohlc() method from matplotlib.finance, and display the chart using the show() method. You will need to install mpl_finance library by running the command !pip install mpl_finance.

 

In this code, df is the dataframe read from the csv file and candlestick_ohlc method is used to create the chart. It takes the dataframe's index column as the x-axis and 'Open', 'High', 'Low', 'Close' columns for y-axis. You can set the width parameter to control the width of the candles, colorup parameter to set the color of the bullish candles and colordown parameter to set the color of the bearish candles. You can also customize the title, xlabel, ylabel, and other properties of the chart as per your requirements.

 

Also, The cursor widget is used to show the data value on hover.

 

Please note that this is just an example and you can customize this chart as per your requirements.

 

1. 일단 mpl_finance를 깔고

2. df는 dataframe인데 csv 파일을 읽는 것이고, candlestick_ohlc는 캔들차트를 그리는 것이다.

3. X축에 dataframe(시간)이 들어가겠고, y축에 Open, high , low, close이 들어가는 것이다. 

 

근데 이 코드를 돌리려고하니, 아래와 같은 에러가 뜬다.

NameError: name 'candlestick_ohlc' is not defined

그랬더니 미안하다고 한다.. 미안할 것 까지야..^^;; 2번이나 사과한다. candlestick_ohlc를 import하는 것을 놓쳤다고 한다.

from mpl_finance import candlestick_ohlc

그래서 full code로 적으면 아래와 같다고 한다. (수정해줌) 

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.widgets import Cursor
from mpl_finance import candlestick_ohlc

# Read the CSV file
df = pd.read_csv("AAPL.csv", index_col='Date', parse_dates=True)

# Create the candle chart
fig, ax = plt.subplots(figsize=(15,8))
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
cursor = Cursor(ax, useblit=True, color='red', linewidth=1)
candlestick_ohlc(ax, zip(mdates.date2num(df.index.to_pydatetime()),
                         df['Open'], df['High'],
                         df['Low'], df['Close']),
                         width=.6, colorup='green', colordown='red')
plt.xlabel("Year-Month")
plt.ylabel("Stock Price")
plt.title(f"{ticker} Stock Price")
plt.show()

이 코드를 실행하면 아래와 같은 오류가 또 발생한다.

  File "d:\python\selenium\candlechart.py", line 16, in <module>
    candlestick_ohlc(ax, zip(mdates.date2num(df.index.to_pydatetime()),
AttributeError: 'Index' object has no attribute 'to_pydatetime'

그래서 chat gpt선생님께 다시 물어보았다.

 

I got another error message that came from "'Index' object has no attribute 'to_pydatetime." what should I do?

 

그랬더니 이렇게 말씀해주셨다.

 

The error "'Index' object has no attribute 'to_pydatetime" is caused because the df.index is not in datetime format, so it doesn't have the method to_pydatetime() .

You can convert the index column of the dataframe to datetime format using the pd.to_datetime() function like this:

 

즉, csv파일에서 불러온 dataframe이 x축에서 시간 값이 아니기 때문이라고 한다. 이를 datetime의 형식으로 바꿔줘야 한다. 솔루션은

df.index = pd.to_datetime(df.index)

 과 같이 약간의 코드를 추가해줘야하며, 아니면

df = pd.read_csv("AAPL.csv", index_col='Date', parse_dates=['Date'])

이렇게 코드를 추가해야해도 된다고 한다. 그래서 full code를 치면 아래와 같이 나온다. 

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.widgets import Cursor
from mpl_finance import candlestick_ohlc

# Read the CSV file
df = pd.read_csv("AAPL.csv", index_col='Date', parse_dates=['Date'])

# Create the candle chart
fig, ax = plt.subplots(figsize=(15,8))
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
cursor = Cursor(ax, useblit=True, color='red', linewidth=1)
candlestick_ohlc(ax, zip(mdates.date2num(df.index),
                         df['Open'], df['High'],
                         df['Low'], df['Close']),
                         width=.6, colorup='green', colordown='red')
plt.xlabel("Year-Month")
plt.ylabel("Stock Price")
plt.title(f"{ticker} Stock Price")
plt.show()

근데 NameError: name 'ticker' is not defined 가 발생했다. 이것은 ticker라는 객체를 정의해주지 않아서이다. ticker="AAPL"을 상단에 추가하자. 나는 read the csv file뒷쪽에 추가했다.

#ticker
ticker="AAPL"

와 우!! 그랬더니 아래와 같이 그래프가 도시된다.

도구를 이용해 확대해보면

이런식으로 도시됨을 알 수 있다. chat gpt 장하다 ! 미쳤다 ! 다음시간엔 PER band를 그려보도록 하겠다 !

 

반응형

댓글