# .bat실행에 문제없도록 'backtest'명의 가상환경을 본 프로젝트와와 동일 디렉토리에 설치 부탁드립니다.
# .
# ├── Backtest -> 가상환경
# ├── Project /
# │ ├── api_test
# │ ├── data
# │ ├── import_price_data
# │ └── ...
python -m venv backtest-
Windows
backtest\Scripts\activate
-
Linux
source backtest/bin/activate
# 프로젝트 폴더/
pip install -r requirements.txtPostgreSQL에서 backtest DB와 유저를 아래와 같이 생성합니다:
CREATE DATABASE backtest;
CREATE USER backtest WITH PASSWORD 'backtest';
GRANT ALL PRIVILEGES ON DATABASE backtest TO backtest;Linux환경에서 실행시 backtest로 로그인하기 위해 /etc/postgresql/{버전}/main/pg_hba.conf 에서 인증방식을 변경해야 할 수 있습니다. Peer -> md5
DB 연결 정보는
.env또는DATABASE_URL환경변수로 관리합니다.
#env 내용입니다.
# 위치 : 최상위 경로
DATABASE_URL = postgresql://backtest:backtest@127.0.0.1:5432/backtest
과제 내용 중 주어진 가격데이터를 데이터베이스에 넣는 과정 입니다.
# 프로젝트 폴더/
python import_price_data.pyuvicorn main:app --reload| 항목 | 내용 |
|---|---|
| Base URL | /backtest |
| Response Format | JSON |
| Auth | 없음 |
- Method:
POST - URL:
/backtest/run - Description: 입력값을 바탕으로 백테스트 계산 후 DB에 저장하고 결과 반환
{
"start_year": 2020,
"start_month": 1,
"trade_day": 10,
"initial_balance": 1000,
"fee_rate": 0.001,
"weight_months": 6
}{
"data_id": 1,
"output": {
"total_return": 0.66,
"cagr": 0.1043,
"vol": 0.121,
"sharpe": 0.86,
"mdd": -0.1947
},
"last_rebalance_weight": [
["SPY", 0.5],
["QQQ", 0.5],
["BIL", 0.0]
]
}- Method:
GET - URL:
/backtest/ - Description: 저장된 모든 백테스트
data_id와 마지막 리밸런싱 비중 반환
[
{
"data_id": 1,
"last_rebalance_weight": [["SPY", 0.5], ["QQQ", 0.5], ["BIL", 0.0]]
},
{
"data_id": 2,
"last_rebalance_weight": [["GLD", 0.5], ["QQQ", 0.5], ["BIL", 0.0]]
}
]- Method:
GET - URL:
/backtest/{data_id} - Description: 특정
data_id의 입력값 + 통계 + 마지막 리밸런싱 비중 반환
{
"input": {
"start_year": 2020,
"start_month": 1,
"invest": 1000,
"trade_date": 10,
"cost": 0.001,
"caculate_month": 6
},
"output": {
"data_id": 1,
"total_return": 0.66,
"cagr": 0.1043,
"vol": 0.121,
"sharpe": 0.86,
"mdd": -0.1947
},
"last_rebalance_weight": [
["SPY", 0.5],
["QQQ", 0.5],
["BIL", 0.0]
]
}- Method:
DELETE - URL:
/backtest/{data_id} - Description: 특정
data_id의 백테스트 결과 삭제
{
"data_id": 2
}| Endpoint | 설명 |
|---|---|
/backtest/test |
매매 date 및 ETF 가격 DataFrame을 JSON으로 반환 |
ETF 가격을 정기적으로 업데이트하기 위한 배치 스크립트입니다.
update_prices.bat 예시
@echo off
cd /d "%~dp0"
call "..\{가상환경 이름름}\Scripts\activate.bat"
python update_prices.py-
작업 스케줄러(Task Scheduler)에서
.bat파일을 원하는 시간대에 실행 등록 -
크롤링 시 EST 시간으로 진행하기 때문에 현재 시간인 KST(UTC+9) 기준 오전 8시에 실행시키도록 등록하면 됩니다.
1. 편집기 열기
crontab -e2. 아래 내용 추가 (KST 기준 매일 오전 8시 실행)
0 8 * * * /home/username/가상환경 경로/bin/python /home/username/프로젝트 경로/update_prices.py
venv경로와update_prices.py경로는 실제 환경에 맞게 수정해주세요.
배치 프로그램 테스트 진행 중 bat 파일을 실행시키면 데이터가 입력 될 것이라 생각하여 편리한 테스트를 위해 아래 SQL문을 넣었습니다.
# psql내 실행 -> 기존 데이터 삭제 및 인덱스 초기화
TRUNCATE TABLE prices RESTART IDENTITY;DB초기화 이후 import_price_data를 다시한번 실행시키면 문제없이 진행 될 것이라 생각합니다.
python import_price_data.py
.
├── api_test/
│ ├── main.py
│ ├── database.py
│ ├── schemas.bat
│ ├── routes/
│ ├── services/
│ └── migrations/
├── data/
│ └── price_data.csv
├── requirements.txt
├── update_prices.bat
├── update_prices.log
└── update_prices.py
- 주말(EST 기준)에는 가격이 업데이트되지 않습니다.