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 +74 -55
- openseries/series.py +67 -23
- openseries/sim_price.py +3 -1
- openseries/stoch_processes.py +5 -1
- {openseries-0.12.6.dist-info → openseries-0.12.8.dist-info}/METADATA +6 -4
- {openseries-0.12.6.dist-info → openseries-0.12.8.dist-info}/RECORD +8 -8
- {openseries-0.12.6.dist-info → openseries-0.12.8.dist-info}/LICENSE.md +0 -0
- {openseries-0.12.6.dist-info → openseries-0.12.8.dist-info}/WHEEL +0 -0
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
|
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(
|
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)]
|
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(
|
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 = [
|
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"] =
|
2080
|
-
|
2081
|
-
|
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
|
-
|
2101
|
-
|
2102
|
-
|
2103
|
-
|
2104
|
-
|
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
|
-
|
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
|
-
+
|
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
|
-
|
2119
|
-
|
2120
|
-
|
2121
|
-
|
2122
|
-
|
2123
|
-
|
2124
|
-
|
2125
|
-
|
2126
|
-
|
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 =
|
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 =
|
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(
|
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
|
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(
|
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
|
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(
|
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)]
|
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)]
|
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,
|
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
|
-
|
2008
|
-
|
2009
|
-
:, (self.label, "Returns")
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2014
|
-
|
2015
|
-
|
2016
|
-
|
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
|
-
|
2019
|
-
|
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()
|
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(
|
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
openseries/stoch_processes.py
CHANGED
@@ -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 =
|
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.
|
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) |
|
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=
|
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=
|
9
|
-
openseries/sim_price.py,sha256=
|
10
|
-
openseries/stoch_processes.py,sha256=
|
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.
|
13
|
-
openseries-0.12.
|
14
|
-
openseries-0.12.
|
15
|
-
openseries-0.12.
|
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,,
|
File without changes
|
File without changes
|