Compare commits

...

4 Commits

Author SHA1 Message Date
Oleg Sheynin 8ccebf81f5 new purpose 2026-07-24 22:40:34 +00:00
Oleg Sheynin dc38176529 . 2026-05-02 23:36:17 +00:00
Oleg Sheynin 3f29717b64 cleaning 2026-04-01 18:27:13 +00:00
Oleg Sheynin ecc1c1de5d progress 0.0.9 2026-02-10 00:59:02 +00:00
39 changed files with 64 additions and 247 deletions
-1
View File
@@ -1 +0,0 @@
0.0.8
+2
View File
@@ -0,0 +1,2 @@
## 2026-02-09 (v0.0.9)
- related to the changes made in *cvttpy_tools 1.4.7*
View File
+1
View File
@@ -0,0 +1 @@
0.0.9
@@ -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 statsmodels.tsa.vector_ar.vecm import coint_johansen # type: ignore
from cvttpy_tools.app import App from cvttpy_tools.base.app import App
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.config import Config, CvttAppConfig from cvttpy_tools.base.config import Config, CvttAppConfig
from cvttpy_tools.logger import Log from cvttpy_tools.base.logger import Log
from cvttpy_tools.timeutils import NanoPerSec, SecPerHour, current_nanoseconds from cvttpy_tools.base.timeutils import NanoPerSec, SecPerHour, current_nanoseconds
from cvttpy_tools.web.rest_client import RESTSender from cvttpy_tools.comm.web.rest_service import RestService
from cvttpy_tools.web.rest_service import RestService
from cvttpy_trading.trading.exchange_config import ExchangeAccounts from cvttpy_trading.trading.exchange_config import ExchangeAccounts
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
from cvttpy_trading.trading.mkt_data.md_summary import MdTradesAggregate, MdSummary from cvttpy_trading.trading.mkt_data.md_summary import MdTradesAggregate, MdSummary
from pairs_trading.apps.pair_selector.renderer import HtmlRenderer from pairs_trading.apps.pair_selector.renderer import HtmlRenderer
from pairs_trading.lib.live.rest import RESTSender
@dataclass @dataclass
@@ -3,9 +3,9 @@ from __future__ import annotations
from typing import Any, Dict, List from typing import Any, Dict, List
from cvttpy_tools.app import App from cvttpy_tools.base.app import App
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.config import CvttAppConfig from cvttpy_tools.base.config import CvttAppConfig
class HtmlRenderer(NamedObject): class HtmlRenderer(NamedObject):
@@ -4,13 +4,13 @@ import asyncio
from typing import Callable, Coroutine, Dict, List from typing import Callable, Coroutine, Dict, List
import aiohttp.web as web import aiohttp.web as web
from cvttpy_tools.app import App from cvttpy_tools.base.app import App
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.config import CvttAppConfig from cvttpy_tools.base.config import CvttAppConfig
from cvttpy_tools.logger import Log from cvttpy_tools.base.logger import Log
from cvttpy_tools.settings.cvtt_types import BookIdT from cvttpy_tools.settings.cvtt_types import BookIdT
from cvttpy_tools.web.rest_service import RestService from cvttpy_tools.comm.web.rest_service import RestService
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
@@ -5,19 +5,19 @@ from typing import Dict, Any, List, Optional, Set
import requests import requests
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.logger import Log from cvttpy_tools.base.logger import Log
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
from cvttpy_tools.timer import Timer from cvttpy_tools.base.timer import Timer
from cvttpy_tools.timeutils import NanosT, current_seconds from cvttpy_tools.base.timeutils import NanosT, current_seconds
from cvttpy_tools.settings.cvtt_types import InstrumentIdT, IntervalSecT 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.instrument import ExchangeInstrument
from cvttpy_trading.trading.accounting.exch_account import ExchangeAccountNameT 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.mkt_data.md_summary import MdTradesAggregate, MdSummary, MdSummaryCallbackT
from cvttpy_trading.trading.exchange_config import ExchangeAccounts from cvttpy_trading.trading.exchange_config import ExchangeAccounts
# --- # ---
from pairs_trading.lib.live.rest import RESTSender
# class MdSummary(HistMdBar): # class MdSummary(HistMdBar):
@@ -1,14 +1,14 @@
```python
from __future__ import annotations from __future__ import annotations
from typing import Dict from typing import Dict, Optional
import time import time
import requests import requests
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
class RESTSender(NamedObject): class RESTSender(NamedObject):
# Synchronous request sernder
session_: requests.Session session_: requests.Session
base_url_: str base_url_: str
@@ -26,35 +26,35 @@ class RESTSender(NamedObject):
except requests.exceptions.RequestException: except requests.exceptions.RequestException:
return False return False
def send_post(self, endpoint: str, post_body: Dict) -> requests.Response: def send_post(
self, endpoint: str, post_body: Dict, headers: Optional[Dict[str, str]] = None
while not self.is_ready(): ) -> requests.Response:
print("Waiting for FrontGateway to start...")
time.sleep(5)
if not headers:
headers = {"Content-Type": "application/json"}
url = f"{self.base_url_}/{endpoint}" url = f"{self.base_url_}/{endpoint}"
try: try:
return self.session_.request( return self.session_.request(
method="POST", method="POST",
url=url, url=url,
json=post_body, json=post_body,
headers={"Content-Type": "application/json"}, headers=headers,
) )
except requests.exceptions.RequestException as excpt: except requests.exceptions.RequestException as excpt:
raise ConnectionError( raise ConnectionError(
f"Failed to send status={excpt.response.status_code} {excpt.response.text}" # type: ignore f"Failed to send status={excpt.response.status_code} {excpt.response.text}" # type: ignore
) from excpt ) from excpt
def send_get(self, endpoint: str) -> requests.Response: def send_get(
while not self.is_ready(): self, endpoint: str, headers: Optional[Dict[str, str]] = None
print("Waiting for FrontGateway to start...") ) -> requests.Response:
time.sleep(5) if not headers:
headers = {}
url = f"{self.base_url_}/{endpoint}" url = f"{self.base_url_}/{endpoint}"
try: try:
return self.session_.request(method="GET", url=url) return self.session_.request(method="GET", url=url, headers=headers)
except requests.exceptions.RequestException as excpt: except requests.exceptions.RequestException as excpt:
raise ConnectionError( raise ConnectionError(
f"Failed to send status={excpt.response.status_code} {excpt.response.text}" # type: ignore f"Failed to send status={excpt.response.status_code} {excpt.response.text}" # type: ignore
) from excpt ) from excpt
```
@@ -3,14 +3,14 @@ from enum import Enum
import requests import requests
# import aiohttp # import aiohttp
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
from cvttpy_tools.logger import Log from cvttpy_tools.base.logger import Log
from cvttpy_tools.web.rest_client import RESTSender
# --- # ---
from cvttpy_trading.trading.trading_instructions import TradingInstructions from cvttpy_trading.trading.trading_instructions import TradingInstructions
# --- # ---
from pairs_trading.apps.pair_trader import PairTrader from pairs_trading.apps.pair_trader import PairTrader
from pairs_trading.lib.live.rest import RESTSender
class TradingInstructionsSender(NamedObject): class TradingInstructionsSender(NamedObject):
@@ -5,12 +5,12 @@ from typing import Any, Dict, List, Optional
import pandas as pd import pandas as pd
# --- # ---
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.app import App from cvttpy_tools.base.app import App
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
from cvttpy_tools.settings.cvtt_types import IntervalSecT from cvttpy_tools.settings.cvtt_types import IntervalSecT
from cvttpy_tools.timeutils import NanosT, SecPerHour, current_nanoseconds, NanoPerSec, format_nanos_utc from cvttpy_tools.base.timeutils import NanosT, SecPerHour, current_nanoseconds, NanoPerSec, format_nanos_utc
from cvttpy_tools.logger import Log from cvttpy_tools.base.logger import Log
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
@@ -8,7 +8,7 @@ from typing import Any, Dict, Optional, cast
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
@dataclass @dataclass
class DataWindowParams: class DataWindowParams:
@@ -6,8 +6,8 @@ from typing import Any, Dict, List, Optional
import pandas as pd import pandas as pd
# --- # ---
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
from cvttpy_tools.settings.cvtt_types import JsonDictT from cvttpy_tools.settings.cvtt_types import JsonDictT
# --- # ---
@@ -4,7 +4,7 @@ from abc import ABC, abstractmethod
from typing import Any, Dict, cast from typing import Any, Dict, cast
# --- # ---
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
# --- # ---
from pairs_trading.lib.pt_strategy.prediction import Prediction from pairs_trading.lib.pt_strategy.prediction import Prediction
from pairs_trading.lib.pt_strategy.trading_pair import TradingPair from pairs_trading.lib.pt_strategy.trading_pair import TradingPair
@@ -4,7 +4,7 @@ from typing import Any, Dict, List, Optional, Tuple
import pandas as pd import pandas as pd
# --- # ---
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
# --- # ---
@@ -5,7 +5,7 @@ from typing import Any, Dict, List, Optional, Tuple
import pandas as pd import pandas as pd
# --- # ---
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
# --- # ---
@@ -8,8 +8,8 @@ from typing import Any, Dict, List
import pandas as pd import pandas as pd
# --- # ---
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
# --- # ---
@@ -2,7 +2,7 @@ import hjson
from typing import Dict from typing import Dict
from datetime import datetime from datetime import datetime
# --- # ---
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
def load_config(config_path: str) -> Config: def load_config(config_path: str) -> Config:
@@ -2,7 +2,7 @@ import os
import glob import glob
from typing import Dict, List, Tuple from typing import Dict, List, Tuple
# --- # ---
from cvttpy_tools.config import Config from cvttpy_tools.base.config import Config
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
@@ -4,9 +4,9 @@ import os
from typing import Any, Dict, List, Tuple from typing import Any, Dict, List, Tuple
# --- # ---
from cvttpy_tools.app import App from cvttpy_tools.base.app import App
from cvttpy_tools.base import NamedObject from cvttpy_tools.base.base import NamedObject
from cvttpy_tools.config import CvttAppConfig from cvttpy_tools.base.config import CvttAppConfig
# --- # ---
from cvttpy_trading.trading.instrument import ExchangeInstrument from cvttpy_trading.trading.instrument import ExchangeInstrument
@@ -182,7 +182,7 @@
"import os\n", "import os\n",
"import importlib\n", "import importlib\n",
"\n", "\n",
"from cvttpy_tools.config import Config\n", "from cvttpy_tools.base.config import Config\n",
"\n", "\n",
"def load_config_from_file() -> Optional[Dict]:\n", "def load_config_from_file() -> Optional[Dict]:\n",
" global DB_TABLE_NAME\n", " global DB_TABLE_NAME\n",
-43
View File
@@ -1,43 +0,0 @@
{
"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",
}
}
-47
View File
@@ -1,47 +0,0 @@
{
"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",
}
}
-47
View File
@@ -1,47 +0,0 @@
{
"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",
}
}
-48
View File
@@ -1,48 +0,0 @@
{
"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",
}
}