2022.10.09 - [Python] - 주식 알고리즘 만들기 - 4. 함수와 모듈 (함수)
주식 알고리즘 만들기 - 4. 함수와 모듈 (함수)
2022.10.09 - [Python] - 주식 알고리즘 만들기 - 3. 제어문 (연습문제) 출처 : 2) 반환값이 있는 함수 - 파이썬으로 배우는 알고리즘 트레이딩 (개정판-2쇄) (wikidocs.net) 주식 알고리즘 만들기 - 3. 제어문 (.
jiain.tistory.com
#모듈
What is a Module?
Consider a module to be the same as a code library.
A file containing a set of functions you want to include in your application.
함수는 내부에서 저장한 기능입니다. 그러면 외부에서도 함수를 불러 올 수 있지 않을까라는 궁금증이 생기기 시작합니다.
그렇습니다. 외부에서 import 파일을 해주면 외부 저장파일을 기반으로 함수를 사용할 수 있습니다. 이것을 모듈이라고 합니다. 더 자세한건 모듈을 만들면서 알아가도록 하겠습니다.
파이썬 IDLE에서 [File] 메뉴를 선택한 후 [New File]을 선택합니다.
코드를 작성하고 나면 그림과 같이 [File] 메뉴에서 [Save] 메뉴를 클릭해 파일로 저장합니다.
파이썬 코드를 파일로 저장할 때 그림와 같이 저장될 파일의 경로를 C:/stockai 디렉터리로 선택한 후 파일명을 stock으로 변경하고 [저장] 버튼을 클릭합니다. 따라서 방금 작성한 코드의 저장 경로는 C:/stockai/stock.py가 됩니다.
하지만 IDLE 실행하면 ModuleNotFoundError: No module named 'stock' 이라고 오류가 발생하는 걸 볼 수 있습니다.
바로 경로 설정을 하지 않았기 때문이죠.
파이썬의 기본 모듈을 불러와서 경로 설정을 해야합니다.
import sys
sys.path.append( 'C:\stockai')
위 코드를 작성하면 이제 import stock 실행되는 것을 확인 할 수 있습니다. 이제 우리가 만든 함수를 실행시켜봅시다.
cal_upper(1000) 함수이름 쓰고 값을 넣었는데, 왜 오류가 발생했을까요?
바로 어떤 모듈이냐라고 지정을 안해줬기 때문입니다. 앞에 저장한 모듈이름 stock을 넣으면 오류가 해결 될 수 있습니다.
아마도 어떤 모듈을 썼는지 쉽게 찾기 위해서 만든 구문이지 않을까 생각이 듭니다.
실행이 되는걸 확인 할 수 있습니다. 조금 낯설 수 있습니다. 우리는 파이썬의 내장함수만을 즐겨썼었지 외부함수를 불러와서 쓰는 건 처음이니까요.
1) 모듈 테스트
모듈의 동작을 확인하려면 일일이 입력을 다시 해야하는 번거로움을 느꼈을 겁니다. 그래서 우리는 테스트를 더욱 더 쉬운 방법으로 할 수 없을까라는 궁금증이 생기기 시작하죠. 이 궁금증을 해소할 방법이 바로 print()함수 입니다.
모듈로 사용할 코드에 우리는 print()를 넣어서 테스트를 더 쉽게 만들어 보도록 합시다.
다음과 같이 stock.py 파일에 print(name)도 추가합니다.
def cal_upper(price):
increment = price * 0.3
upper_price = price + increment
return upper_price
def cal_lower(price):
decrement = price * 0.3
lower_price = price - decrement
return lower_price
author = "pystock"
print(cal_upper(10000))
print(cal_lower(10000))
print(__name__)
수정 된 stock.py 파일을 실행하려면 [Run] -> [Run Module] 메뉴를 차례로 선택합니다.
파이썬 IDLE에 다음과 같이 stock.py 파일의 실행 결과가 출력됩니다. 10,000원에 대한 상한가와 하한가가 모두 정상적으로 출력됨을 확인할 수 있습니다. 그리고 print(__name__)의 결과로 __main__이라는 문자열이 화면에 출력됨을 확인할 수 있습니다.
업데이트된 stock 모듈을 다시 임포트해 보겠습니다. stock 모듈을 임포트하면 앞서 추가한 print 구문의 결괏값이 출력됨을 확인할 수 있습니다. 모듈을 테스트하는 입장에서는 모듈 내에 테스트 코드를 넣는 방식이 유용하지만 모듈을 사용하는 입장에서는 임포트할 때 모듈을 테스트하는 코드가 함께 실행되는 것은 불필요한 기능입니다.
[Run] -> [Phyton Shell] 을 실행해서 임포트를 해보면 __name__이 stock으로 되어 있는 신기한 현상을 발견할 수 있습니다. 그러면 우리는 이제 테스트 할때만 __main__으로 나오게 하면 되겠다는 생각을 할 수 있게 됩니다.
사실 파이썬에서 __name__이라는 변수는 파이썬 자체에서 사용하는 변수로서 특정 파이썬 파일이 직접 실행된 것인지 또는 다른 파이썬 파일에서 임포트된 것인지를 확인하는 용도로 사용됩니다. 특정 파이썬 파일이 독립적으로 실행됐다면 __name__이라는 변수는 __main__이라는 문자열을 바인딩하며 다른 파일에 임포트된 경우에는 자신의 파일명을 바인딩합니다.
이제 아래와 같은 코드를 추가해서 작성하면,
if __name__ == "__main__":
print(cal_upper(10000))
print(cal_lower(10000))
print(__name__)
이제는 직접실행 될 때만 print() 가 출력되는 코드를 완성하게 됬습니다. 자 이제 확인을 해볼까요.
import로 썼을 때는 보이지 않게 됩니다. 마술같지않나요? stock.py 파일에 여전히 모듈을 테스트하는 코드가 존재하지만 해당 코드가 실행되지 않음을 확인할 수 있습니다.
2) 시간 모듈 다루기
성공한 사람이 시간을 잘다루듯이 알고리즘 트레이딩을 잘하는 개발자가 되려면 파이썬에서 시간을 잘 다룰 수 있어야 합니다. 유식한 말로 주식 시장의 데이터를 시계열 데이터라고 하는데 여기서 시계열이란 ‘일정 시간 간격으로 배치된 데이터의 수열’을 말합니다. 그렇다면 파이썬에서 시간과 날짜를 다루려면 어떻게 해야 할까요?
바로 파이썬에서 시간과 날짜를 다루는 time과 datetime 이라는 기본모듈을 활용하는 법입니다.
import time | time() |
ctime() |
먼저 time 함수와 ctime 함수에 대해서 분석을 해봅시다.
위 코드를 보면 time.time()의 결과가 우리가 알기 어려운 실수 형태로 반환됐음을 확인할 수 있습니다. 우리가 좀 더 쉽게 읽을 수 있는 시간을 구하려면 ctime 함수를 사용하면 됩니다. ctime 함수의 결과를 확인하면 ‘2022년 10월 9일 13시 34분 5초’임을 확인할 수 있습니다. 요일은 일요일입니다. 한국시간으로 22시 34분인데 13시인거 보면 UTC 기준 시간이라는 걸 알 수 있습니다.
참고) 여기서 알고 가면 좋은 함수 인자는 _ 입니다. 파이썬 IDLE에서 _는 가장 최근의 반환값을 바인딩하고 있는 변수입니다.
앞에 값을 확인하고 싶으면 type(_) 을 입력하면 되고 , 이 값은 type(time.ctime())과 동일합니다.
time.ctime의 반환값에서 연도(year)만 구하려면 어떻게 해야 할까요?
바로 split이라는 메서드를 사용해 공백을 기준으로 문자열을 분리해서 마지막에 존재하는 원소를 화면에 출력하면 연도가 화면에 출력됩니다.
>>> cur_time = time.ctime()
>>> print(cur_time.split(' ')[-1])
2015
>>>
이번에는 time 모듈의 sleep 함수를 사용해보겠습니다. sleep 말그대로 시간을 잠재우는 겁니다. 해당하는 초(sec) 동안 코드의 실행을 멈추는 역할을 합니다. 예를 들어, 다음 코드는 0부터 9까지의 숫자를 출력하는데, 1초 간격으로 숫자를 출력하는 코드입니다. 코드를 실행하면 파이썬 IDLE에서 숫자가 1초 간격으로 출력되는 것을 확인할 수 있습니다.
>>> for i in range(10):
print(i)
time.sleep(1)
다음은 모듈의 위치를 알아내는 방법이 없을까라는 궁금증을 해결해줍니다. time 모듈과 random 모듈을 임포트한 후 해당 모듈의 위치를 확인하는 방법입니다. time 모듈은 내장 모듈이기 때문에 해당 모듈의 위치가 따로 출력되지는 않지만 random 모듈은 해당 모듈이 위치하는 경로가 출력되는 것을 볼 수 있습니다.
>>> import time
>>> time
<module 'time' (built-in)>
>>> import random
>>> random
<module 'random' from 'C:\\Anaconda3\\lib\\random.py'>
>>>
임포트된 모듈에 대해 모듈명을 사용해 dir 내장 함수를 호출하면 해당 모듈의 구성 요소를 확인할 수 있습니다.
>>> import time
>>> dir(time)
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname']
>>>
더 자세한 내용을 보고싶으면 3) OS 모듈 - 파이썬으로 배우는 알고리즘 트레이딩 (개정판-2쇄) (wikidocs.net)
에서 공부하시면 되겠습니다.
3) os 모듈
os 모듈에 대해서 깊게 공부하지 않겠습니다. 이 중에서 필요한 기능만 한 번 실행시켜보도록 하겠습니다.
import os | os.getcwd() | 현재 경로 |
os.listdir() | 현재 경로 파일 목록 리스트 |
os.listdir() 함수 활용 코드를 조금 알아보도록 합시다.
>>> files = os.listdir('c:/Anaconda3')
>>> len(files)
28
>>> type(files)
<class ‘list’>
>>>
len()함수를 통해서 경로 파일 갯수를 구할 수 있고,
>>> for x in os.listdir('c:/Anaconda3'):
if x.endswith('exe'):
print(x)
python.exe
pythonw.exe
Uninstall-Anaconda.exe
>>>
endswith('exe')는 파일 목록 중 문자열이 'exe'로 끝나는 경우를 출력하는 것을 확인하는 하는 함수 입니다.
이처럼 exe 파일만 찾아서 출력할 수 있는 활용성이 있습니다.
'Python' 카테고리의 다른 글
주식 알고리즘 만들기 - 5.2) 클래스 (__init__, self) (0) | 2022.10.11 |
---|---|
주식 알고리즘 만들기 - 5.1) 클래스 (0) | 2022.10.10 |
주식 알고리즘 만들기 - 4. 함수와 모듈 (함수) (0) | 2022.10.09 |
주식 알고리즘 만들기 - 3. 제어문 (연습문제) (0) | 2022.10.09 |
주식 알고리즘 만들기 - 3. 제어문 (while 문, 중첩루프) (0) | 2022.10.08 |