안녕하세요?


드디어 외면하고 외면했던 작업에 직면해야 했습니다. 제가 굳이 무리해서까지 exe파일을 만들어 보는 실습을 해보며, 다양한 시도를 하였던 이유가 바로 pytrader에서 만들어 낸 명령으로 RLTrader를 실행시키고, 서로간에 변수를 주고 받도록 하는 것 이었습니다. 그런데 일단 한번 pytrader에서 RLTrader를 실행시키는 것은 성공했는데, 문제는 다른 프로젝트에 있는 파이썬 프로그램간에 변수를 공유하는 것은 무리였습니다.



먼저 프로젝트를 위해서 새로운 프로젝트를 생성하도록 합니다.



그리고 여기에는 RLTrader의 스크립트 파일들을 가지고 오도록 합니다.



다음으로는 새로운 환경을 만들어 보는데, 기존의 RLTrader를 작동시킨 환경에서 pyinstaller를 추가하는 가상환경을 만들어 주고자 하는 것 입니다.



지난번에 했던 것과 마찬가지로 pip를 사용해서 pyinstaller를 인스톨하되, 개발자 버젼의 주소를 구해서 인스톨하도록 해야 했습니다.



일단 pyinstaller의 홈페이지가 불통인 관계로 위 스크린샷과 같은 곳을 가서, 한번 다운로드 받아서 와야만 했습니다. 아무튼 간에 일단 pyinstaller를 개발자 버젼으로 다운로드 받도록 합니다.



그리고 이제 새로 만들어 낸 프로젝트의 환경을 방금 설정을 끝마쳐준 환경을 Pycharm에서 Setting메뉴를 통해서 한번 설정해 주도록 합니다.




일단 하나하나 스크립트를 수정해 주어야 하는데, 일단 먼저 수정해 주는 것은 다름 아닌, stock code와 같은 변수를 class를 선언하면서 선언해 주어서 일단 이전에 RLTrader에서는 그렇게 신경쓰지 않았는 클래스 변수를 만들어 주도록 합니다.



다음으로는 이전에는 클래스와 메소드의 선언이 없었지만, 여기서는 만들어 주어서 한번 들어가 보기는 보는데, 먼저 로그 기록을 남기는 메서드를 만들어 줍니다.



그리고 나서 여기서는 기계 학습을 시키는 것이 아니기 때문에, 비학습 투자학습 시뮬레이션만 남기도록 합니다. 그리고 나서 프로그램이 종료가 되도록 만들기 위해서 sys.exit()라는 것을 추가해 주도록 했습니다.



그리고 나서 실행을 시키기 위한 __name__ == '__main__': 을 추가해 주도록 합니다.



그리고 나서 한계라면 한계이겠지만, 일단 cutting_point2를 제대로 %가 되도록 설정해 주도록 합니다. 그런데 여기서 이제와서야 깨달은 것이 있습니다.



위 스크린샷처럼 정식으로 계산을 해서 나오는 반올림한 값을 cuttingPoint로 만들어야 하는데, 지난번 기계학습을 시킬 때는 그렇게 하지를 못했습니다.




다음으로는 모델의 경로인데, 이 역시 시작하자 마자 설정을 해 주도록 __init__(self): 에서 변수선언을 해 주도록 합니다.



다음으로는 위 스크린샷에서 보이는 것과 마찬가지로, 우선 data_manager.py에서 관련된 내용을 먼저 sql 데이터 베이스를 읽어 들일수 있도록 만들어 주도록 합니다. 그리고 나서, 위 스클린샷처럼 개조를 해 주도록 합니다.



일단 시험적으로 newTestAI라는 프로젝트 폴더안에 모델과 데이터 베이스를 넣고 나서 위 스크린샷처럼 학습을 시켜놓고 나니, 제대로 돌아는 가는 것을 볼 수 있었습니다.



이제 다시 pytrader에 가서 위 스크린샷처럼 os.system()함수를 사용해서 하드 디스크에 있는 다른 프로젝트의 파일을 실행시켜 줄 차례인데, 위 스크린샷처럼 abspath()함수를 써서 절대경로를 만들어야 했는데, 그 이유는 제 유저 이름등에 있는 n때문에 윈도우에서 사용하는 폴더를 구분하는 기호인 \를 사용하면 \n이 나와서 에러가 떴습니다. 그래서 리눅스처럼 / 를 사용해야 했는데, 이렇게 되면 윈도우 환경에서는 인식이 안 됩니다. 그래서 이번에는 abspath()라는 함수를 사용하도록 했습니다.



일단 pytrader를 실행시키도록 합니다.



그리고 나서 pytrader만 실행시켰을 뿐인데, RLTrader가 제대로 작동이 되는 것을 확인할 수 있었습니다.




이제 다음 작업을 위해서 먼저 pytrader를 백업해 주도록 합니다.



다음으로는 일단 위 스크린샷처럼 프로젝트의 폴더 안에 또 폴더를 만들어서 아래에 만들어 주도록 합니다.



그리고 나서 인터넷에서 찾아낸 정보로 sys.path.insert()를 사용했지만, 문제는 이것만 가지고서는 전혀 파이썬 스크립트 안에서 import가 되지 않는 문제점이 발생하는 것 이었습니다.



그래서 하는 수 없이 리눅스에서 touch명령을 하는 copy /b 파일명 +,, 명령을 사용했습니다만, 이 방법도 그다지 효과가 없었습니다.



결국 무슨 수를 써도 스크립트 상에서 어떻게 하는 것으로는 다른 프로젝트-그것도 다른 환경에서 만들어져 있는 경우에는 위 스크린샷처럼 변수를 공유할 수 없다는 것 입니다. 그래서 또 문제에 부딪쳤습니다만, 그래도 언제나 그러했듯이 계속해서 문제의 해결책을 찾아 보려고 할 것입니다.

  1. 호바드 2020.01.26 11:08

    ModuleNotFoundError: No module named 'tensorflow'
    에러나는데요..

    >pip install temsorflow 이거 실행해 봐도..
    이런 에러나 나네요.. ananconda, python 재설치 하지 않고, 해결할 방법은 없을까요?

    (py37_32_pyinstaller) C:\Users\user\PycharmProjects\newTestAI>pip install temsorflow
    ERROR: Could not find a version that satisfies the requirement temsorflow (from versions: none)
    ERROR: No matching distribution found for temsorflow

    • 안녕하세요?

      조금 답글이 늦어졌는데, 우선 아나콘다 프롬프트에서 실행을 하셨는지요?
      이게 아니라면 아마 강제로랄까 방법이 없진 않습니다.
      일단 먼저 64비트 윈도우에서 pip install --upgrade pip
      이것으로 pip를 버전업 시켜주고,
      pip install --upgrade tensorflow
      입니다.

  2. 호바드 2020.01.27 09:43

    답변 감사합니다.
    tensorflow는 pip 를 통해서 설치하는데 겨우 성공했는데..
    다음문제가 또 있습니다.

    "C:/Users/howard kim/PycharmProjects/newTestAI/main.py"
    을 실행하면, 다음과 같이 잘 실행됩니다.
    0001
    0002
    Using TensorFlow backend.
    0003
    cutting_Point: 6975
    started
    0004
    LR: 0.01, DF: 0, TU: [1, 10], DRT: 0.02
    002
    가시화결과저장 폴더: C:\Users\howard kim\PycharmProjects\newTestAI\epoch_summary/005930/epoch_summary_20200127091407
    [Epoch 1/1] Epsilon:0.0000 #Expl.:0/6974 #Buy:1293 #Sell:924 #Hold:4757 #Stocks:1184 PV:\18,651,918 POS:0 NEG:0 Loss: 0.000000
    Max PV: \18,651,918, # Win: 1
    finished

    Process finished with exit code 0

    그래서,
    >pyinstaller --windowed --onefile main.py
    로 main.exe파일을 만들었고.. exe파일은 정상적으로 생성이 된것 같아서..
    pytrader.py에서...

    now = datetime.now()
    daynow4 = now.strftime('%Y%m%d')
    df = pd.DataFrame(self.kiwoom.ohlcv, columns=['date', 'open', 'high', 'low', 'close', 'volume'])
    df3 = df.sort_values(by=['date'], axis=0, ascending=True)
    df4 = df3.set_index("date")
    con = sqlite3.connect(folderPath3 + "%s.db" % daynow4)
    print(folderPath3 + "%s.db" % daynow4)
    df4.to_sql(stockCode, con, if_exists='append')
    exeFilePath = os.path.abspath("C:/Users/howard kim/PycharmProjects/newTestAI/main.exe")
    os.system(exeFilePath)
    return

    이렇게 exefilepath를 지정해 준 다음 실행을 하니...

    'C:\Users\howard'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
    배치 파일이 아닙니다.

    라는 에러가 뜹니다...
    이상해서.. 파일탐색기에서 exe파일을 실행해보니..
    "Fatal error detected" "Failed to execute script main" 라고 뜹니다..

    인터넷 뒤지니.. 하기와 같이 하면, 에러 script를 볼 수 있다고 해서..
    >pyinstaller --onefile main.py
    이렇게 exe파일을 다시 만들어서 파일탐색기에서 exe를 다시 실행해 보니..

    "cannot import name 'pywrap_tensorflow' from 'tensorflow_core.python'"
    이런 부분이 마지막에 보니고..
    [11356]Failed to execute script main
    이런 에러로 끝나는것이 보입니다.

    tensorflow를 재 설치도 해 보고, 별짓을 다 하고 있으나.. 해결이 안되네요..
    혹시, 해결 방법이나 체크해봐야 할 부분 있을까요?

    • 안녕하세요?

      허리까지 삐긋해서 좀 댓글이 달리는 것이 늦어졌습니다.
      일단 exe파일 만들기가 상당히 골치 아픈데, 아마 이 단계에서는 나중에 더 후기의 포스팅으로 가면 spec파일이라는 것도 생성을 해야 했습니다.
      잠시 검색해서 답글에 해당하는 포스팅을 올려드리겠습니다.

    • 안녕하세요?

      허리까지 삐긋해서 좀 댓글이 달리는 것이 늦어졌습니다.
      일단 exe파일 만들기가 상당히 골치 아픈데, 아마 이 단계에서는 나중에 더 후기의 포스팅으로 가면 spec파일이라는 것도 생성을 해야 했습니다.
      잠시 검색해서 답글에 해당하는 포스팅을 올려드리겠습니다.

    • 안녕하세요?

      허리치료받고 쉰다고 잠시 댓글이 늦어졌습니다. 아무튼 그 spec파일이 무엇이냐 하면,
      https://netpilgrim.net/1274

      이 포스팅을 보시면 나와 있는데, exe파일로 만들기 위한 작업이 나와 있다고 보시면 됩니다.

  3. 호바드 2020.01.30 21:50

    너무 무리하셨나 보네요. 허리 치료중에 상세히 답변까지 주시고..
    정말 감사합니다. spec? 확인해 보겠습니다.

+ Recent posts