openseries 0.12.6__py3-none-any.whl → 0.12.8__py3-none-any.whl

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.
openseries/frame.py CHANGED
@@ -13,7 +13,7 @@ from string import ascii_letters
13
13
  from typing import cast, Dict, List, Tuple, Union
14
14
  from dateutil.relativedelta import relativedelta
15
15
  from ffn.core import calc_mean_var_weights, calc_inv_vol_weights, calc_erc_weights
16
- from numpy import cov, cumprod, log, sqrt, square, zeros
16
+ from numpy import cov, cumprod, log, sqrt
17
17
  from pandas import (
18
18
  concat,
19
19
  DataFrame,
@@ -34,7 +34,7 @@ import statsmodels.api as sm
34
34
  # noinspection PyProtectedMember
35
35
  from statsmodels.regression.linear_model import RegressionResults
36
36
 
37
- from openseries.series import OpenTimeSeries, ValueType
37
+ from openseries.series import OpenTimeSeries, ValueType, ewma_calc
38
38
  from openseries.datefixer import date_offset_foll, holiday_calendar
39
39
  from openseries.load_plotly import load_plotly_dict
40
40
  from openseries.types import (
@@ -92,7 +92,9 @@ class OpenFrame(BaseModel):
92
92
  validate_assignment = True
93
93
 
94
94
  @validator("constituents")
95
- def check_labels_unique(cls, tseries: List[OpenTimeSeries]) -> List[OpenTimeSeries]:
95
+ def check_labels_unique(
96
+ cls, tseries: List[OpenTimeSeries]
97
+ ) -> List[OpenTimeSeries]:
96
98
  """Pydantic validator ensuring that OpenFrame labels are unique"""
97
99
  labls = [x.label for x in tseries]
98
100
  if len(set(labls)) != len(labls):
@@ -703,7 +705,9 @@ class OpenFrame(BaseModel):
703
705
  )
704
706
  time_factor = how_many / fraction
705
707
  return Series(
706
- data=self.tsdf.loc[cast(int, earlier) : cast(int, later)].pct_change().std()
708
+ data=self.tsdf.loc[cast(int, earlier) : cast(int, later)]
709
+ .pct_change()
710
+ .std()
707
711
  * sqrt(time_factor),
708
712
  name="Subset Volatility",
709
713
  dtype="float64",
@@ -1729,7 +1733,9 @@ class OpenFrame(BaseModel):
1729
1733
  - self.tsdf.loc[cast(int, earlier) : cast(int, later)]
1730
1734
  .pct_change()
1731
1735
  .sum()
1732
- / len(self.tsdf.loc[cast(int, earlier) : cast(int, later)].pct_change())
1736
+ / len(
1737
+ self.tsdf.loc[cast(int, earlier) : cast(int, later)].pct_change()
1738
+ )
1733
1739
  )
1734
1740
  else:
1735
1741
  imp_vol = (
@@ -1900,7 +1906,9 @@ class OpenFrame(BaseModel):
1900
1906
  for xerie in self.constituents:
1901
1907
  xerie.tsdf.index = DatetimeIndex(xerie.tsdf.index)
1902
1908
  xerie.tsdf = xerie.tsdf.resample(freq).last()
1903
- xerie.tsdf.index = [dejt.date() for dejt in DatetimeIndex(xerie.tsdf.index)]
1909
+ xerie.tsdf.index = [
1910
+ dejt.date() for dejt in DatetimeIndex(xerie.tsdf.index)
1911
+ ]
1904
1912
 
1905
1913
  return self
1906
1914
 
@@ -2059,9 +2067,6 @@ class OpenFrame(BaseModel):
2059
2067
  time_factor = how_many / fraction
2060
2068
  else:
2061
2069
  time_factor = periods_in_a_year_fixed
2062
- how_many = (
2063
- self.tsdf.loc[cast(int, earlier) : cast(int, later)].count().iloc[0]
2064
- )
2065
2070
 
2066
2071
  corr_label = (
2067
2072
  self.tsdf.iloc[:, first_column].name[0]
@@ -2076,54 +2081,62 @@ class OpenFrame(BaseModel):
2076
2081
  data = self.tsdf.loc[cast(int, earlier) : cast(int, later)].copy()
2077
2082
 
2078
2083
  for rtn in cols:
2079
- data[rtn, "Returns"] = data.loc[:, (rtn, ValueType.PRICE)].apply(log).diff()
2080
- data[rtn, ValueType.EWMA] = zeros(how_many)
2081
- data.loc[:, (rtn, ValueType.EWMA)].iloc[0] = data.loc[
2082
- :, (rtn, "Returns")
2083
- ].iloc[1:day_chunk].std(ddof=dlta_degr_freedms) * sqrt(time_factor)
2084
-
2085
- data["Cov", ValueType.EWMA] = zeros(how_many)
2086
- data[corr_label, ValueType.EWMA] = zeros(how_many)
2087
- data.loc[:, ("Cov", ValueType.EWMA)].iloc[0] = cov(
2088
- m=data.loc[:, (cols[0], "Returns")].iloc[1:day_chunk].to_numpy(),
2089
- y=data.loc[:, (cols[1], "Returns")].iloc[1:day_chunk].to_numpy(),
2090
- ddof=dlta_degr_freedms,
2091
- )[0][1]
2092
- data.loc[:, (corr_label, ValueType.EWMA)].iloc[0] = data.loc[
2093
- :, ("Cov", ValueType.EWMA)
2094
- ].iloc[0] / (
2095
- 2
2096
- * data.loc[:, (cols[0], ValueType.EWMA)].iloc[0]
2097
- * data.loc[:, (cols[1], ValueType.EWMA)].iloc[0]
2098
- )
2084
+ data[rtn, "Returns"] = (
2085
+ data.loc[:, (rtn, ValueType.PRICE)].apply(log).diff()
2086
+ )
2099
2087
 
2100
- prev = data.loc[self.first_idx]
2101
- for indx, row in data.iloc[1:].iterrows():
2102
- row.loc[cols, ValueType.EWMA] = sqrt(
2103
- square(row.loc[cols, "Returns"].to_numpy()) * time_factor * (1 - lmbda)
2104
- + square(prev.loc[cols, ValueType.EWMA].to_numpy()) * lmbda
2088
+ raw_one = [
2089
+ data.loc[:, (cols[0], "Returns")]
2090
+ .iloc[1:day_chunk]
2091
+ .std(ddof=dlta_degr_freedms)
2092
+ * sqrt(time_factor)
2093
+ ]
2094
+ raw_two = [
2095
+ data.loc[:, (cols[1], "Returns")]
2096
+ .iloc[1:day_chunk]
2097
+ .std(ddof=dlta_degr_freedms)
2098
+ * sqrt(time_factor)
2099
+ ]
2100
+ raw_cov = [
2101
+ cov(
2102
+ m=data.loc[:, (cols[0], "Returns")].iloc[1:day_chunk].to_numpy(),
2103
+ y=data.loc[:, (cols[1], "Returns")].iloc[1:day_chunk].to_numpy(),
2104
+ ddof=dlta_degr_freedms,
2105
+ )[0][1]
2106
+ ]
2107
+ raw_corr = [raw_cov[0] / (2 * raw_one[0] * raw_two[0])]
2108
+
2109
+ for _, row in data.iloc[1:].iterrows():
2110
+ tmp_raw_one = ewma_calc(
2111
+ reeturn=row.loc[cols[0], "Returns"],
2112
+ prev_ewma=raw_one[-1],
2113
+ time_factor=time_factor,
2114
+ lmbda=lmbda,
2115
+ )
2116
+ tmp_raw_two = ewma_calc(
2117
+ reeturn=row.loc[cols[1], "Returns"],
2118
+ prev_ewma=raw_two[-1],
2119
+ time_factor=time_factor,
2120
+ lmbda=lmbda,
2105
2121
  )
2106
- data.loc[indx, (cols, ValueType.EWMA)] = row.loc[cols, ValueType.EWMA]
2107
- row.loc["Cov", ValueType.EWMA] = (
2122
+ tmp_raw_cov = (
2108
2123
  row.loc[cols[0], "Returns"]
2109
2124
  * row.loc[cols[1], "Returns"]
2110
2125
  * time_factor
2111
2126
  * (1 - lmbda)
2112
- + prev.loc["Cov", ValueType.EWMA] * lmbda
2113
- )
2114
- data.loc[indx, ("Cov", ValueType.EWMA)] = row.loc["Cov", ValueType.EWMA]
2115
- row.loc[corr_label, ValueType.EWMA] = row.loc["Cov", ValueType.EWMA] / (
2116
- 2 * row.loc[cols[0], ValueType.EWMA] * row.loc[cols[1], ValueType.EWMA]
2127
+ + raw_cov[-1] * lmbda
2117
2128
  )
2118
- data.loc[indx, (corr_label, ValueType.EWMA)] = row.loc[
2119
- corr_label, ValueType.EWMA
2120
- ]
2121
- prev = row.copy()
2122
-
2123
- ewma_df = data.loc[:, (cols + [corr_label], ValueType.EWMA)]
2124
- ewma_df.columns = ewma_df.columns.droplevel(level=1)
2125
-
2126
- return ewma_df
2129
+ tmp_raw_corr = tmp_raw_cov / (2 * tmp_raw_one * tmp_raw_two)
2130
+ raw_one.append(tmp_raw_one)
2131
+ raw_two.append(tmp_raw_two)
2132
+ raw_cov.append(tmp_raw_cov)
2133
+ raw_corr.append(tmp_raw_corr)
2134
+
2135
+ return DataFrame(
2136
+ index=cols + [corr_label],
2137
+ columns=data.index,
2138
+ data=[raw_one, raw_two, raw_corr],
2139
+ ).T
2127
2140
 
2128
2141
  def rolling_vol(
2129
2142
  self: "OpenFrame",
@@ -2694,7 +2707,9 @@ class OpenFrame(BaseModel):
2694
2707
  .add(1)
2695
2708
  .values
2696
2709
  )
2697
- up_return = uparray.prod() ** (1 / (len(uparray) / time_factor)) - 1
2710
+ up_return = (
2711
+ uparray.prod() ** (1 / (len(uparray) / time_factor)) - 1
2712
+ )
2698
2713
  upidxarray = (
2699
2714
  shortdf.pct_change()[shortdf.pct_change().values > 0.0]
2700
2715
  .add(1)
@@ -2729,7 +2744,9 @@ class OpenFrame(BaseModel):
2729
2744
  .add(1)
2730
2745
  .values
2731
2746
  )
2732
- up_return = uparray.prod() ** (1 / (len(uparray) / time_factor)) - 1
2747
+ up_return = (
2748
+ uparray.prod() ** (1 / (len(uparray) / time_factor)) - 1
2749
+ )
2733
2750
  upidxarray = (
2734
2751
  shortdf.pct_change()[shortdf.pct_change().values > 0.0]
2735
2752
  .add(1)
@@ -2815,7 +2832,9 @@ class OpenFrame(BaseModel):
2815
2832
  )
2816
2833
  else:
2817
2834
  if isinstance(asset, tuple):
2818
- y_value = log(self.tsdf.loc[:, asset] / self.tsdf.loc[:, asset].iloc[0])
2835
+ y_value = log(
2836
+ self.tsdf.loc[:, asset] / self.tsdf.loc[:, asset].iloc[0]
2837
+ )
2819
2838
  elif isinstance(asset, int):
2820
2839
  y_value = log(self.tsdf.iloc[:, asset] / self.tsdf.iloc[0, asset])
2821
2840
  else:
@@ -2999,8 +3018,8 @@ class OpenFrame(BaseModel):
2999
3018
  observations: int = 21,
3000
3019
  periods_in_a_year_fixed: int | None = None,
3001
3020
  ) -> DataFrame:
3002
- """The Information Ratio equals ( fund return less index return ) divided by the
3003
- Tracking Error. And the Tracking Error is the standard deviation of the
3021
+ """The Information Ratio equals ( fund return less index return ) divided by
3022
+ the Tracking Error. And the Tracking Error is the standard deviation of the
3004
3023
  difference between the fund and its index returns.
3005
3024
 
3006
3025
  Parameters
openseries/series.py CHANGED
@@ -20,7 +20,6 @@ from numpy import (
20
20
  ndarray,
21
21
  sqrt,
22
22
  square,
23
- zeros,
24
23
  )
25
24
  from dateutil.relativedelta import relativedelta
26
25
  from pandas import (
@@ -86,6 +85,33 @@ def check_if_none(item: Any) -> bool:
86
85
  return len(str(item)) == 0
87
86
 
88
87
 
88
+ def ewma_calc(
89
+ reeturn: float, prev_ewma: float, time_factor: float, lmbda: float = 0.94
90
+ ) -> float:
91
+ """Helper function for EWMA calculation
92
+
93
+ Parameters
94
+ ----------
95
+ reeturn : float
96
+ Return value
97
+ prev_ewma : float
98
+ Previous EWMA volatility value
99
+ time_factor : float
100
+ Scaling factor to annualize
101
+ lmbda: float, default: 0.94
102
+ Scaling factor to determine weighting.
103
+
104
+ Returns
105
+ -------
106
+ float
107
+ EWMA volatility value
108
+ """
109
+ return cast(
110
+ float,
111
+ sqrt(square(reeturn) * time_factor * (1 - lmbda) + square(prev_ewma) * lmbda),
112
+ )
113
+
114
+
89
115
  class ValueType(str, Enum):
90
116
  """Class defining the different timeseries types within the project"""
91
117
 
@@ -287,7 +313,9 @@ class OpenTimeSeries(BaseModel):
287
313
  dframe.columns.get_level_values(1).values[column_nmbr]
288
314
  ):
289
315
  valuetype = ValueType.PRICE
290
- print(f"valuetype missing. Adding '{valuetype.value}' as valuetype")
316
+ print(
317
+ f"valuetype missing. Adding '{valuetype.value}' as valuetype"
318
+ )
291
319
  else:
292
320
  valuetype = dframe.columns.get_level_values(1).values[column_nmbr]
293
321
  else:
@@ -324,7 +352,7 @@ class OpenTimeSeries(BaseModel):
324
352
  baseccy: str = "SEK",
325
353
  local_ccy: bool = True,
326
354
  ) -> "OpenTimeSeries":
327
- """Creates a timeseries from a series of values accruing with a given fixed rate
355
+ """Creates a timeseries from values accruing with a given fixed rate return
328
356
 
329
357
  Providing a date_range of type Pandas DatetimeIndex takes priority over
330
358
  providing a combination of days and an end date.
@@ -360,7 +388,9 @@ class OpenTimeSeries(BaseModel):
360
388
  [d.date() for d in date_range(periods=days, end=end_dt, freq="D")]
361
389
  )
362
390
  elif not isinstance(d_range, DatetimeIndex) and not all([days, end_dt]):
363
- raise ValueError("If d_range is not provided both days and end_dt must be.")
391
+ raise ValueError(
392
+ "If d_range is not provided both days and end_dt must be."
393
+ )
364
394
 
365
395
  deltas = array(
366
396
  [
@@ -694,7 +724,9 @@ class OpenTimeSeries(BaseModel):
694
724
 
695
725
  if (
696
726
  self.tsdf.loc[earlier, self.tsdf.columns.values[0]] == 0.0
697
- or self.tsdf.loc[cast(int, earlier) : cast(int, later)].lt(0.0).values.any()
727
+ or self.tsdf.loc[cast(int, earlier) : cast(int, later)]
728
+ .lt(0.0)
729
+ .values.any()
698
730
  ):
699
731
  raise ValueError(
700
732
  "Geometric return cannot be calculated due to an initial "
@@ -763,7 +795,9 @@ class OpenTimeSeries(BaseModel):
763
795
  return cast(
764
796
  float,
765
797
  (
766
- self.tsdf.loc[cast(int, earlier) : cast(int, later)].pct_change().mean()
798
+ self.tsdf.loc[cast(int, earlier) : cast(int, later)]
799
+ .pct_change()
800
+ .mean()
767
801
  * time_factor
768
802
  ).iloc[0],
769
803
  )
@@ -855,7 +889,8 @@ class OpenTimeSeries(BaseModel):
855
889
  """
856
890
 
857
891
  return cast(
858
- float, (self.tsdf.pct_change().std() * sqrt(self.periods_in_a_year)).iloc[0]
892
+ float,
893
+ (self.tsdf.pct_change().std() * sqrt(self.periods_in_a_year)).iloc[0],
859
894
  )
860
895
 
861
896
  def vol_func(
@@ -2004,21 +2039,26 @@ class OpenTimeSeries(BaseModel):
2004
2039
  data[self.label, "Returns"] = (
2005
2040
  data.loc[:, self.tsdf.columns.values[0]].apply(log).diff()
2006
2041
  )
2007
- data[self.label, ValueType.EWMA] = zeros(data.iloc[:, 0].count())
2008
- data.loc[:, (self.label, ValueType.EWMA)].iloc[0] = data.loc[
2009
- :, (self.label, "Returns")
2010
- ].iloc[1:day_chunk].std(ddof=dlta_degr_freedms) * sqrt(time_factor)
2011
-
2012
- prev = data.loc[self.first_idx]
2013
- for indx, row in data.iloc[1:].iterrows():
2014
- row.loc[self.label, ValueType.EWMA] = sqrt(
2015
- square(row.loc[self.label, "Returns"]) * time_factor * (1 - lmbda)
2016
- + square(prev.loc[self.label, ValueType.EWMA]) * lmbda
2042
+
2043
+ rawdata = [
2044
+ data.loc[:, (self.label, "Returns")]
2045
+ .iloc[1:day_chunk]
2046
+ .std(ddof=dlta_degr_freedms)
2047
+ * sqrt(time_factor)
2048
+ ]
2049
+
2050
+ for item in data.loc[:, (self.label, "Returns")].iloc[1:]:
2051
+ previous = rawdata[-1]
2052
+ rawdata.append(
2053
+ ewma_calc(
2054
+ reeturn=item,
2055
+ prev_ewma=previous,
2056
+ time_factor=time_factor,
2057
+ lmbda=lmbda,
2058
+ )
2017
2059
  )
2018
- data.loc[indx, (self.label, ValueType.EWMA)] = row.loc[
2019
- self.label, ValueType.EWMA
2020
- ]
2021
- prev = row.copy()
2060
+
2061
+ data.loc[:, (self.label, ValueType.EWMA)] = rawdata
2022
2062
 
2023
2063
  return data.loc[:, (self.label, ValueType.EWMA)]
2024
2064
 
@@ -2068,7 +2108,9 @@ class OpenTimeSeries(BaseModel):
2068
2108
  """
2069
2109
 
2070
2110
  retdf = (
2071
- self.tsdf.pct_change().rolling(observations, min_periods=observations).sum()
2111
+ self.tsdf.pct_change()
2112
+ .rolling(observations, min_periods=observations)
2113
+ .sum()
2072
2114
  )
2073
2115
  retdf.columns = [[self.label], ["Rolling returns"]]
2074
2116
 
@@ -2256,7 +2298,9 @@ class OpenTimeSeries(BaseModel):
2256
2298
  """
2257
2299
 
2258
2300
  if lvl_zero is None and lvl_one is None:
2259
- self.tsdf.columns = MultiIndex.from_arrays([[self.label], [self.valuetype]])
2301
+ self.tsdf.columns = MultiIndex.from_arrays(
2302
+ [[self.label], [self.valuetype]]
2303
+ )
2260
2304
  elif lvl_zero is not None and lvl_one is None:
2261
2305
  self.tsdf.columns = MultiIndex.from_arrays([[lvl_zero], [self.valuetype]])
2262
2306
  self.label = lvl_zero
openseries/sim_price.py CHANGED
@@ -82,7 +82,9 @@ class ReturnSimulation(BaseModel):
82
82
 
83
83
  return cast(
84
84
  float,
85
- (self.results.pct_change().std() * sqrt(self.trading_days_in_year)).iloc[0],
85
+ (self.results.pct_change().std() * sqrt(self.trading_days_in_year)).iloc[
86
+ 0
87
+ ],
86
88
  )
87
89
 
88
90
  @classmethod
@@ -321,7 +321,11 @@ def cox_ingersoll_ross_heston(
321
321
  brownian_motion_volatility = nrand.normal(
322
322
  loc=0, scale=sqrt_delta_sigma, size=param.all_time
323
323
  )
324
- meanrev_vol, avg_vol, start_vol = param.heston_a, param.heston_mu, param.heston_vol0
324
+ meanrev_vol, avg_vol, start_vol = (
325
+ param.heston_a,
326
+ param.heston_mu,
327
+ param.heston_vol0,
328
+ )
325
329
  volatilities: List[float] = [start_vol]
326
330
  for hpath in range(1, param.all_time):
327
331
  drift = meanrev_vol * (avg_vol - volatilities[-1]) * param.all_delta
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openseries
3
- Version: 0.12.6
3
+ Version: 0.12.8
4
4
  Summary: Package for simple financial time series analysis.
5
5
  Home-page: https://github.com/CaptorAB/OpenSeries
6
6
  License: BSD-3-Clause
@@ -198,6 +198,9 @@ make lint
198
198
 
199
199
  ## Table of Contents
200
200
 
201
+ - [Basic Usage](#basic-usage)
202
+ - [Development Instructions](#development-instructions)
203
+ - [Testing and Linting / Type-checking](#testing-and-linting--type-checking)
201
204
  - [Files / Modules in the project](#files-in-the-project)
202
205
  - [Class methods used to construct an OpenTimeSeries](#class-methods-used-to-construct-an-opentimeseries-object)
203
206
  - [OpenTimeSeries non-numerical properties](#non-numerical-or-helper-properties-that-apply-only-to-the-opentimeseries-class)
@@ -208,8 +211,6 @@ make lint
208
211
  - [Methods for both classes](#methods-that-apply-to-both-the-opentimeseries-and-the-openframe-class)
209
212
  - [Numerical properties for both classes](#numerical-properties-available-for-individual-opentimeseries-or-on-all-series-in-an-openframe)
210
213
  - [Numerical methods with period arguments for both classes](#methods-below-are-identical-to-the-numerical-properties-above)
211
- - [Development Instructions](#development-instructions)
212
- - [Testing and Linting / Type-checking](#testing-and-linting--type-checking)
213
214
 
214
215
  ### Files in the project
215
216
 
@@ -218,9 +219,10 @@ make lint
218
219
  | [series.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/series.py) | Defines the class _OpenTimeSeries_ for managing and analyzing a single timeseries. The module also defines a function `timeseries_chain` that can be used to chain two timeseries objects together. |
219
220
  | [frame.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/frame.py) | Defines the class _OpenFrame_ for managing a group of timeseries, and e.g. calculate a portfolio timeseries from a rebalancing strategy between timeseries. |
220
221
  | [datefixer.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/datefixer.py) | Date utilities. Please read the docstring of each function for its description. |
222
+ | [load_plotly.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/load_plotly.py) | Functions to load [Plotly](https://plotly.com/python/) default layout and configuration from local json file. |
221
223
  | [plotly_layouts.json](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/plotly_layouts.json) | [Plotly](https://plotly.com/python/) defaults used in the `plot_bars` and `plot_series` methods. |
222
224
  | [plotly_captor_logo.json](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/plotly_captor_logo.json) | JSON with a link to the Captor logo used in the `plot_bars` and `plot_series` methods. |
223
- | [risk.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/risk.py) | Methods used to calculate VaR, CVaR and drawdowns. |
225
+ | [risk.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/risk.py) | Functions used to calculate VaR, CVaR and drawdowns. |
224
226
  | [sim_price.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/sim_price.py) | Simulates OpenTimeSeries from different stochastic processes. |
225
227
  | [stoch_processes.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/stoch_processes.py) | Generates stochastic processes used in the `sim_price.py` module. |
226
228
  | [types.py](https://github.com/CaptorAB/OpenSeries/blob/master/openseries/types.py) | Contains all bespoke typing. |
@@ -1,15 +1,15 @@
1
1
  openseries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  openseries/datefixer.py,sha256=h4zshiUkJmRmbBgiCCVulxVUa2SO1dRdJMAKLMxE-tc,9970
3
- openseries/frame.py,sha256=8WBQrGEI0kj4euOFxIFUu6whnuTbZ1KDTsrFVeWdz44,114038
3
+ openseries/frame.py,sha256=wd6DJMJrB9iweDKK_UVxslzXvoZ6oLo-fjkUyv5usCA,113825
4
4
  openseries/load_plotly.py,sha256=DfpacL-aL5z-W0Cw7FL4YtDSbgeSI8Q-8DO6940wiJc,1119
5
5
  openseries/plotly_captor_logo.json,sha256=pGMuPVu4cEO3ZsCH1wU03hxqbIQkHFNoJUs1k1WK89Y,178
6
6
  openseries/plotly_layouts.json,sha256=cRljccbXJYoyUBnl8AYxvHrU1V0lTWbsT8sBkPZdj_g,1349
7
7
  openseries/risk.py,sha256=Zk4rSFQSwa2NZ-FQP0ZWjtljwEbI3iwZiskQs6Gm6HY,4793
8
- openseries/series.py,sha256=qf66j9KJGPrwe6UMlJ6ndE1af2xKvarPWLIif8BR1c4,80586
9
- openseries/sim_price.py,sha256=q9G_RZZlL9ZKEpYpEtKR-_4s9Z4nK56gpDp2Wcw4RVE,13848
10
- openseries/stoch_processes.py,sha256=AxaQjSXeEYNZoUiazBR3FA8AsiBucSLnVDfrQTmv_yc,14640
8
+ openseries/series.py,sha256=k5yVSc4_aC3eoYxDLVBFHtx-nb81NIAhl46cfIcPPpw,81253
9
+ openseries/sim_price.py,sha256=dWzmj22nq4TW4BZBwP8Ajtid_g322No6D_m7t5bT8No,13878
10
+ openseries/stoch_processes.py,sha256=6O4C_nC2iBseWggvDDC2gTpTqS5fI5nfjSRpccaazLE,14673
11
11
  openseries/types.py,sha256=SffsPIrtSD5JZ4mp-d-k2ymf7U0rjnIUxFbKcLhd4Os,6697
12
- openseries-0.12.6.dist-info/LICENSE.md,sha256=NJjeq3wyB7EnnHLmsdK1EK6zT00T1eB3FgAmHAPT_vM,1521
13
- openseries-0.12.6.dist-info/METADATA,sha256=7CXJjwHXDfeJuVG8vL5ym2ECNNIjFzYiOaqd496xuRQ,45698
14
- openseries-0.12.6.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
15
- openseries-0.12.6.dist-info/RECORD,,
12
+ openseries-0.12.8.dist-info/LICENSE.md,sha256=NJjeq3wyB7EnnHLmsdK1EK6zT00T1eB3FgAmHAPT_vM,1521
13
+ openseries-0.12.8.dist-info/METADATA,sha256=6bVVrATsFnH_dTv_JvjiX_hX3m1ZarNN2SPAi8ORzLo,46043
14
+ openseries-0.12.8.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
15
+ openseries-0.12.8.dist-info/RECORD,,