Compare commits

..

No commits in common. "master" and "2060203_refactoring_pair_selector" have entirely different histories.

23 changed files with 247 additions and 64 deletions

View File

@ -1,2 +0,0 @@
## 2026-02-09 (v0.0.9)
- related to the changes made in *cvttpy_tools 1.4.7*

View File

@ -1 +1 @@
0.0.9
0.0.8

View File

@ -13,19 +13,19 @@ from statsmodels.tsa.stattools import adfuller, coint # type: ignore
from statsmodels.tsa.vector_ar.vecm import coint_johansen # type: ignore
from cvttpy_tools.base.app import App
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.config import Config, CvttAppConfig
from cvttpy_tools.base.logger import Log
from cvttpy_tools.base.timeutils import NanoPerSec, SecPerHour, current_nanoseconds
from cvttpy_tools.comm.web.rest_service import RestService
from cvttpy_tools.app import App
from cvttpy_tools.base import NamedObject
from cvttpy_tools.config import Config, CvttAppConfig
from cvttpy_tools.logger import Log
from cvttpy_tools.timeutils import NanoPerSec, SecPerHour, current_nanoseconds
from cvttpy_tools.web.rest_client import RESTSender
from cvttpy_tools.web.rest_service import RestService
from cvttpy_trading.trading.exchange_config import ExchangeAccounts
from cvttpy_trading.trading.instrument import ExchangeInstrument
from cvttpy_trading.trading.mkt_data.md_summary import MdTradesAggregate, MdSummary
from pairs_trading.apps.pair_selector.renderer import HtmlRenderer
from pairs_trading.lib.live.rest import RESTSender
@dataclass

View File

@ -3,9 +3,9 @@ from __future__ import annotations
from typing import Any, Dict, List
from cvttpy_tools.base.app import App
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.config import CvttAppConfig
from cvttpy_tools.app import App
from cvttpy_tools.base import NamedObject
from cvttpy_tools.config import CvttAppConfig
class HtmlRenderer(NamedObject):

View File

@ -4,13 +4,13 @@ import asyncio
from typing import Callable, Coroutine, Dict, List
import aiohttp.web as web
from cvttpy_tools.base.app import App
from cvttpy_tools.base.config import Config
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.config import CvttAppConfig
from cvttpy_tools.base.logger import Log
from cvttpy_tools.app import App
from cvttpy_tools.config import Config
from cvttpy_tools.base import NamedObject
from cvttpy_tools.config import CvttAppConfig
from cvttpy_tools.logger import Log
from cvttpy_tools.settings.cvtt_types import BookIdT
from cvttpy_tools.comm.web.rest_service import RestService
from cvttpy_tools.web.rest_service import RestService
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument

View File

@ -0,0 +1,43 @@
{
"market_data_loading": {
"CRYPTO": {
"data_directory": "./data/crypto",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "PAIR-",
},
"EQUITY": {
"data_directory": "./data/equity",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "STOCK-",
}
},
# ====== Funding ======
"funding_per_pair": 2000.0,
# ====== Trading Parameters ======
"stat_model_price": "close",
"execution_price": {
"column": "vwap",
"shift": 1,
},
"dis-equilibrium_open_trshld": 2.0,
"dis-equilibrium_close_trshld": 0.5,
"training_size": 120,
"model_class": "pairs_trading.lib.pt_strategy.models.OLSModel",
"model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.ExpandingWindowDataPolicy",
# ====== Stop Conditions ======
"stop_close_conditions": {
"profit": 2.0,
"loss": -0.5
}
# ====== End of Session Closeout ======
"close_outstanding_positions": true,
# "close_outstanding_positions": false,
"trading_hours": {
"timezone": "America/New_York",
"begin_session": "7:30:00",
"end_session": "18:30:00",
}
}

View File

@ -0,0 +1,47 @@
{
"market_data_loading": {
"CRYPTO": {
"data_directory": "./data/crypto",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "PAIR-",
},
"EQUITY": {
"data_directory": "./data/equity",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "STOCK-",
}
},
# ====== Funding ======
"funding_per_pair": 2000.0,
# ====== Trading Parameters ======
"stat_model_price": "close",
"execution_price": {
"column": "vwap",
"shift": 1,
},
"dis-equilibrium_open_trshld": 1.75,
"dis-equilibrium_close_trshld": 0.9,
"model_class": "pairs_trading.lib.pt_strategy.models.OLSModel",
# "model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.EGOptimizedWndDataPolicy",
# "model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.ADFOptimizedWndDataPolicy",
"model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.JohansenOptdWndDataPolicy",
"min_training_size": 60,
"max_training_size": 150,
# ====== Stop Conditions ======
"stop_close_conditions": {
"profit": 2.0,
"loss": -0.5
}
# ====== End of Session Closeout ======
"close_outstanding_positions": true,
# "close_outstanding_positions": false,
"trading_hours": {
"timezone": "America/New_York",
"begin_session": "7:30:00",
"end_session": "18:30:00",
}
}

View File

@ -0,0 +1,47 @@
{
"market_data_loading": {
"CRYPTO": {
"data_directory": "./data/crypto",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "PAIR-",
},
"EQUITY": {
"data_directory": "./data/equity",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "STOCK-",
}
},
# ====== Funding ======
"funding_per_pair": 2000.0,
# ====== Trading Parameters ======
"stat_model_price": "close",
"execution_price": {
"column": "vwap",
"shift": 1,
},
"dis-equilibrium_open_trshld": 1.75,
"dis-equilibrium_close_trshld": 0.9,
"model_class": "pairs_trading.lib.pt_strategy.models.OLSModel",
"training_size": 120,
"model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.RollingWindowDataPolicy",
# "model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.OptimizedWindowDataPolicy",
# "min_training_size": 60,
# "max_training_size": 150,
# ====== Stop Conditions ======
"stop_close_conditions": {
"profit": 2.0,
"loss": -0.5
}
# ====== End of Session Closeout ======
"close_outstanding_positions": true,
# "close_outstanding_positions": false,
"trading_hours": {
"timezone": "America/New_York",
"begin_session": "7:30:00",
"end_session": "18:30:00",
}
}

View File

@ -0,0 +1,48 @@
{
"market_data_loading": {
"CRYPTO": {
"data_directory": "./data/crypto",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "PAIR-",
},
"EQUITY": {
"data_directory": "./data/equity",
"db_table_name": "md_1min_bars",
"instrument_id_pfx": "STOCK-",
}
},
# ====== Funding ======
"funding_per_pair": 2000.0,
# ====== Trading Parameters ======
"stat_model_price": "close", # "vwap"
"execution_price": {
"column": "vwap",
"shift": 1,
},
"dis-equilibrium_open_trshld": 1.75,
"dis-equilibrium_close_trshld": 1.0,
"model_class": "pairs_trading.lib.pt_strategy.models.VECMModel",
"training_size": 120,
"model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.RollingWindowDataPolicy",
# "model_data_policy_class": "pairs_trading.lib.pt_strategy.model_data_policy.OptimizedWindowDataPolicy",
# "min_training_size": 60,
# "max_training_size": 150,
# ====== Stop Conditions ======
"stop_close_conditions": {
"profit": 2.0,
"loss": -0.5
}
# ====== End of Session Closeout ======
"close_outstanding_positions": true,
# "close_outstanding_positions": false,
"trading_hours": {
"timezone": "America/New_York",
"begin_session": "7:30:00",
"end_session": "18:30:00",
}
}

View File

@ -5,19 +5,19 @@ from typing import Dict, Any, List, Optional, Set
import requests
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.logger import Log
from cvttpy_tools.base.config import Config
from cvttpy_tools.base.timer import Timer
from cvttpy_tools.base.timeutils import NanosT, current_seconds
from cvttpy_tools.base import NamedObject
from cvttpy_tools.logger import Log
from cvttpy_tools.config import Config
from cvttpy_tools.timer import Timer
from cvttpy_tools.timeutils import NanosT, current_seconds
from cvttpy_tools.settings.cvtt_types import InstrumentIdT, IntervalSecT
from cvttpy_tools.web.rest_client import RESTSender
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument
from cvttpy_trading.trading.accounting.exch_account import ExchangeAccountNameT
from cvttpy_trading.trading.mkt_data.md_summary import MdTradesAggregate, MdSummary, MdSummaryCallbackT
from cvttpy_trading.trading.exchange_config import ExchangeAccounts
# ---
from pairs_trading.lib.live.rest import RESTSender
# class MdSummary(HistMdBar):

View File

@ -1,14 +1,14 @@
```python
from __future__ import annotations
from typing import Dict, Optional
from typing import Dict
import time
import requests
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base import NamedObject
class RESTSender(NamedObject):
# Synchronous request sernder
session_: requests.Session
base_url_: str
@ -26,35 +26,35 @@ class RESTSender(NamedObject):
except requests.exceptions.RequestException:
return False
def send_post(
self, endpoint: str, post_body: Dict, headers: Optional[Dict[str, str]] = None
) -> requests.Response:
def send_post(self, endpoint: str, post_body: Dict) -> requests.Response:
while not self.is_ready():
print("Waiting for FrontGateway to start...")
time.sleep(5)
if not headers:
headers = {"Content-Type": "application/json"}
url = f"{self.base_url_}/{endpoint}"
try:
return self.session_.request(
method="POST",
url=url,
json=post_body,
headers=headers,
headers={"Content-Type": "application/json"},
)
except requests.exceptions.RequestException as excpt:
raise ConnectionError(
f"Failed to send status={excpt.response.status_code} {excpt.response.text}" # type: ignore
) from excpt
def send_get(
self, endpoint: str, headers: Optional[Dict[str, str]] = None
) -> requests.Response:
if not headers:
headers = {}
def send_get(self, endpoint: str) -> requests.Response:
while not self.is_ready():
print("Waiting for FrontGateway to start...")
time.sleep(5)
url = f"{self.base_url_}/{endpoint}"
try:
return self.session_.request(method="GET", url=url, headers=headers)
return self.session_.request(method="GET", url=url)
except requests.exceptions.RequestException as excpt:
raise ConnectionError(
f"Failed to send status={excpt.response.status_code} {excpt.response.text}" # type: ignore
) from excpt
```

View File

@ -3,14 +3,14 @@ from enum import Enum
import requests
# import aiohttp
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.config import Config
from cvttpy_tools.base.logger import Log
from cvttpy_tools.base import NamedObject
from cvttpy_tools.config import Config
from cvttpy_tools.logger import Log
from cvttpy_tools.web.rest_client import RESTSender
# ---
from cvttpy_trading.trading.trading_instructions import TradingInstructions
# ---
from pairs_trading.apps.pair_trader import PairTrader
from pairs_trading.lib.live.rest import RESTSender
class TradingInstructionsSender(NamedObject):

View File

@ -5,12 +5,12 @@ from typing import Any, Dict, List, Optional
import pandas as pd
# ---
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.app import App
from cvttpy_tools.base.config import Config
from cvttpy_tools.base import NamedObject
from cvttpy_tools.app import App
from cvttpy_tools.config import Config
from cvttpy_tools.settings.cvtt_types import IntervalSecT
from cvttpy_tools.base.timeutils import NanosT, SecPerHour, current_nanoseconds, NanoPerSec, format_nanos_utc
from cvttpy_tools.base.logger import Log
from cvttpy_tools.timeutils import NanosT, SecPerHour, current_nanoseconds, NanoPerSec, format_nanos_utc
from cvttpy_tools.logger import Log
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument

View File

@ -8,7 +8,7 @@ from typing import Any, Dict, Optional, cast
import numpy as np
import pandas as pd
from cvttpy_tools.base.config import Config
from cvttpy_tools.config import Config
@dataclass
class DataWindowParams:

View File

@ -6,8 +6,8 @@ from typing import Any, Dict, List, Optional
import pandas as pd
# ---
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.config import Config
from cvttpy_tools.base import NamedObject
from cvttpy_tools.config import Config
from cvttpy_tools.settings.cvtt_types import JsonDictT
# ---

View File

@ -4,7 +4,7 @@ from abc import ABC, abstractmethod
from typing import Any, Dict, cast
# ---
from cvttpy_tools.base.config import Config
from cvttpy_tools.config import Config
# ---
from pairs_trading.lib.pt_strategy.prediction import Prediction
from pairs_trading.lib.pt_strategy.trading_pair import TradingPair

View File

@ -4,7 +4,7 @@ from typing import Any, Dict, List, Optional, Tuple
import pandas as pd
# ---
from cvttpy_tools.base.config import Config
from cvttpy_tools.config import Config
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument
# ---

View File

@ -5,7 +5,7 @@ from typing import Any, Dict, List, Optional, Tuple
import pandas as pd
# ---
from cvttpy_tools.base.config import Config
from cvttpy_tools.config import Config
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument
# ---

View File

@ -8,8 +8,8 @@ from typing import Any, Dict, List
import pandas as pd
# ---
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.config import Config
from cvttpy_tools.base import NamedObject
from cvttpy_tools.config import Config
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument
# ---

View File

@ -2,7 +2,7 @@ import hjson
from typing import Dict
from datetime import datetime
# ---
from cvttpy_tools.base.config import Config
from cvttpy_tools.config import Config
def load_config(config_path: str) -> Config:

View File

@ -2,7 +2,7 @@ import os
import glob
from typing import Dict, List, Tuple
# ---
from cvttpy_tools.base.config import Config
from cvttpy_tools.config import Config
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument

View File

@ -4,9 +4,9 @@ import os
from typing import Any, Dict, List, Tuple
# ---
from cvttpy_tools.base.app import App
from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.base.config import CvttAppConfig
from cvttpy_tools.app import App
from cvttpy_tools.base import NamedObject
from cvttpy_tools.config import CvttAppConfig
# ---
from cvttpy_trading.trading.instrument import ExchangeInstrument

View File

@ -182,7 +182,7 @@
"import os\n",
"import importlib\n",
"\n",
"from cvttpy_tools.base.config import Config\n",
"from cvttpy_tools.config import Config\n",
"\n",
"def load_config_from_file() -> Optional[Dict]:\n",
" global DB_TABLE_NAME\n",