본문 바로가기

Quant

시스템 안정화 (1)

규식이랑 수환이랑 강남 이자카야에서 술 마시다가 합석을 했다.

상대방은 옆 테이블에 앉은 서로 알아가는 남녀였는데,

우리가 웃긴지 계속 빵터지길래 이럴거면 같이 한잔 하자해서 잘 놀고 인스타 교환도 했다.

미국물 먹은 친구들이라 아주 쿨하다.. 

 

인생이 시트콤이다 ㅋㅋㅋ

뽕족 굳


저번에 삽질로 Backtesting Usecase에서는 localhost를 사용해 네트워크 시간을 최소화하면 성능이 대폭 감소하는 인사이트를 얻었다.

백테스팅 하는 날마다 명령어를 입력하기 귀찮으니 개발자답게 자동화하자.

 

 

1. DAO에서 mongoUri를 어떻게 세련되게 분기할까

- parameter를 추가해서 구분한다 -> 그런데 Backtesting, Trading bot 모두 직접 DAO를 호출하지 않고 비즈니스 로직에서 호출하기에 비즈니스 로직 코드도 변경해야 한다. 코드 변경이 많아서 패스

 

- 환경변수로 구분한다 -> 프로세스 종료 시점까지 변경이 불가하지만, 어차피 다른 프로세스인데 상관이 없다 -> 코드 변경도 적다. 

@singleton
class DailyOhlcvDAO:
    def __init__(
            self, mongo_uri=None, db_name="daily_ohlcv",
    ):
        env = os.getenv("ENV", "backtest")
        if env == "backtest":
            self.mongo_uri = "mongodb://localhost:27017"
        else:
            username = os.getenv("MONGO_USERNAME")
            password = os.getenv("MONGO_PASSWORD")
            host = os.getenv("MONGO_HOST")
            self.mongo_uri = f"mongodb+srv://{username}:{password}@{host}/"

 


2. DB dump & restore 자동화

- 모든 데이터를 다 복사할 필요는 없다. 오히려 실시간 데이터에는 일봉/분봉을 쌓을 필요가 없고, 백테스팅 데이터에는 일봉/분봉이 필요하다. 결론은 실시간 데이터만 잘 복사하면 된다.

- 스케줄러에 batch 프로세스를 등록하자

- pre requisite : 환경변수 세팅, 스케줄러 세팅

@echo off
REM 환경변수가 이미 설정되어 있다고 가정합니다.
REM 필요하다면 아래처럼 주석을 해제해서 임시로 설정할 수도 있습니다.
REM set MONGO_USERNAME=your_username
REM set MONGO_PASSWORD=your_password
REM set MONGO_HOST=your_atlas_host


echo Dumping database: daily
mongodump --uri "mongodb+srv://%MONGO_USERNAME%:%MONGO_PASSWORD%@%MONGO_HOST%/?authSource=admin" --archive=mongo_archive/daily.archive --gzip --db daily

echo Dumping database: realtime
mongodump --uri "mongodb+srv://%MONGO_USERNAME%:%MONGO_PASSWORD%@%MONGO_HOST%/?authSource=admin" --archive=mongo_archive/realtime.archive --gzip --db realtime

echo Dumping database: stock (excluding 'info' collection)
mongodump --uri "mongodb+srv://%MONGO_USERNAME%:%MONGO_PASSWORD%@%MONGO_HOST%/?authSource=admin" --archive=mongo_archive/stock.archive --gzip --db stock --excludeCollection info

- 모호한 것보다는 명시적인 것이 좋으니, DB마다 조건을 명확하게 적자

 


3. pre-commit & ruff 적용

- 회사 새 프로젝트를 하는데 거기는 python 기반이라 라이브러리, 툴을 이미 잘 활용하고 있더라.

- 그 중에서 pre-commit & ruff를 조합해서 적용하는 걸 보고 심플하고도 임팩트가 크다 생각해 내 프로젝트에도 적용한다

 

패키지를 설치하고, 세팅 얌엘을 추가한다.

pip install pre-commit ruff

pre-commit install

pre-commit sample-config > .pre-commit-config.yaml

얌엘에 아래 코드를 잘 적어준다.

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-yaml
      - id: check-added-large-files

  - repo: https://github.com/astral-sh/ruff-pre-commit
    # Ruff version.
    rev: v0.11.0
    hooks:
      # Run the linter.
      - id: ruff
        types_or: [python, pyi]
        args: [--fix]
      # Run the formatter.
      - id: ruff-format
        types_or: [python, pyi]
git add *
git commit -m "feat: add pre-commit"

 


TODO

 

1. Data validation 로직 추가

- 백테스팅을 할 때, 리팩토링을 하다가 정렬이 안 된 상태이거나 중복된 데이터를 가진 케이스를 가끔 발견했다.

- 추후 개발 시 사이드 이펙트를 방지하기 위해 validation 로직을 추가한다. Get data 로직에만 적용하면 될 거 같다.

 

 

'Quant' 카테고리의 다른 글

퀀트 전략 업데이트 (1)  (0) 2025.03.17
시스템 안정화 (2)  (0) 2025.03.16
Sorting과 성능 최적화 (2)  (0) 2025.03.13
Sorting과 성능 최적화  (0) 2025.03.09
돈 파쇄기 개발 성공  (0) 2025.03.07