dtscore 2.7.0__tar.gz → 2.7.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dtscore-2.7.0/src/dtscore.egg-info → dtscore-2.7.2}/PKG-INFO +1 -1
- {dtscore-2.7.0 → dtscore-2.7.2}/pyproject.toml +1 -1
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/hxloader/indicators.py +34 -21
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/hxloader/loader.py +4 -4
- {dtscore-2.7.0 → dtscore-2.7.2/src/dtscore.egg-info}/PKG-INFO +1 -1
- {dtscore-2.7.0 → dtscore-2.7.2}/tests/test_hxl.py +5 -9
- {dtscore-2.7.0 → dtscore-2.7.2}/LICENSE +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/README.md +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/setup.cfg +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/__init__.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/consoleutils.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/csvnames.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/dataframenames.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/domain.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/events.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/fileutils.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/globals.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/hxloader/__init__.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/__init__.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/account_summary_tags.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/client.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/comm.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/commission_report.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/common.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/connection.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/const.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/contract.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/decoder.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/enum_implem.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/errors.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/execution.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/ineligibility_reason.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/message.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/news.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/object_implem.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order_cancel.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order_condition.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order_state.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/orderdecoder.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/reader.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/scanner.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/server_versions.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/softdollartier.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/tag_value.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/ticktype.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/utils.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/wrapper.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/logging.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/queuemanager.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/schema_enums.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/tiingo.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/tws.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/utils.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/SOURCES.txt +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/dependency_links.txt +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/requires.txt +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/top_level.txt +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/tests/test.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/tests/test2.py +0 -0
- {dtscore-2.7.0 → dtscore-2.7.2}/tests/test_ib.py +0 -0
|
@@ -52,19 +52,44 @@ def rsi(df:pd.DataFrame, lookback_periods:int=14, roundto:int=DEFAULT_ROUNDTO, d
|
|
|
52
52
|
df_result = pd.DataFrame([[rsi.date.date(), rsi.rsi] for rsi in rsis], columns=['Date','RSI'])
|
|
53
53
|
return _finalize_result(df, df_result, drop_nans)
|
|
54
54
|
|
|
55
|
-
def sma(df:pd.DataFrame, lookback_periods:int=
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
def sma(df:pd.DataFrame, lookback_periods:list[int]|None=None, candle_part:si.CandlePart=si.CandlePart.CLOSE,
|
|
56
|
+
roundto:int=DEFAULT_ROUNDTO, drop_nans:bool=DEFAULT_DROP_NANS) -> pd.DataFrame:
|
|
57
|
+
def _gen_sma(quotes, period:int, candle_part:si.CandlePart, roundto:int) -> pd.DataFrame:
|
|
58
|
+
smas = si.indicators.sma.get_sma(quotes, lookback_periods=period, candle_part=candle_part)
|
|
59
|
+
for m in smas: m.sma = _roundif_float(m.sma, roundto)
|
|
60
|
+
df_result = pd.DataFrame([[ma.date.date(), ma.sma] for ma in smas], columns=['Date',f'SMA_{period}'])
|
|
61
|
+
return df_result
|
|
62
|
+
|
|
63
|
+
if lookback_periods is None: lookback_periods = [50, 200]
|
|
64
|
+
quotes = _to_quotes(df)
|
|
65
|
+
# create a list of sma dataframes
|
|
66
|
+
smas = [
|
|
67
|
+
_gen_sma(quotes=quotes, period=period, candle_part=candle_part, roundto=roundto).set_index("Date")
|
|
68
|
+
for period in lookback_periods
|
|
69
|
+
]
|
|
70
|
+
df_result = pd.concat(smas, axis=1).reset_index()
|
|
59
71
|
return _finalize_result(df, df_result, drop_nans)
|
|
60
72
|
|
|
61
|
-
def ema(df:pd.DataFrame, lookback_periods:int=
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
73
|
+
def ema(df:pd.DataFrame, lookback_periods:list[int]|None=None, candle_part:si.CandlePart=si.CandlePart.CLOSE,
|
|
74
|
+
roundto:int=DEFAULT_ROUNDTO, drop_nans:bool=DEFAULT_DROP_NANS) -> pd.DataFrame:
|
|
75
|
+
# generate ema for a single symbol
|
|
76
|
+
def _gen_ema(quotes:list[si.Quote], period:int, candle_part:si.CandlePart, roundto:int) -> pd.DataFrame:
|
|
77
|
+
emas = si.indicators.ema.get_ema(quotes, lookback_periods=period, candle_part=candle_part)
|
|
78
|
+
for e in emas: e.ema = _roundif_float(e.ema, roundto)
|
|
79
|
+
df_result = pd.DataFrame([[ea.date.date(), ea.ema] for ea in emas], columns=['Date', f'EMA_{period}'])
|
|
80
|
+
return df_result
|
|
81
|
+
|
|
82
|
+
if lookback_periods is None: lookback_periods =[50, 200]
|
|
83
|
+
quotes = _to_quotes(df)
|
|
84
|
+
emas = [
|
|
85
|
+
_gen_ema(quotes=quotes, period=period, candle_part=candle_part, roundto=roundto).set_index('Date')
|
|
86
|
+
for period in lookback_periods
|
|
87
|
+
]
|
|
88
|
+
df_result = pd.concat(emas, axis=1).reset_index()
|
|
65
89
|
return _finalize_result(df, df_result, drop_nans)
|
|
66
90
|
|
|
67
|
-
def bollbands(df:pd.DataFrame, lookback_periods:int=20, standard_deviations:float=2.0,
|
|
91
|
+
def bollbands(df:pd.DataFrame, lookback_periods:int=20, standard_deviations:float=2.0,
|
|
92
|
+
roundto:int=DEFAULT_ROUNDTO, drop_nans:bool=DEFAULT_DROP_NANS) -> pd.DataFrame:
|
|
68
93
|
bbs = si.indicators.get_bollinger_bands(_to_quotes(df), lookback_periods=lookback_periods, standard_deviations=standard_deviations)
|
|
69
94
|
values = [[bb.date, bb.sma, bb.upper_band, bb.lower_band, bb.percent_b, bb.z_score, bb.width] for bb in bbs ]
|
|
70
95
|
values = [ [_roundif_float(v,roundto) for v in item] for item in values ]
|
|
@@ -74,18 +99,6 @@ def bollbands(df:pd.DataFrame, lookback_periods:int=20, standard_deviations:floa
|
|
|
74
99
|
)
|
|
75
100
|
return _finalize_result(df, df_result, drop_nans)
|
|
76
101
|
|
|
77
|
-
def sma_50_200(df:pd.DataFrame, roundto:int=DEFAULT_ROUNDTO, drop_nans:bool=DEFAULT_DROP_NANS) -> pd.DataFrame:
|
|
78
|
-
mas50 = si.indicators.sma.get_sma(_to_quotes(df), 50)
|
|
79
|
-
for m in mas50: m.sma = round(m.sma,roundto) if isinstance(m.sma,float) else m.sma
|
|
80
|
-
mas200 = si.indicators.sma.get_sma(_to_quotes(df), 200)
|
|
81
|
-
for m in mas200: m.sma = round(m.sma,roundto) if isinstance(m.sma,float) else m.sma
|
|
82
|
-
df_sma50 = pd.DataFrame([[ma.date.date(), ma.sma] for ma in mas50], columns=['Date','SMA_50'])
|
|
83
|
-
df_sma50 = df_sma50.set_index('Date')
|
|
84
|
-
df_sma200 = pd.DataFrame([[ma.date.date(), ma.sma] for ma in mas200], columns=['Date','SMA_200'])
|
|
85
|
-
df_sma200 = df_sma200.set_index('Date')
|
|
86
|
-
df_result = pd.concat([df_sma50,df_sma200], axis=1).reset_index()
|
|
87
|
-
return _finalize_result(df, df_result, drop_nans)
|
|
88
|
-
|
|
89
102
|
def _to_quotes(df:pd.DataFrame) -> list[si.Quote]:
|
|
90
103
|
return [
|
|
91
104
|
si.Quote(d,o,h,l,c,v)
|
|
@@ -110,12 +110,12 @@ class HxDataset:
|
|
|
110
110
|
df = ind.rsi(self.data, lookback_periods=lookback_periods, roundto=roundto, drop_nans=drop_nans)
|
|
111
111
|
return HxDataset(symbol=self.symbol, dates=self.dates, data=df)
|
|
112
112
|
|
|
113
|
-
def add_sma(self, lookback_periods:int
|
|
114
|
-
roundto:int=ind.DEFAULT_ROUNDTO, drop_nans:bool=ind.DEFAULT_DROP_NANS
|
|
113
|
+
def add_sma(self, lookback_periods:list[int], candle_part:ind.CandlePart=ind.CandlePart.CLOSE,
|
|
114
|
+
roundto:int=ind.DEFAULT_ROUNDTO, drop_nans:bool=ind.DEFAULT_DROP_NANS) -> type[Self]:
|
|
115
115
|
df = ind.sma(self.data, lookback_periods=lookback_periods, candle_part=candle_part, roundto=roundto, drop_nans=drop_nans)
|
|
116
|
-
return HxDataset(symbol=self.symbol, dates=self.dates, data=df)
|
|
116
|
+
return HxDataset(symbol=self.symbol, dates=self.dates, data=df)
|
|
117
117
|
|
|
118
|
-
def add_ema(self, lookback_periods:int
|
|
118
|
+
def add_ema(self, lookback_periods:list[int], candle_part:ind.CandlePart=ind.CandlePart.CLOSE,
|
|
119
119
|
roundto:int=ind.DEFAULT_ROUNDTO, drop_nans:bool=ind.DEFAULT_DROP_NANS,) -> type[Self]:
|
|
120
120
|
df = ind.ema(self.data, lookback_periods=lookback_periods, candle_part=candle_part, roundto=roundto, drop_nans=drop_nans)
|
|
121
121
|
return HxDataset(symbol=self.symbol, dates=self.dates, data=df)
|
|
@@ -11,17 +11,14 @@ def main():
|
|
|
11
11
|
log.info('*' * 100)
|
|
12
12
|
log.info(f'HxLoader test starting on {dt.datetime.now()}')
|
|
13
13
|
|
|
14
|
-
dates = ldr.rangefrom_enddate(ldr.date_now(), monthsback=36)
|
|
15
14
|
symbols = ['SPY', 'VIXY']
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
dates = ldr.rangefrom_enddate(ldr.date_now(), monthsback=36)
|
|
16
|
+
keep_cols = {'Date':'Date', 'adjOpen':'Open', 'adjHigh':'High', 'adjLow':'Low', 'adjClose':'Close', 'adjVolume':'Volume'}
|
|
18
17
|
data = [
|
|
19
18
|
ldr.HxDataset.download(symbol,dates) \
|
|
20
|
-
.keep_and_rename_cols(
|
|
21
|
-
|
|
22
|
-
.
|
|
23
|
-
.add_sma(200,drop_nans=False) \
|
|
24
|
-
.add_ema(lookback_periods=5,drop_nans=False) \
|
|
19
|
+
.keep_and_rename_cols(keep_cols) \
|
|
20
|
+
.add_sma(lookback_periods=[5,15,50,200], drop_nans=False) \
|
|
21
|
+
.add_ema(lookback_periods=[5,15],drop_nans=False) \
|
|
25
22
|
.add_boll(lookback_periods=5, standard_deviations=2.0) \
|
|
26
23
|
for symbol in symbols
|
|
27
24
|
]
|
|
@@ -35,7 +32,6 @@ def main():
|
|
|
35
32
|
# ]
|
|
36
33
|
|
|
37
34
|
hxd = data[0]
|
|
38
|
-
npy = hxd.to_numpy()
|
|
39
35
|
selected = hxd[['Date', 'Close',]]
|
|
40
36
|
selected_2 = hxd.select_cols(['Date', 'Close',])
|
|
41
37
|
print(selected.data)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|