This commit is contained in:
Oleg Sheynin 2025-06-24 12:36:03 -04:00
parent 6cd82b3621
commit 50435f8b3b
5 changed files with 484 additions and 168 deletions

View File

@ -2,7 +2,7 @@
"security_type": "EQUITY", "security_type": "EQUITY",
"data_directory": "./data/equity", "data_directory": "./data/equity",
"datafiles": [ "datafiles": [
"202505*.alpaca_sim_md.db", "202506*.mktdata.ohlcv.db",
], ],
"db_table_name": "md_1min_bars", "db_table_name": "md_1min_bars",
"exchange_id": "ALPACA", "exchange_id": "ALPACA",
@ -19,8 +19,8 @@
"dis-equilibrium_close_trshld": 1.0, "dis-equilibrium_close_trshld": 1.0,
"training_minutes": 120, "training_minutes": 120,
"funding_per_pair": 2000.0, "funding_per_pair": 2000.0,
# "strategy_class": "strategies.StaticFitStrategy" "strategy_class": "strategies.StaticFitStrategy"
"strategy_class": "strategies.SlidingFitStrategy" # "strategy_class": "strategies.SlidingFitStrategy"
"exclude_instruments": ["CAN"] "exclude_instruments": ["CAN"]
} }

View File

@ -25,6 +25,7 @@ httplib2>=0.20.2
idna>=3.3 idna>=3.3
ifaddr>=0.1.7 ifaddr>=0.1.7
IMDbPY>=2021.4.18 IMDbPY>=2021.4.18
ipykernel>=6.29.5
jeepney>=0.7.1 jeepney>=0.7.1
jsonschema>=3.2.0 jsonschema>=3.2.0
keyring>=23.5.0 keyring>=23.5.0
@ -35,6 +36,7 @@ lxml>=4.8.0
Mako>=1.1.3 Mako>=1.1.3
Markdown>=3.3.6 Markdown>=3.3.6
MarkupSafe>=2.0.1 MarkupSafe>=2.0.1
matplotlib>=3.10.3
more-itertools>=8.10.0 more-itertools>=8.10.0
multidict>=6.0.4 multidict>=6.0.4
mypy>=0.942 mypy>=0.942
@ -64,6 +66,7 @@ PyYAML>=6.0
reportlab>=3.6.8 reportlab>=3.6.8
requests>=2.25.1 requests>=2.25.1
requests-file>=1.5.1 requests-file>=1.5.1
seaborn>=0.13.2
SecretStorage>=3.3.1 SecretStorage>=3.3.1
setproctitle>=1.2.2 setproctitle>=1.2.2
six>=1.16.0 six>=1.16.0

30
scripts/load_equity_1min.sh Executable file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env bash
usage() {
echo "Usage: $0 [DatePattern]"
echo "DatePattern: YYYYMM or YYYYM or YYYYMMD"
exit 1
}
DatePattern="${1}"
if [ -z "${DatePattern}" ]; then
usage
fi
FilePattern="${DatePattern}*.alpaca_sim_md.db.gz"
pushd ./data/equity
Cmd="rsync -ahvv cvtt@hs01.cvtt.vpn:/works/cvtt/md_archive/equity/alpaca_md/sim/${FilePattern} ./"
echo ${Cmd}
eval ${Cmd}
# -------------------------------------
for srcfname in $(ls *.db.gz); do
dt="${srcfname:0:8}"
tgtfile=${dt}.mktdata.ohlcv.db
echo "${srcfname} -> ${tgtfile}"
gunzip -c $srcfname > temp.db
rm -f ${tgtfile} && sqlite3 temp.db ".dump md_1min_bars" | sqlite3 ${tgtfile} && rm ${srcfname}
done
rm temp.db
popd

File diff suppressed because one or more lines are too long

View File

@ -93,15 +93,30 @@ class TradingPair:
# print(f"{self}: {self.vecm_fit_.summary()}") # print(f"{self}: {self.vecm_fit_.summary()}")
pass pass
def check_cointegration(self): def check_cointegration_johansen(self):
from statsmodels.tsa.vector_ar.vecm import coint_johansen from statsmodels.tsa.vector_ar.vecm import coint_johansen
df = self.training_df_[self.colnames()].reset_index(drop=True) df = self.training_df_[self.colnames()].reset_index(drop=True)
result = coint_johansen(df, det_order=0, k_ar_diff=1) result = coint_johansen(df, det_order=0, k_ar_diff=1)
# print(f"{self}: lr1={result.lr1[0]} cvt={result.cvt[0, 1]}.") print(f"{self}: lr1={result.lr1[0]} cvt={result.cvt[0, 1]}.")
is_cointegrated = result.lr1[0] > result.cvt[0, 1] is_cointegrated = result.lr1[0] > result.cvt[0, 1]
return is_cointegrated return is_cointegrated
def check_cointegration(self):
from statsmodels.tsa.stattools import coint
col1, col2 = self.colnames()
series1 = self.training_df_[col1].reset_index(drop=True)
series2 = self.training_df_[col2].reset_index(drop=True)
# Run Engle-Granger cointegration test
pvalue = coint(series1, series2)[1]
# Define cointegration if p-value < 0.05 (i.e., reject null of no cointegration)
is_cointegrated = pvalue < 0.05
print(f"{self}: is_cointegrated={is_cointegrated} pvalue={pvalue}")
return is_cointegrated
def train_pair(self) -> bool: def train_pair(self) -> bool:
is_cointegrated = self.check_cointegration() is_cointegrated = self.check_cointegration()
if not is_cointegrated: if not is_cointegrated: