교육 정보
- 교육 명: 경기미래기술학교 AI 교육
- 교육 기간: 2023.05.08 ~ 2023.10.31
- 오늘의 커리큘럼:
머신러닝
(7/17 ~ 7/28)- 강사: 이현주, 이애리 강사님
- 강의 계획:
1. 머신러닝
import FinanceDataReader as fdr
# 삼성전자(005930) 전체 (1996-11-05 ~ 현재)
ss = fdr.DataReader('005930')
from pandas_datareader import data as pdr
ss_pdr = pdr.DataReader('005930', 'naver','1999-04-09')
ss_pdr.dtypes
#
# 결과
Open object
High object
Low object
Close object
Volume object
dtype: object
데이터 타입 변경 (object → float)
ss_pdr= ss_pdr.astype('float')
ss_pdr
pandas.DataFrame.pct_change(): 변화값 계산 함수
ss_pdr['Change'] = ss_pdr['Close'].pct_change()
ss_pdr
→ FinanceDataReader로 가져온 데이터의 change 값과 동일함을 확인
pandas.DataFrame.shift(): 데이터 위치 이동 함수
ex. df['col'].shift(1)하면 df 데이터의 ['col'] 컬럼 값들이 아래로 한칸씩 이동
# 종가가 한칸씩 이동된 컬럼 생성
ss_pdr['Lag'] = ss_pdr['Close'].shift(1)
# 결측치 처리 (0번 행 처리)
ss_pdr['Lag'].fillna(ss_pdr['Close'], inplace=True) # 해당 행의 close 값 불러오기
ss_pdr['Lag'].bfill(inplace=True) # 아래 값이 해당 행의 close 와 같으므로 이렇게도 가능
ss_pdr['Lag'].fillna(method='bfill', inplace=True) # 이렇게도 가능
# 증감 비율 계산
ss_pdr['Change'] = (ss_pdr['Close']-ss_pdr['Lag'])/ss_pdr['Close']
ss_pdr
# 이렇게도 구할수 있지만
ss_pdr[ss_pdr['High'] == ss_pdr['High'].max()]
# 이런 다 완성되어있는 함수가 있음
ss_pdr['High'].idxmax()
# 최저가
ss_pdr['High'].idxmin()
# 종가 차트 그리기
sns.lineplot(ss_pdr['Close'])
# 위 코드와 동일
sns.lineplot(x= ss_pdr.index, y=ss_pdr['Close'])
# 저가 차트 그리기
ss_pdr['Low'].plot()
→ 저가차트에서 이상한 부분 확대해보고자 함
# 2018.1~2008.6까지 low 차트
# 거래정지일 (2018.4.30-5.3)
ss_pdr.loc['2018-01-01':'2018-06-30']['Low'].plot()
pandas.DataFrame.rolling(window=n)
ss_pdr ['MA5'] = ss_pdr['Close'].rolling(window=5).mean()
ss_pdr
→ 0 ~ 3번 행에 결측치 발생 → min_periods 값 지정하여 처리
# window 갯수를 충족하지 못하는 항목 처리 (0~3 행) → 최소값 지정
ss_pdr ['MA5'] = ss_pdr['Close'].rolling(window=5, min_periods=1).mean()
ss_pdr
# 5, 10, 30 이동평균선을 한 그래프에 그리기
for num in [5, 10, 30]:
ss_pdr['Close'].rolling(window=num, min_periods=1).mean().plot(label=num)
plt.legend()
plt.show()
# 2022년 11월 부터 5, 10, 30 이동평균선을 한 그래프에 그리기
for num in [5, 10, 30]:
ss_pdr.loc['2022-11-01':]['Close'].rolling(window=num, min_periods=1).mean().plot(label=num)
plt.legend()
plt.show()
!pip install mpl_finance
from mpl_finance import candlestick2_ohlc
candlestick2_ohlc?
# 도움말
#
# 결과
# 도움말
Signature: candlestick2_ohlc(ax, opens, highs, lows, closes, width=4, colorup='k', colordown='r', alpha=0.75)
Docstring:
Represent the open, close as a bar line and high low range as a
vertical line.
NOTE: this code assumes if any value open, low, high, close is
missing they all are missing
Parameters
----------
ax : `Axes`
an Axes instance to plot to
opens : sequence
sequence of opening values
highs : sequence
sequence of high values
lows : sequence
sequence of low values
closes : sequence
sequence of closing values
width : int
size of open and close ticks in points
colorup : color
the color of the lines where close >= open
colordown : color
the color of the lines where close < open
alpha : float
bar transparency
Returns
-------
ret : tuple
(lineCollection, barCollection)
File: /usr/local/lib/python3.10/dist-packages/mpl_finance.py
Type: function
r_30 = ss_pdr.iloc[-30:]
fig, ax = plt.subplots()
candlestick2_ohlc(ax, r_30['Open'],
r_30['High'],
r_30['Low'],
r_30['Close'],
width=.8,
colorup='r',
colordown='b',
alpha=0.75)
# ========여기가 다름========
ax.plot(r_30.index.astype('str'),
r_30['Close'],
label='Close',
lw=0.5)
ax.legend()
plt.xticks(rotation=45)
plt.show()
xticks을 아래처럼 줄 수도 있음
# 범주 표시
r_30 = ss_pdr.iloc[-30:]
fig, ax = plt.subplots()
candlestick2_ohlc(ax, r_30['Open'],
r_30['High'],
r_30['Low'],
r_30['Close'],
width=.8,
colorup='r',
colordown='b',
alpha=0.75)
# ========여기가 다름========
ax.set_xticklabels(r_30.index)
plt.xticks(rotation=45)
plt.show()
조건에 해당하는 항목은 1, 그 외 0을 가지는 volume issue 컬럼 생성
# 항목 확인
ss_pdr_new = ss_pdr.loc['2022.11.01':]
mean_vol = ss_pdr_new['Volume'].mean()
ss_pdr_new['Volume_issue'] = ss_pdr_new['Volume'] >= mean_vol * 2
ss_pdr_new['Volume_issue'].replace({True:1, False:0}, inplace=True)
ss_pdr_new['Volume_issue'].value_counts()
#
# 결과
0 178
1 3
Name: Volume_issue, dtype: int64
volume issue가 있었던날의 바 차트를 빨간색으로 표시
# X: index, y: volume, color: red
fig, ax = plt.subplots(figsize=(15, 5))
ax = sns.barplot(data=ss_pdr_new, x=ss_pdr_new.index, y='Volume', hue='Volume_issue', palette={0:'black', 1:'red'})
plt.xticks(rotation=20)
plt.locator_params(axis='x', nbins=10)
plt.show()
(np.where(조건, 참일때 값, 거짓일때 값))
fig, ax = plt.subplots(figsize=(15, 5))
# color array를 만드는 방법
volume_colors = np.where(ss_pdr_new['Volume_issue'] == 1, 'red', 'k')
ax = sns.barplot(data=ss_pdr_new, x=ss_pdr_new.index, y='Volume', palette=volume_colors)
plt.xticks(rotation=20)
plt.locator_params(axis='x', nbins=10)
plt.show()
fig, ax = plt.subplots(figsize=(15, 5))
ax.bar(ss_pdr_new.index, ss_pdr_new['Volume'], color='k')
ax.bar(ss_pdr_new[ss_pdr_new['Volume_issue']==1].index, ss_pdr_new[ss_pdr_new['Volume_issue']==1]['Volume'], color='red')
left, right = plt.xlim()
ax.hlines(ss_pdr_new['Volume'].mean() * 2, left, right, color='black', ls='--')
plt.ylabel('Volume')
plt.xlabel('Date')
indices_to_label = ss_pdr_new[ss_pdr_new['Volume_issue']==1].index
for index in indices_to_label:
x_pos = index
y_pos = ss_pdr_new[ss_pdr_new.index == x_pos]['Volume'].values
plt.text(x_pos, y_pos, str(x_pos), ha='center', va='bottom')
fig.show()