32/64비트 파이썬 프로세스 통신

필자는 대신증권 API(파이썬)으로 이용하고 있는 사용자 중 하나이다. 실제 파이썬 코드를 이용해 자동으로 매수/매도하는 프로그램을 운영하고 있다. 주식장이 열리는 날이면 매일 HTS 와 파이썬 모듈을 구동시키고 출근한다.

수익률이 크지는 않지만 (계속 보완/테스트 진행 중) 그래도 포기할만큼은 아니고 간간히 매수/매도로 수익이 나면 기분도 좋아지곤 한다.

이제는 2차 버전을 생각하고 있다. 수익률 때문은 꼭 아니지만 계속 새로운 것을 시도하면서 학습하고자 하는 목적도 있다. 바로 강화 학습 기반의 트레이딩 시스템이 다음 목표이다.

32/64비트 파이썬 통신이 필요한 이유

문제는 강화학습(DQN)을 하기 위해서는 텐서플로우(tensorflow)가 필요한데 대신증권 파이썬 모듈하고 돌리려니 문제가 발생했다. 텐서플로우는 64비트 환경에서 돌고 대신 증권은 32비트 환경에서만 구동해야 된다는 것이다. 텐서플로우를 32비트 환경에서 돌리는 것도 문제 해결은 될 수 있으나 32비트 환경에서 텐서플로우를 돌리기 위해서는 소스를 다운받아 컴파일해야 된다. 인터넷을 찾아보면 쉽지 않아 보인다. 한참을 좌절하고 있다가 우연히 IPC(Inter Process Communication)  관련 내용을 활용해보자라는 생각이 들었고 관련 자료를 찾아보기로 했다.

그러나 파이썬 기반 IPC 모듈이 딱히 마음에 드는 것이 없어 내 마음대로 필요한 내용을 구현해보고 사용해보고 있다. IPC도 아닌 fake IPC라고 스스로 명명해놓고 있다.

32/64비트 파이썬 기반 IPC 통신 방법

원리는 간단하다. 64비트 환경의 파이썬 모듈(예. 텐서플로우)에서 32비트 환경의 파이썬 모듈(대신증권 파이썬 모듈)을 호출한다. 그러면 대신증권의 파이썬 모듈에서 처리를 하고 나서 결과를 파일로 저장하고 이를 64비트 파이썬 모듈에서 읽어서 처리한다. 호출부 소스와 실행부 소스 일부는 아래와 같다.

호출부 (64비트 파이썬 환경)

# ...
from sytrap import fakeipc as fipc

sipc = fipc.SytrapFakeIpc()
p = sipc.call('get_item', itcode='A168330')  # get_item는 32비트 환경에서 구동
# ...

실행부 (32비트 파이썬 환경)

# ...
ret = syc.get_item(itcode)   
p.dump(ret, open(ippath, 'wb'))  # 처리 결과를 미리 약속된 경로에 저장
# ...

다만 호출할 때 64비트 환경에서 32비트 파이썬 실행기와 파이썬 모듈 경로를 정확히 제시해주어야 한다. 아래는 호출 방법의 예이다.

 <64비트 환경 python.exe> 64비트.py <32비트 환경 python.exe> 32비트.py

구현해야 할 양이 조금은 많아졌지만 (함수 옵션 처리, 파일 입출력 등) 드디어 64비트 텐서플로우를 이용해 32비트 대신증권 모듈을 호출할 수 있게 되어 마음껏 딥러닝 기반 트레이딩 시스템을 돌릴 수 있게 되었다. 수익률까지 좋아지길 기대하고 있다. ㅎ

저와 비슷한 고민을 하시는 분들에게 조금이나마 도움이 되길 바란다.

32/64비트 파이썬 프로세스 통신”에 대한 9개의 생각

  1. 안녕하세요. 이 글의 tbacking님과 동일한 고민을 하고 있습니다. 글 내용중

    “다만 호출할 때 64비트 환경에서 32비트 파이썬 실행기와 파이썬 모듈 경로를 정확히 제시해주어야 한다. 아래는 호출 방법의 예이다.
    64비트.py 32비트.py”

    부분을 몇번을 읽어보아도 어떻게 구현할지 감이 안오고 있어 염치를 무릎쓰고 글을 남깁니다. 혹시 더 상세한 설명과 구체적인 예시를 부탁드려도 될지요?

    좋아요

  2. 안녕하세요, 64비트 python 코드 내에서 32비트 파이썬 코드를 아래와 같은 방법으로 단순 호출합니다.

    # 아래는 64비트 파이썬 Pseudo code
    32비트 실행기 (python) 위치 경로 기반 32비트 파이썬 코드 (.py) 를 실행 (ex c:\python32\python.exe d:/prjs/dsapi_get_stocks_items.py)
    결과값을 가져오기 (저의 경우에는 UUID 기반 파일 형테 temp 폴더에 결과값 저장해서 가져옵니다)
    결과값을 64비트 파이썬 코드에서 활용

    소스가 관리가 안 되서, 공유하려면 작업을 해야 되서 양해바랍니다.
    나중에 기회되면 공유하겠습니다.

    좋아요

  3. 안녕하세요! 현재 제가 당면한 문제인데요 ㅠㅜ
    ipc에 대한 이해가 없다보니 구체적으로 어떻게 해결해야할지 글을 보고도 막막하네요 ㅜㅠ
    혹시 sytrap모듈안에서 사용하는 ipc모듈 등에 대해서 조금 더 정보를 주실 수 있을까요?
    감사합니다!

    좋아요

    1. 그냥 쉽게 설명드리면, (간단한 구조입니다.)

      64비트 파이썬 코드 내에서 32비트 파이썬 코드(ex. c:\python32\python.exe legacy.py)를 호출하고
      32비트 파이썬 코드 내에서는 처리 결과값을 파일 (예로 UUID 형태로 랜덤 파일 생성) 에 저장하고
      그 이후에 64비트 코드 내에서 값을 읽어오는 방법입니다.

      랜덤 파일 생성 부분을 감추기 위해서 모듈 형태로 개발한 경우입니다. 따라서 64비트에서는 모듈 함수를 호출하면
      결국 모듈 내에서 32비트 파이선 호출하면서 랜덤 파일 경로를 주어지고,
      처리 결과를 파일에서 읽어서 그 결과를 64비트 파이썬 호출 모듈(caller)로 리턴하는 형태의 모듈입니다.

      좋아요

  4. 찾아보니 ipc통신을 위해서 os.fork()를 사용하는 경우도 있고, multiprocessing을 하는 경우도 있는데
    윈도우 상에서 os.fork()는 지원되지 않는 것 같습니다.

    그렇다면 multiprocessing을 통해서 구현하신건가요?

    좋아요

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중