# 배포된 전략 관리하기 [PyQQQ CLI 사용하기](#pyqqq_cli)에서 간단한 애플리케이션을 작성하고 배포 했습니다. 이제 조금 더 자세하게 배포에 대해서 알아보도록 하겠습니다. ## 배포란? 배포란 PyQQQ 플랫폼에서 애플리케이션을 서버에 전송하여 원격으로 실행시키는 과정을 의미합니다. PC에서 프로그램을 실행하는 것과 달리, 클라우드에서 실행하면 주식 거래와 같은 실시간 데이터 처리에서 더 높은 신뢰성을 제공합니다. 클라우드는 서버 중단, 네트워크 지연 등의 위험을 최소화하며, 항상 안정적으로 작동하는 환경을 통해 중요한 거래와 분석이 중단 없이 이루어질 수 있도록 지원합니다. ## 애플리케이션 구조 간단한 애플리케이션(이하 전략)의 폴더 구조를 보면 다음과 같습니다. ```{code-block} . ├── .env ├── sample.py └── requirements.txt ``` 크게 3가지로 나누어 볼 수 있습니다. 전략을 구동시키는 파이썬 파일과 환경변수 그리고 실행에 필요한 패키지 목록입니다. - **파이썬 파일 (sample.py)**: 엔트리 함수가 구현되어 있는 파일 - **패키지 목록 (requirements.txt)**: 라이브러리 패키지 목록이 기록되어 있는 파일 - **환경변수 파일 (.env)**: 전략 실행에 필요한 변수가 저장되어 있는 파일 각각에 대해서 알아보도록 하겠습니다. ## 엔트리 함수 PyQQQ 플랫폼에 전략을 배포하기 위해서는 필수 **엔트리 함수**가 반드시 구현되어 있어야 합니다. 배포하는 전략의 성격에 맞춰 **엔트리 함수**를 추가해야 합니다. | 구분 | 함수 | 구현방식 | |----------|----------|----------| | 일반 | async def run() | 무한 루프 | | 백테스트 | async def run_batch() | 1회 실행 후 종료 | 클라우드 서버는 배포된 전략의 엔트리 함수를 자동으로 찾아 실행합니다. 만약, 엔트리 함수가 없다면 실행이 중단됩니다. ### 실행 시간 일반 전략을 배포할 때, 엔트리 함수는 ``무한 루프`` 형태로 구현하는 것이 일반적이며, 이를 통해 배포된 전략은 24시간 지속적으로 동작합니다. 이 방식은 시간에 따라 유연하게 대응할 수 있는 장점을 제공합니다. 예를 들어, 거래소 마감 30분/20분/10분 전에 각각 매수를 수행하도록 할 수 있습니다. 또한, 미국의 데이장 마감 후 차트를 분석하여 애프터마켓에서 매수를 진행하는 전략도 구현 가능합니다. ```python ... async def run(self): while True: try: if is_trading_time(): # 거래시간 확인 await self.on_trade() else: self.logger.info(f"market closed") except Exception as e: self.logger.exception(e) await asyncio.sleep(60) # 1분마다 실행 ... ``` 위 코드는 거래 시간을 체크하며 지속적으로 ``on_trade``함수를 호출해 거래 작업을 수행하고, 거래 시간이 아니면 market closed 메시지를 출력합니다. ## 라이브러리 전략을 작성하다보면 단순 이동평균, 지수 이동평균 등 수학 계산을 많이 필요로 합니다. 이런 경우, 일일이 코드를 작성하는 것보다 데이터 분석 라이브러리를 사용하는 것이 바람직합니다. ```{code-block} python import pandas as pd # 예제 데이터 data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] period = 3 # pandas를 사용한 SMA 계산 df = pd.DataFrame(data, columns=["Value"]) df["SMA"] = df["Value"].rolling(window=period).mean() print("SMA (pandas):") print(df) ``` 다음 명령어를 통해 사용하고 있는 라이브러리 패키지 목록을 기록할 수 있습니다. 전략이 배포되면 클라우드 서버에서 requirements.txt 파일을 찾아 라이브러리를 자동으로 설치합니다. ```bash $ pip freeze > requirements.txt ``` ## 환경변수 전략에는 [Broker API 정보](#brokers)와 같은 중요한 데이터가 필요하며, 이를 환경변수 파일(.env)에 저장하여 사용합니다. 전략을 배포하면 코드와 ``.env`` 파일이 같이 전송됩니다. 전송 된 환경변수는 암호화되어 저장되며, 해당 전략에서만 접근 가능하도록 보호됩니다. 전략을 삭제하면 암호화된 환경변수 데이터도 모두 삭제되어 사용할 수 없게 됩니다. ```{code-block} :name: .env ## 한투 미국거래 계좌 KIS_APP_KEY=... KIS_APP_SECRET=... KIS_CANO=... KIS_ACNT_PRDT_CD=... ## LS(구 이베스트투자)증권 계좌 EBEST_APP_KEY=... EBEST_APP_SECRET=... ``` 환경변수에서 Broker API정보를 읽어서 다음처럼 사용할 수 있습니다. ```{code-block} python import os import dotenv from pyqqq.brokerage.ebest.oauth import EBestAuth from pyqqq.brokerage.ebest.simple import EBestSimpleDomesticStock dotenv.load_dotenv() auth = EBestAuth( os.getenv("EBEST_APP_KEY"), os.getenv("EBEST_APP_SECRET"), paper_trading=os.getenv("PAPER_TRADING") == "1", ) simple_api = EBestSimpleDomesticStock(auth=auth) ``` 또한, [KV 저장소](#kvstore)에 환경변수를 저장해 사용할 수 있습니다.