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

(파이썬) for문 활용 (5) eval 모듈 활용 (패턴 업데이트 방법)

봄이오네 2022. 10. 25. 08:06
반응형
목 차
1. 들어가며
2. 필요성
3. 사전 준비 (리스트 요소의 내용 바꾸기)
  1) 리스형 데이터의 요소를 가져오는 방법
  2) 리스트 요소를 바꾸는 방법 (업데이트)
4. 활용 사례
  1) aaa0 = eval("aaa" + str(0))는 동일하다.
  2) for문과 eval 모듈의 사례
5. 전체코드 및 결과
6. 마치며

1. 들어가며

지난 글에서는 eval 모듈을 활용하여 문자형을 리스트형으로 전환해 보았다.

원래 eval 모듈은 2번의 글로 마무리 하려고 했으나,

리스트형으로 변환 후 활용에 대해 설명하지 않아, 추가 글을 쓰게 되었다.

 

for문과 eval모듈을 활용하면, 문자형에 순차적으로 붙일 수 있다.

(예시) pattern0, pattern1, pattern2, ...... , pattern10

 

이번 글에서는 문자형을 리스트형으로 전환 후의 활용 사례를 알아보자.

  • 키움서버에서 가져오는 3종목의 패턴갱신하는 방법은?
 

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

목 차 1. 들어가며 2. 사전준비 3. eval 모듈 설명 1) eval 모듈 기능 2) eval 예시 ① 숫자 1과 문자형1을 비교 ② 리스트 zzz를 for문/if문을 통해 출력한 결과 ③ eval 모듈의 사용례 4. 활용처 1) 코드 사례

springcoming.tistory.com


2. 필요성

리스트형으로 전환 후를 설명하는 이유는

필자가 생각하고 있는 프로그램은

1분마다 1분봉을 키움서버에서 패턴을 받아와서,

수익나는 패턴과 비교하여 매수/매도를 하기 위해서이다.

 

즉, 위 코드가 실행되면 1분마다 "종목 패턴"을 가져온 후

그 패턴을 "사용자가 미리 설정한 패턴"과 비교하여,

"1분봉 패턴 = 미리 설정 패턴"이 일치하면 매수할 때 쓰인다.

 

여기서는 1분봉 패턴을 갱신하는 방법을 알아볼 것이다.


3. 사전 준비 (리스트 요소의 내용 바꾸기)

1) 리스형 데이터의 요소를 가져오는 방법

리스트형에서 요소를 뽑아올 때는 "리스트[0]"으로 입력하면 문자형 a가 출력된다.

aaa0 = ["a"]
print(aaa0[0])

# (expected result)
# a

 

2) 리스트 요소를 바꾸는 방법 (업데이트)

아래 코드의 5번줄에서 확인하였듯이,

aaa0리스트의 1번째 요소를 바꾸는 방법은 aaa0[0] = pattern 이다.

리스트의 몇번째 자리를 무엇(pattern)으로 바꿀지에 대한 내용이다.

 

아래 코드의 aaa0의 1번째 요소는 z를 바뀌었다.

aaa0 = ["a"]   → aaa0 = ["z"]

aaa0 = ["a"]
print(aaa0[0])

pattern = "z"
aaa0[0] = pattern
print(aaa0[0])


# (expected result)
# a
# z

4. 활용 사례

1) aaa0 = eval("aaa" + str(0))는 동일하다.

이 글에서는 eval모듈을 통해 "종목의 1분봉 패턴 = 사용자 설정한 패턴"을 비교하려고 한다.

  • 결론부터 이야기 하면, 리스트 aaa0는 eval("aaa" + str(0))과 같다는 것이다.

eval("aaa" + str(0))이 필요한 이유는 for문을 돌리기 위해서이다.

0 자리에 변수 j를 넣어주면, aaa 뒤에 계속 반복해서 숫자가 붙는다.

aaa0 = ["a"]

if aaa0 == eval("aaa" + str(0)):
    print("동일합니다.")
    
# (expected result)
# 동일합니다.

 

2) for문과 eval 모듈의 사례

그림. aaa0~aaa2 리스트의 요소를 업데이트 하는 화면

1줄~3줄 : aaa0의 요소는 a, aaa1의 요소는 b, aaa2의 요소는 3(숫자)이다.

5줄~7줄 : 키움서버에서 받아오는 3종목의 패턴이 patter0, patter1, patter2 이라고 가정하자.

                   →  위 3개의 리스트 요소를 각각 d, e, 7로 변경해보자

 

9줄 : for문을 통해 3번 돌릴 예정이다.

         range(0,3) → 0, 1, 2 순차적으로 for문에 들어감

10줄 : 이글의 핵심이다.

           위 3-2(사전준비)에서도 확인하였듯이, 리스트형의 요소(내용)를 바꾸는 방법

           aaa0[0] → 리스트 aaa0의 첫요소를,

           pattern0의 내용으로 바꾸어라는 내용이다.

             → a = b : b를 a에 넣어라는 개념을 참고하자.

 

13줄~15줄 : 각 리스트의 변경된 내용 출력

17줄 : aaa2[0]의 요소가 숫자 7로 변경되었고,

19줄 : 숫자 7 x 4는 28이다.

          → 리스트 내 정수도 바뀌는 것을 보여준다.


5. 전체코드 및 결과

aaa0 = ["a"]    # → d
aaa1 = ["b"]    # → e
aaa2 = [3]      # → 7

pattern0 = "d"
pattern1 = "e"
pattern2 = 7

for j in range(0,3):
    eval("aaa" + str(j))[0] = eval("pattern" + str(j))
        # print(eval("aaa" + str(j))[0])

print(f"aaa0의 요소는 당초 a에서 {aaa0[0]}로 바뀌었다.")
print(f"aaa1의 요소는 당초 b에서 {aaa1[0]}로 바뀌었다.")
print(f"aaa2의 요소는 당초 3에서 {aaa2[0]}로 바뀌었다." + "\n")

h = aaa2[0] * 4
print(h)
print(f"h의 결과는 {h}이다.")


# (epected result)
# aaa0의 요소는 당초 a에서 d로 바뀌었다.
# aaa1의 요소는 당초 b에서 e로 바뀌었다.
# aaa2의 요소는 당초 3에서 7로 바뀌었다.

# 28
# h의 결과는 28이다.

6. 마치며

총 3편의 eval 모듈에 대한 설명을 했다.

eval 모듈에 대한 설명은 이 글에서 마무리 지으려고 한다.

 

리스트 뒤의 숫자를 순차적으로 증가시키고 싶었는데,

eval 모듈을 알게 되어, 코드 분량을 상당히 줄일 수 있었다.

 

위의 5번(전체코드)가 쓰이는 곳은,

향후 설명하겠지만, 키움에서 받아오는 종목의 1분봉 패턴을 꾸준히 업데이트 한다.

그러고 나서, 1분봉 패턴 = 사용자 설정 1분봉 패턴에 해당하면,

매수 후 수익 타점이 오면 수익을 내고,

손실 타점에 도달하면 손절하려는데 쓰일 예정이다.

반응형