diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 01c8a83..eb189a4 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,7 +3,6 @@ "ms-python.python", "ms-python.pylance", "ms-python.black-formatter", - "ms-python.flake8", "ms-python.mypy-type-checker", "ms-python.isort" ] diff --git a/.vscode/pairs_trading.code-workspace b/.vscode/pairs_trading.code-workspace index 53d1337..bab1b7f 100644 --- a/.vscode/pairs_trading.code-workspace +++ b/.vscode/pairs_trading.code-workspace @@ -1,13 +1,8 @@ { "folders": [ - { - "path": ".." - }, - { - "path": "../../cvttpy_base" - } - ], - "settings": { - "workbench.colorTheme": "Dracula Theme" - } + { + "path": ".." + } + ], + "settings": {} } \ No newline at end of file diff --git a/bin/pairs_trader.py b/bin/pairs_trader.py index bb84a29..826701d 100644 --- a/bin/pairs_trader.py +++ b/bin/pairs_trader.py @@ -3,20 +3,21 @@ from __future__ import annotations from functools import partial from typing import Dict, List +from cvttpy_tools.settings.cvtt_types import JsonDictT +from cvttpy_tools.tools.app import App +from cvttpy_tools.tools.base import NamedObject +from cvttpy_tools.tools.config import CvttAppConfig +from cvttpy_tools.tools.logger import Log +from pt_strategy.live.live_strategy import PtLiveStrategy +from pt_strategy.live.pricer_md_client import PtMktDataClient +from pt_strategy.live.ti_sender import TradingInstructionsSender + # import sys # print("PYTHONPATH directories:") # for path in sys.path: # print(path) -from cvttpy_base.tools.app import App -from cvttpy_base.tools.base import NamedObject -from cvttpy_base.tools.logger import Log -from cvttpy_base.tools.config import CvttAppConfig -from cvttpy_base.settings.cvtt_types import JsonDictT -from pt_strategy.live.live_strategy import PtLiveStrategy -from pt_strategy.live.pricer_md_client import PtMktDataClient -from pt_strategy.live.ti_sender import TradingInstructionsSender # from cvtt_client.mkt_data import (CvttPricerWebSockClient, # CvttPricesSubscription, MessageTypeT, diff --git a/lib/cvtt_client/mkt_data.py b/lib/cvtt_client/mkt_data.py index 53284f2..65989fc 100644 --- a/lib/cvtt_client/mkt_data.py +++ b/lib/cvtt_client/mkt_data.py @@ -1,21 +1,17 @@ #!/usr/bin/env python3 -import argparse -from ast import Sub import asyncio -from functools import partial import json -import logging import uuid from dataclasses import dataclass -from typing import Callable, Coroutine, Dict, List, Optional +from functools import partial +from typing import Callable, Coroutine, Dict, Optional import websockets +from cvttpy_tools.settings.cvtt_types import JsonDictT +from cvttpy_tools.tools.logger import Log from websockets.asyncio.client import ClientConnection -from cvttpy_base.settings.cvtt_types import JsonDictT -from cvttpy_base.tools.logger import Log - MessageTypeT = str SubscriptionIdT = str MessageT = Dict diff --git a/lib/pt_strategy/live/live_strategy.py b/lib/pt_strategy/live/live_strategy.py index a20ea47..d438072 100644 --- a/lib/pt_strategy/live/live_strategy.py +++ b/lib/pt_strategy/live/live_strategy.py @@ -1,14 +1,12 @@ from __future__ import annotations from dataclasses import dataclass -from functools import partial from typing import Any, Dict, List, Optional import pandas as pd -from cvttpy_base.settings.cvtt_types import JsonDictT -from cvttpy_base.tools.base import NamedObject -from cvttpy_base.tools.logger import Log - +from cvttpy_tools.settings.cvtt_types import JsonDictT +from cvttpy_tools.tools.base import NamedObject +from cvttpy_tools.tools.logger import Log from pt_strategy.live.ti_sender import TradingInstructionsSender from pt_strategy.model_data_policy import ModelDataPolicy from pt_strategy.pt_market_data import RealTimeMarketData diff --git a/lib/pt_strategy/live/pricer_md_client.py b/lib/pt_strategy/live/pricer_md_client.py index 3a853a9..e5082c0 100644 --- a/lib/pt_strategy/live/pricer_md_client.py +++ b/lib/pt_strategy/live/pricer_md_client.py @@ -1,21 +1,16 @@ from __future__ import annotations from functools import partial -from typing import Any, Dict, List, Optional +from typing import Dict, List -import pandas as pd -from cvttpy_base.tools.app import App -from cvttpy_base.tools.config import Config -from cvttpy_base.settings.cvtt_types import JsonDictT -from cvttpy_base.tools.base import NamedObject -from cvttpy_base.tools.logger import Log - -from cvtt_client.mkt_data import ( - CvttPricerWebSockClient, - CvttPricesSubscription, - MessageTypeT, - SubscriptionIdT, -) +from cvtt_client.mkt_data import (CvttPricerWebSockClient, + CvttPricesSubscription, MessageTypeT, + SubscriptionIdT) +from cvttpy_tools.settings.cvtt_types import JsonDictT +from cvttpy_tools.tools.app import App +from cvttpy_tools.tools.base import NamedObject +from cvttpy_tools.tools.config import Config +from cvttpy_tools.tools.logger import Log from pt_strategy.live.live_strategy import PtLiveStrategy from pt_strategy.trading_pair import TradingPair diff --git a/lib/pt_strategy/live/ti_sender.py b/lib/pt_strategy/live/ti_sender.py index 2435c21..9d290d8 100644 --- a/lib/pt_strategy/live/ti_sender.py +++ b/lib/pt_strategy/live/ti_sender.py @@ -1,14 +1,15 @@ -from enum import Enum -from typing import Dict, Any, Tuple import time +from enum import Enum +from typing import Tuple + # import aiohttp -from cvttpy_base.tools.app import App -from cvttpy_base.tools.base import NamedObject -from cvttpy_base.tools.config import Config -from cvttpy_base.tools.logger import Log -from cvttpy_base.tools.web.rest_client import REST_RequestProcessor -from cvttpy_base.tools.timeutils import NanoPerSec -from cvttpy_base.tools.timer import Timer +from cvttpy_tools.tools.app import App +from cvttpy_tools.tools.base import NamedObject +from cvttpy_tools.tools.config import Config +from cvttpy_tools.tools.logger import Log +from cvttpy_tools.tools.timer import Timer +from cvttpy_tools.tools.timeutils import NanoPerSec +from cvttpy_tools.tools.web.rest_client import REST_RequestProcessor class TradingInstructionsSender(NamedObject): diff --git a/lib/pt_strategy/models.py b/lib/pt_strategy/models.py index df60d1f..de343ca 100644 --- a/lib/pt_strategy/models.py +++ b/lib/pt_strategy/models.py @@ -11,7 +11,7 @@ from pt_strategy.trading_pair import TradingPair class OLSModel(PairsTradingModel): - zscore_model_: Optional[sm.regression.linear_model.RegressionResultsWrapper] + model_: Optional[sm.regression.linear_model.RegressionResultsWrapper] pair_predict_result_: Optional[pd.DataFrame] zscore_df_: Optional[pd.DataFrame] @@ -42,11 +42,13 @@ class OLSModel(PairsTradingModel): ) X = sm.add_constant(symbol_b_px_series) - self.zscore_model_ = sm.OLS(symbol_a_px_series, X).fit() - assert self.zscore_model_ is not None - hedge_ratio = self.zscore_model_.params.iloc[1] + self.model_ = sm.OLS(symbol_a_px_series, X).fit() + assert self.model_ is not None - spread = symbol_a_px_series - hedge_ratio * symbol_b_px_series + # alternate way would be to use models residuals (will give identical results) + # alpha, beta = self.model_.params + # spread = symbol_a_px_series - (alpha + beta * symbol_b_px_series) + spread = self.model_.resid return pd.DataFrame((spread - spread.mean()) / spread.std()) diff --git a/lib/pt_strategy/pt_market_data.py b/lib/pt_strategy/pt_market_data.py index 1b3da1c..84a8a9f 100644 --- a/lib/pt_strategy/pt_market_data.py +++ b/lib/pt_strategy/pt_market_data.py @@ -1,12 +1,11 @@ from __future__ import annotations from typing import Any, Dict, List, Optional + import pandas as pd - -from cvttpy_base.settings.cvtt_types import JsonDictT - +from cvttpy_tools.settings.cvtt_types import JsonDictT from tools.data_loader import load_market_data -from pt_strategy.trading_pair import TradingPair + class PtMarketData(): config_: Dict[str, Any]