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.
Files changed (61) hide show
  1. {dtscore-2.7.0/src/dtscore.egg-info → dtscore-2.7.2}/PKG-INFO +1 -1
  2. {dtscore-2.7.0 → dtscore-2.7.2}/pyproject.toml +1 -1
  3. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/hxloader/indicators.py +34 -21
  4. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/hxloader/loader.py +4 -4
  5. {dtscore-2.7.0 → dtscore-2.7.2/src/dtscore.egg-info}/PKG-INFO +1 -1
  6. {dtscore-2.7.0 → dtscore-2.7.2}/tests/test_hxl.py +5 -9
  7. {dtscore-2.7.0 → dtscore-2.7.2}/LICENSE +0 -0
  8. {dtscore-2.7.0 → dtscore-2.7.2}/README.md +0 -0
  9. {dtscore-2.7.0 → dtscore-2.7.2}/setup.cfg +0 -0
  10. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/__init__.py +0 -0
  11. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/consoleutils.py +0 -0
  12. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/csvnames.py +0 -0
  13. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/dataframenames.py +0 -0
  14. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/domain.py +0 -0
  15. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/events.py +0 -0
  16. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/fileutils.py +0 -0
  17. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/globals.py +0 -0
  18. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/hxloader/__init__.py +0 -0
  19. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/__init__.py +0 -0
  20. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/account_summary_tags.py +0 -0
  21. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/client.py +0 -0
  22. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/comm.py +0 -0
  23. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/commission_report.py +0 -0
  24. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/common.py +0 -0
  25. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/connection.py +0 -0
  26. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/const.py +0 -0
  27. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/contract.py +0 -0
  28. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/decoder.py +0 -0
  29. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/enum_implem.py +0 -0
  30. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/errors.py +0 -0
  31. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/execution.py +0 -0
  32. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/ineligibility_reason.py +0 -0
  33. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/message.py +0 -0
  34. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/news.py +0 -0
  35. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/object_implem.py +0 -0
  36. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order.py +0 -0
  37. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order_cancel.py +0 -0
  38. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order_condition.py +0 -0
  39. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/order_state.py +0 -0
  40. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/orderdecoder.py +0 -0
  41. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/reader.py +0 -0
  42. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/scanner.py +0 -0
  43. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/server_versions.py +0 -0
  44. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/softdollartier.py +0 -0
  45. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/tag_value.py +0 -0
  46. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/ticktype.py +0 -0
  47. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/utils.py +0 -0
  48. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/ibapi/wrapper.py +0 -0
  49. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/logging.py +0 -0
  50. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/queuemanager.py +0 -0
  51. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/schema_enums.py +0 -0
  52. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/tiingo.py +0 -0
  53. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/tws.py +0 -0
  54. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore/utils.py +0 -0
  55. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/SOURCES.txt +0 -0
  56. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/dependency_links.txt +0 -0
  57. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/requires.txt +0 -0
  58. {dtscore-2.7.0 → dtscore-2.7.2}/src/dtscore.egg-info/top_level.txt +0 -0
  59. {dtscore-2.7.0 → dtscore-2.7.2}/tests/test.py +0 -0
  60. {dtscore-2.7.0 → dtscore-2.7.2}/tests/test2.py +0 -0
  61. {dtscore-2.7.0 → dtscore-2.7.2}/tests/test_ib.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dtscore
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: DTS Core Services
5
5
  Author-email: "D. Smith" <dgsmith.hpot@gmail.com>
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dtscore"
7
- version = "2.7.0"
7
+ version = "2.7.2"
8
8
  authors = [
9
9
  { name="D. Smith", email="dgsmith.hpot@gmail.com" },
10
10
  ]
@@ -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=50, candle_part:si.CandlePart=si.CandlePart.CLOSE, roundto:int=DEFAULT_ROUNDTO, drop_nans:bool=DEFAULT_DROP_NANS) -> pd.DataFrame:
56
- smas = si.indicators.sma.get_sma(_to_quotes(df), lookback_periods=lookback_periods, candle_part=candle_part)
57
- for m in smas: m.sma = _roundif_float(m.sma, roundto)
58
- df_result = pd.DataFrame([[ma.date.date(), ma.sma] for ma in smas], columns=['Date',f'SMA_{lookback_periods}'])
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=5, candle_part:si.CandlePart=si.CandlePart.CLOSE, roundto:int=DEFAULT_ROUNDTO, drop_nans:bool=DEFAULT_DROP_NANS) -> pd.DataFrame:
62
- emas = si.indicators.get_ema(_to_quotes(df), lookback_periods=lookback_periods, candle_part=candle_part)
63
- for e in emas: e.ema = _roundif_float(e.ema, roundto)
64
- df_result = pd.DataFrame([[ea.date.date(), ea.ema] for ea in emas], columns=['Date', f'EMA_{lookback_periods}'])
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, roundto:int=DEFAULT_ROUNDTO, drop_nans:bool=DEFAULT_DROP_NANS) -> pd.DataFrame:
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=50, candle_part:ind.CandlePart=ind.CandlePart.CLOSE,
114
- roundto:int=ind.DEFAULT_ROUNDTO, drop_nans:bool=ind.DEFAULT_DROP_NANS,) -> type[Self]:
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=50, candle_part:ind.CandlePart=ind.CandlePart.CLOSE,
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dtscore
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: DTS Core Services
5
5
  Author-email: "D. Smith" <dgsmith.hpot@gmail.com>
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -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
- # stats = ['OBV','MACD','ADX','ADLINE','RSI','SMA_50_200']
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
- {'Date':'Date', 'adjOpen':'Open', 'adjHigh':'High', 'adjLow':'Low', 'adjClose':'Close', 'adjVolume':'Volume'})
22
- .add_sma(50,drop_nans=False) \
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