1. 국내주식/1-1. 국내주식 연구일지

(파이썬) for문 활용 (4) eval 모듈을 활용하여 문자형(str)을 list형으로 타입 전환하기

봄이오네 2022. 10. 22. 08:12
반응형
목 차
1. 들어가며
2. 사전준비
3. eval 모듈 설명
1) eval 모듈 기능
2) eval 예시
① 숫자 1과 문자형1을 비교
② 리스트 zzz를 for문/if문을 통해 출력한 결과
③ eval 모듈의 사용례
4. 활용처
1) 코드 사례
2) 코드 설명
5. 마치며

 

1. 들어가며

지난 글에서는 for문을 활용하여 특정 단어 뒤에 숫자를 붙여서 출력하는 방법을 알아보았다.
(예시) pattern0, pattern1, pattern2, ...... , pattern10

이번 글에서는 for문으로 받은 단어를 리스트 타입(type)로 바꾸는 방법을 알아보자.
임의의 2종목의 패턴을 활용하여 for문을 돌릴 때
특정 종목의 패턴이 적용되면, 수익과 손실 타점 설정하는 방법이 있다.
→ 쉽게 이야기하면, 특정 패턴을 키움서버에서 받으면,
패턴과 관련된 수익/손실 타점이 자동으로 설정되는 방법을 알아보자는 것이다.

  • 1차적으로 종목을 선별(for문 + if문)하고,
  • 특정패턴에 해당하면, 수익/손실을 설정(for문 + if문)을 설정하는 방법은 무엇일까?

※ 장이 종료(18:00)된 관계로, 키움서버에서 데이터 받아오는 것은 한계가 있으므로,
input 함수를 이용하여, 데이터 입력 후 for 문이 어떻게 반응하는지 확인할 것이다.


2. 사전준비

아래와 같이 가정하여 글을 쓰려고 한다.

  • 종목코드는 임의로 2개 설정하였다. 삼성전자(005930), 셀트리온(068270)
  • 패턴 또한 임의로 정하였다. 종목별로 3가지 패턴씩 만들었음
  • input 함수는 키움에서 종목코드와 패턴을 받아온다고 가정한다.

3. eval 설명

1) eval 모듈 기능

파이썬에서 제공하는 내장 모듈 중 eval이 있다.
문자형을 리스트 태형(type)으로 바꾸어 준다.

eval은 리스트형에서 값을 추출한 것에만 익숙해졌던 필자에게,
문자형을 리스트 태형(type)으로 바꿀 수 있다는 인식 전환을 시켜주었다.

2) eval 예시

  • 태형(type)이 중요한 이유는 같은 숫자라도 문자형/인트형이냐에 따라 파이썬에서 달리 인식한다.

① 숫자 1과 문자형1을 비교해 보자.

  • 파이썬에서는 인트형1 및 문자형1은 분명히 달리 인식한다.
def check():
    if int("1") == str("1"):
        print("1과 str('1')은 태형이 같다.")
    else:
        print("1과 str('1')은 태형이 다르다.")
check()

(expected result)
1과 str('1')은 태형이 다르다.


② 리스트 zzz를 for문/if문을 통해 출력한 결과

zzz = ["a", "b"]

for i in zzz:
    if i == zzz[0]:
        print("i가 a와 같을 때 출력 결과")
    elif i == zzz[1]:
        print("i가 b와 같을 때 출력 결과")
        
(resulted result)
i가 a와 같을 때 출력 결과
i가 b와 같을 때 출력 결과


③ eval 모듈의 사용례

  • zzz1의 태형은 리스트형이다
  • zzz2의 태형은 str이다
  • zzz3의 태형은 리스트형이다 → 즉, eval 모듈은 문자형을 리스트형으로 바꾸어준다.
zzz1 = ["a", "b"]
zzz2 = str(["a", "b"])
zzz3 = eval(zzz2)

print(type(zzz1))
print(type(zzz2))
print(type(zzz3))


(expected result)

<class 'list'>
<class 'str'>
<class 'list'>

그림1. eval 모듈은 문자형을 리스트형으로 태형 전환시켜준다.


4. 활용처

1) 코드 사례

아래 <코드>를 실행하면 "실행창"에 종목코드와 패턴을 입력하라는 메시지가 뜬다.
종목코드에는 005930, 패턴은 1000100을 입력해 보자

stock_codes = ["005930", "068270"]   # 삼성전자(005930), 셀트리온(068270)

pattern0 = ["0-1000", "1000100", "0-100-100"]
profit0 = [7000,6000,5000]
loss0 = [3000,2000,1000]

pattern1 = ["10000", "000", "100-200-100"]
profit1 = [700,600,500]
loss1 = [300,200,100]

stock_enter = input("종목코드를 입력하세요 : ")
receive_pattern = input("패턴을 입력하세요 : ")

def pl_check():
    for i in range(len(stock_codes)):
        if stock_codes[i]:
            for check_pattern, check_profit, check_loss in zip(eval("pattern"+str(i)), eval("profit"+str(i)),eval("loss"+str(i))):
                if receive_pattern == check_pattern:
                    print(check_pattern)
                    print(check_profit)
                    print(check_loss)

pl_check()


(expected result)

종목코드를 입력하세요 : 005930
패턴을 입력하세요 : 1000100
1000100
6000
2000

 

그림2. 종목코드와/패턴을 입력하면 실행창에 패턴/수익/손실의 내용이 출력된다.

2) 코드 설명

2줄 : 종목코드 2개를 설정한다.
4줄~6줄 : 삼성전자(005930) 관련 패턴, 수익, 손실을 임의로 기재하였다.
8줄~10줄 : 셀트리온(068270) 관련 패턴, 수익, 손실을 임의로 기재하였다.

12줄~13줄 : 장 종료로 종목/패턴을 받아올 수 없으므로,
임의로 종목코드와 패턴을 입력한다.

15줄 : 함수 선언
16줄 : 종목코드를 len함수를 붙여, 수치화 함 → len(stock_codes)를 하면 2종목의 정수 2가 반환된다.
* range(1, 10)이면, 1~9까지 9개 숫자를 의미한다.
→ 16줄에는 결국 0과 1을 얻는다.
17줄 : 2번째 줄에서 리스트로 정의한 종목코드가 0이면 삼성전자, 1이면 셀트리온이다.
* 즉, stock_codes[0]이면 삼성전자, stock_codes[1]이면 셀트리온

18줄 : 이 글의 핵심이다.
① 16줄의 i를 상속받는다.
앞의 for문 3번째 글에서도 언급하였듯이 "pattern" + str(i)를 선언하면,
pattern0이 출력된다.
②  문제는 이렇게 출력된 18줄의 pattern0은 문자형(str)이다.
③ 이것은 4번째 줄의 pattern0 (리스트형)과는 다르다.
→ 태형이 다르므로, 파이썬에서는 4줄(리스트형)과 18줄(문자형)을 달리 인식한다.

④ 이것을 해결해 주는 것이 eval모듈이다. (문자형을 리스트형으로 태형 전환시켜준다)
⑤ zip은 앞 글에서 설명하였듯이, 각각 매칭을 시켜서 추출해 달라는 의미이다.
ex) pattern0 내에서 두번째 숫자가 결정되면, profit0/ loss0 도 두번째 숫자가 결정된다.
→ 즉 for문의 zip는 pattern0[1]이면, profit0[1] / loss0[1]

 

(파이썬) for문 활용 (2) - zip()함수

1. 들어가며 앞에서는 for문의 기본 구조를 설명하였다. 이번에는 for문과 zip함수를 활용하여, 향후 사용할 종목코드, 수익/손실을 비교할 수 있는 코드를 구현한다. * for문 기본구조 설명 : https://s

springcoming.tistory.com

19줄 : 입력받은 데이터와 4줄 혹은 8줄의 패턴과 같으면,20줄~22줄 : 패턴, 수익, 손실을 출력하라.


5. 마치며

이 글에서는 eval 모듈을 통해 문자형을 리스트형으로 변환하는 내용을 알아보았다.
언뜻 어려워 보이고, 필요성이 적어 보일 수도 있지만,

시스템을 공부하고 있는 입장에서는
eval 모듈로 불필요한 코드를 많이 삭제했다.
종목코드 구분은 for문으로 구분할 수 있었는데,

패턴명은 그 뒤에 숫자를 붙였기 때문에,
for문을 통해 단어에 숫자를 부여하는 것도 어려웠고,
"단어 + 숫자"가 리스트 항목과 일치시키는 것도 어려웠다.

그래도, eval을 알게 되어서,
for 문을 돌릴 때 더 간략하게 코드를 작성할 수 있어서 좋았다.

반응형