728x90
728x90

볼린저 밴드 Bollinger Bands

- 이동평균선 ( 볼린저 밴드에서는 단순 이동 평균선)을 기준으로 일정한 표준편차 번위 안에 드는 밴드를 설정한 그래프

- 시장의 높고 낮음 및 과매수 또는 과매도 여부를 나타냅니다.

TA-LIB을 이용한  볼린저 밴드 구하기

TA-LIB에서 볼린저 밴드를 구하는 함수 

- talib.BBANDS()

upperband, middleband, lowerband = BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
http://mrjbq7.github.io/ta-lib/func_groups/overlap_studies.html

- talib의 BBANDS() 함수는 볼린저 밴드의 상한선 / 중간선 / 하한선에 대한 값을 반환합니다.

- 간단한 예제를 통해 볼린저 밴드값을 구해보고 차트를 그려보겠습니다.

 

예제

- 사용한 데이터는 종목코드 - 000020 입니다. 

- 최근 기간중 주말과 휴장일을 제외한 100일간의 데이터입니다.

- 간단한 봉 차트를 그려보겠습니다.

- talib의 BBANDS() 함수를 사용해 기간은 20일로 지정하고, 볼린저 밴드 값을 구합니다.

df['BBAND_UPPER'],df['BBAND_MIDDLE'],df['BBAND_LOWER'] = ta.BBANDS(df['close'],20,2)

- 대신증권 HTS 에서 그려진 볼린저 밴드와 비교해 보면 똑같이 그려졌네요.

 

728x90
728x90

파이프 라인 - PipeLine

- 데이터 처리 컴포넌트(Component)들이 연속되어 있는것

 

데이터 수집

- 데이터 다운로드

- 크롤링

- 데이터 저장소 API 사용

 

데이터 구조 확인

- 판다스(Pandas) DataFrame의 메소드들을 활용 ex)head() , info() describe()등

- 그래프를 활용 ex) matplotlib , seaborn 등

 

데이터 훈련 / 테스트 셋 분리 - train test split

- 사이킷런 train_test_split

- 데이터 스누핑 : 기대성능이 나오지 않을 가능성이 있음

- 계층적 샘플링 : 데이터셋 샘플링에서 발생할 수 있는 편향을 계층이라는 그룹핑을 통해 하위 데이터셋을 계층 비율에 맞춰 샘플링

 

 

데이터 이해를 위한 탐색과 시각화

- matplotlib을 활용

- 상관계수 조사 

- 판다스 plot 산점도 행렬을 이용한 히스토그램 확인

- 특성 조합으로 확인

 

데이터 정제

- 특성값이 없는 경우 

- 해당 구역을 제거

- 전체 특성을 삭제

- 어떤 값으로 채움 (0, 평균, 중간값 등)

- 사이킷런 SimpleImputer

- 텍스트와 범주형 특성

- 특성 스케일링 : StandardScaler() , MinMaxScaler()

 

모델 선택과 훈련

- 훈련세트에서 훈련하고 평가 : LinearRegression() 

- 훈련 세트에 대한 모델 RMSE : mean_squared_error()

- 사이킷런의 k-겹 교차 검증 : k-fold cross-validation

- 교차검증을 사용한 평가 : cross_val_score()

 

모델 세부 튜닝

-적은 수의 조합 탐색 그리드 탐색 : GridSearchCV()

-탐색 공간이 클때 RandomizedSearchCV)-

- 앙상블

- 최상의 모델과 오차 분석 : feature_importances_

 

728x90
728x90

계층적 샘플링 - Stratified sampling

- 모집단을 여러개의 층으로 구분하여, 각 층에서 n개씩 랜덤하게 추출하는 방법

- 순수한 무작위 샘플링 방식은 데이터의 크기가 충분히 크지 않은 상황 등 샘플링 편향이 발생할 수 있는 가능성이 생길수 있습니다. 

- 전체 데이터를 계층별 그룹으로 나눈뒤 . 테스트 세트가 전체 데이터의 각 계층의 계수 비율 만큼 샘플링 합니다.

 

 

사이킷 런 계층적 샘플링 - sklearn.model_selection.StratifiedShuffleSplit

- 사이킷 런에서 제공하는 API 참고 자료의 예제를 통해 알아 보겠습니다.(*사이런을 먼저 설치 합니다.)

 

StratifiedShuffleSplit(n_splits=10, *, test_size=None, train_size=None, random_state=None

- 사용할 수 있는 parameter 들입니다.

n_splits int , default = 10
분리할 데이터 셋의 개수를 지정합니다.
test_size float, int, default = None
테스트 셋의 비율을 지정합니다.
train_size float, int, defalt = None
훈련 셋의 비율을 지정합니다.
random_state int or RandomState instance, defalt = None
생성된 훈련 및 데스트 셋 난수를 지정

예제

- 파이썬 numpy를 이용해 ndarray를 생성합니다.

- 사이킷런 StratifiedShuffleSplit 을 사용해 계층적 샘플링을 진행합니다.

>>> import numpy as np
>>> from sklearn.model_selection import StratifiedShuffleSplit

>>> X = np.array([[1,2],[3,4],[1,2],[3,4],[1,2],[3,4]])
>>> y = np.array([0,0,0,1,1,1])

>>> print('X : \n', X)
>>> print('y : \n', y)

X : 
 [[1 2]
 [3 4]
 [1 2]
 [3 4]
 [1 2]
 [3 4]]
y : 
 [0 0 0 1 1 1]

- 5개 계층으로 나누고, 테스트 셋 비율을 0.5 로 지정합니다.

split = StratifiedShuffleSplit(n_splits = 5 , test_size = 0.5, random_state = 0)

StratifiedShuffleSplit Methods 

- 사용할수 있는 함수로는 get_n_splits() 와 split() 함수가 있습니다.

- get_n_splits() 함수는 X , y의 arguments 로 features 데이터 셋와 labels 등 데이터 셋을 대입하면, return 값으로 n_plits 을 반환합니다.

>>> split.get_n_splits(X, y)
5

- split() 함수는 데이터를 훈련 및 테스트 세트로 분할하기 위한 인덱스를 생성해 반환합니다.

>>> for train_index , test_index in split.split(X,y):
		print('train_index : ', train_index, 'test_index : ', test_index)

train_index :  [5 2 3] test_index :  [4 1 0]
train_index :  [5 1 4] test_index :  [0 2 3]
train_index :  [5 0 2] test_index :  [4 3 1]
train_index :  [4 1 0] test_index :  [2 3 5]
train_index :  [0 5 1] test_index :  [3 4 2]

 

Scikit learn API Reference
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedShuffleSplit.html

 

 

 

728x90
728x90

  플라스크 변수 사용  

- 플라스크 서버에서는 html에 변수를 만들어 서버 python에서 값을 넘겨 줄 수 있습니다.

- 변수 사용에는 아래의 코드를 원하는 위치에 추가해 사용합니다.

{{변수명}}

- 변수에 값을 주려면 서버 함수에서 render_template에 변수명에 값을 대입하면 됩니다.

return render_template('hello.html',변수명 = 값)

  예제  

- hello.html 파일을 생성하고, <head>태그 -> <title>태그 안에 변수를 선언합니다.

- <body> 태그 안에 <h1>태그를 추가 하고 그안에 변수를 똑같이 선언해 주겠습니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{title}}</title>
</head>
<body>
    <h1>
        {{title}}
    </h1>
</body>
</html>

- 서버 코드에서 /hello 주소를 라우팅하고 hello() 함수를 선언 return 값으로 render_template('hello.html',title='hello')

를 추가합니다.

 

@app.route("/hello")
def hello():

    return render_template('hello.html',title='hello')

- 이제 /hello로 접속해서 확인해 보겠습니다.

 

- 잘 적용 되었네요!!!!

728x90
728x90

jinja2 템플릿 상속 기능

- jinja의 가장 강력한 기능 중 하나는 상속 기능입니다.

- php에서 include() 와 require() 함수와 비슷한 기능을 제공합니다.

- 웹사이트를 제작하다보면 공통된 코드가 자주 사용될때가 있습니다.

- 페이지를 구성하는 파일들이 많아지면 이러한 코드들을 수정할때 많은 시간이 쓰입니다.

- 이러한 문제를 해결 하기 위해 jinja2 템플릿 엔진에서 제공하는 상속기능을 사용하면 편리합니다.

 

  템플릿 상속  

- 먼저 templetes디렉토리에 부모 템플릿인 animal.html 과 dog.html 파일을 생성하고 html 기본 코드들을 입력하고 title을 각각 animal / dog를 입력합니다.

- <body> 태그안에 <h1>태그를 추가 하고 , animal / dog 텍스트를 각가 추가 해 주겠습니다.

 

  animal.html  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>animal</title>
</head>
<body>
    <h1>animal</h1>
</body>
</html>

  dog.html  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>dog</title>
</head>
<body>
    <h1>dog</h1>
</body>
</html>

- 이제 플라스크 서버에 animal과 dog를 각각 라우팅 해 줍니다.

@app.route("/animal")
def animal():
    return render_template('animal.html')
@app.route("/dog")
def dog():
    return render_template('dog.html')

- 해당 주소로 접속 해 보겠습니다.

- animal.html 을 dog.html 에 상속합니다.

- 상속할때는 아래의 코드를 상속할 위치에 추가해 사용합니다.

{% block 이름 %}

{% endblock %}

- 상속받을 때는 아래의 코드를 사용합니다.

{% extends '상속받을 파일이름'}
{% block 이름 %}
소스코드
...
{% endblock %}

- 이제 animal.html 과 dog.html 코드를 수정해 보겠습니다.

 

animal.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>animal</title>
</head>

<body>
    <h1>animal</h1>
    {% block content %}
    {% endblock %}
</body>

</html>

dog.html

{% extends 'animal.html'%}
{% block content %}
<h2>dog</h2>
{% endblock %}

- 코드량이 줄고 간결해 졌습니다.

- 이제 /dog 에 접속해서 확인해 보겠습니다.

- animal.html 이 상속 되었음을 확인 할 수 있습니다.

728x90
728x90
728x90

+ Recent posts