본문 바로가기

Python

주식 알고리즘 만들기 - 4. 함수와 모듈 (함수)

반응형

 

2022.10.09 - [Python] - 주식 알고리즘 만들기 - 3. 제어문 (연습문제)

출처 : 2) 반환값이 있는 함수 - 파이썬으로 배우는 알고리즘 트레이딩 (개정판-2쇄) (wikidocs.net)

 

주식 알고리즘 만들기 - 3. 제어문 (연습문제)

2022.10.08 - [Python] - 주식 알고리즘 만들기 - 3. 제어문 (while 문, 중첩루프) 출처 1) 연습문제 - 파이썬으로 배우는 알고리즘 트레이딩 (개정판-2쇄) (wikidocs.net) 1) 연습문제 여러분도 각자 풀어보세요~

jiain.tistory.com

연습문제 4.9 리뷰하나 하고 넘어가겠습니다.

 

문제 4-9

중첩 루프를 이용해 신문 배달을 하는 프로그램을 작성하세요. 단, 아래에서 arrears 리스트는 신문 구독료가 미납된 세대에 대한 정보를 포함하고 있는데, 해당 세대에는 신문을 배달하지 않아야 합니다.

 

>>> apart = [[101, 102, 103, 104],[201, 202, 203, 204],[301, 302, 303, 304], [401, 402, 403, 404]]
>>> arrears = [101, 203, 301, 404]

일단 구조에 대해서 설명하겠습니다. for i in list 하면 어떻게 된다고 했죠?

관심종목 =[ '삼성전자', '카카오' , 'NAVER']

for i in 관심종목 :

print(i) 

삼성전자

카카오

NAVER

 

for문을 사용하면 , i 변수에 각각 리스트 데이터 삼성전자 카카오 NAVER가 찍힐 겁니다. 마찬가지로 리스트 안에 리스트가 있어도 똑같을거 같다는 생각이 들게 됩니다 한번 해볼까요

관심종목 = [['삼성전자','삼성SDI' , '삼성중공업' ] , ['카카오' , '카카오페이', '카카오뱅크'] , [ '현대차', '현대모비스', '현대중공업']]

이렇게 묶었다고 가정합시다.

 

for i in 관심종목:   하면 i 에 ['삼성전자,'삼성SDI' , '삼성중공업' ] 이라는 리스트가 저장됩니다. 한번더 for문을 사용하면 어떻게 될까요?

 for j in i :  print (j)

i는 리스트 안의 리스트를 가져왔고 j는 리스트 안의 리스트 안의 데이터를 가져오는 원리입니다. 이해가 되시나요?

그럼 출력된 값은 다음과 같을 것입니다.

 

삼성전자

삼성SDI

삼성중공업

카카오

카카오페이

카카오뱅크

현대차

현대모비스

현대중공업

 

 

#함수

 

파이썬에는 내장함수 print() , len() 함수 등 다양한 함수가 있습니다. 함수란 무엇일까요? 입력값을 넣고 출력값을 출력할 수 있는 도구라고 설명할 수있습니다. 왜 함수를 쓸까요? 프로그래밍을 간결하게 해줄 수 있는 장점과  오류도 쉽게 파악할 수 있다는 장점을 가지고 있습니다. 

우리는 이쯤에서 드는 생각이 있을겁니다. 함수끼리를 하나로 모아서 하나의 함수로 표현할 수 없을까라는 생각이 들겁니다. 그러면 엄청 간편할 텐데 말이죠

 

 

1) 현재가 = 3000

상한가 = 현재가 + 현재가 *0.3

 print(상한가)

 

2) 상한가(3000)

 

어떤게 편리해보이시나요? 눈에 봐도 2)번이 관리하기도 편할거 같은 생각들지 않나요?  이제 어떻게하면 나도 함수를 만들 수 있을까라는 궁금증이 들기 시작합니다. 

자 이제부터 함수를 만들기위해서는 무엇이 필요한지 어떻게 만들어야 하는지에 대해서 알아 보도록 하겠습니다.

 

1) 함수의 정의

 

상한가를 출력하는 함수도 괜찮을지 모르지만 삼성전자를 여러번 출력하는 함수를 만들어보는 연습을 해보도록 하겠습니다.

 

참고로 프로그램을 작성할 때 무조건 손이 가는 대로 프로그램을 작성하기보다는 잠시 컴퓨터에서 떨어져서 구현할 내용에 대해 생각하고 어떻게 구현할지를 설계한 후 프로그래밍하는 습관을 기르는 것이 좋습니다.

함수의 입력: 출력 횟수
함수의 출력: '삼성전자'이라는 문자열(횟수만큼)
함수의 동작: 입력 횟수만큼 '삼성전자' 문자열을 출력

자 설계가 끝났으면,  파이썬에서는 함수를 만들 때 def라는 키워드를 사용합니다. 참고로 def는 definition이라는 영어 단어의 줄임말입니다. 이제 함수는 만드는 방법을 알았으니 바로 만들어 보도록 하겠습니다. 파이썬에서 함수를 정의할 때도 분기문, 반복문처럼 키워드가 있는 줄의 끝에 콜론(:)이 있고, 실행될 코드 블록은 들여쓰기돼 있어야 합니다.

 

def 삼성전자_ntime(n) :
 for i in range(n):
  print('삼성전자')

삼성전자_ntime(3)

삼성전자

삼성전자

삼성전자

 

 

우리는 이제 삼성전자를 여러번 출력하는 나만의 함수를 만들어 봤습니다. 박수를 치실까요?

 

 

2) 반환값이 있는 함수

 

 

이번에는 어떤 주식 종목의 전날 종가를 입력받아 상한가(30%)를 계산하고 그 값을 반환(return)하는 함수를 작성해 보겠습니다. 이전 삼선전자_ntime() 은 함수를 호출했을 때 함수의 결과가 화면에 ‘출력’됐지 어떤 결괏값이 ‘반환’된 것은 아니었습니다. 

 

 

 

 

def cal_upper(price):
        increment = price * 0.3
        upper_price = price + increment

cal_upper(10000)

 

 

 

우리는 앞서 배운 def 명령어로 상한가 함수인 cal_upper() 함수를 만들었습니다. 아무런 문제가 없어보입니다. 그런데 결과 값이 나올까요?

 

 

 

2-1) 함수호출 과정 이해하기

 

함수는 3단계 호출 과정을 거칩니다. 그런데 말이죠. 내부에 저장한 데이터 값은 실행단계를 거처 함수 종료 단계에서 저장한 메모리를 없애버리는 과정이 발생합니다. 즉, 안에 실행이 끝나면 지워버리는 겁니다. 금붕어 기억력처럼말입니다.

우리가 상대방의 이름 전화번호라는 정보를 습득합니다. 하지만 인간의 뇌는 휘발성을 가지고 있죠. 어딘가 기록을 하지 않으면 정보가 사라집니다. 

함수도 마찬가지 입니다. 외부에 저장하지 않으면 잊어버리는 과정을 거치게 되어있어요. 

그래서 우리는 return 이라는 명령어를 통해서 결과값을 외부로 저장해야하는 것입니다.

이해가 되시나요?

 

def cal_upper(price):
        increment = price * 0.3
        upper_price = price + increment
        return upper_price

cal_upper(10000)
13000.0

여러분이 매수한 종목이 항상 상한가만 되고 하한가가 되는 일이 없으면 좋겠습니다. 그러나 주식을 하다 보면 가끔 매수한 종목이 하한가로 갈 때가 있습니다. 전날 종가에서 하한가가 됐을 때 얼마가 되는지를 알아보기 위해 이번에는 하한가를 계산하는 cal_lower라는 함수를 작성해 보겠습니다.

def cal_lower(price):
        decrement = price * 0.3
        lower_price = price - decrement
        return lower_price

cal_lower(1000)
700.0
cal_lower(5000)
3500.0
2-2) 2개의 값 반환하기

우리는 두개의 상한가 , 하한가를 반환하는 함수를 만들고 싶어지는 욕구가 생길겁니다. 하지만 두 값을 반환할 수 있을까요? C/C++ 같은 프로그래밍 언어를 배운 분들은 함수의 반환값이 오직 하나라고 생각할 수 있습니다. 그럼 파이썬은 어떨까요? 파이썬도 기본적으로는 함수의 반환값으로 하나의 객체만 반환할 수 있습니다. 다만 튜플이라는 자료구조에 넣은 후 반환함으로써 동시에 여러 개의 값을 반환할 수 있는 마법같은 눈속임이 있습니다.

 

먼저 상한가, 하한가를 계산하는 함수를 앞서 배운걸 이용해서 만들어 보겠습니다.

 

>>>def upper_lower_multical(price) : 
 rate = price * 0.3
 upper = price + rate
 lower = price - rate
 return (upper,lower)

>>>upper_lower_multical(10000)
(13000.0, 7000.0)

>>>(상한가, 하한가) = upper_lower_multical(10000)
>>>상한가
13000.0

return 명령어로 ( 13000, 7000) 이 저장되게 되고, 이 값을 (상한가, 하한가)로 각각 저장해서 하나의 변수로 사용할 수 있습니다.

 

다음시간엔 모듈을 배우도록 하겠습니다.

728x90