규식이랑 수환이랑 강남 이자카야에서 술 마시다가 합석을 했다.
상대방은 옆 테이블에 앉은 서로 알아가는 남녀였는데,
우리가 웃긴지 계속 빵터지길래 이럴거면 같이 한잔 하자해서 잘 놀고 인스타 교환도 했다.
미국물 먹은 친구들이라 아주 쿨하다..
인생이 시트콤이다 ㅋㅋㅋ
저번에 삽질로 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 |