Beispiel #1
0
    def __init__(self, y, x):
        self.ts_y = y

        if type(x) is list:
            self.ts_x = x
        else:
            self.ts_x = [x]
        self.all_series = self.ts_x.copy()
        self.all_series.insert(0, self.ts_y)
        self.common_data = align_series(self.all_series)
        self.columns = self.common_data.columns
        self.Y = self.common_data[self.columns[0]].values
        self.X = self.common_data[self.columns[1:]].values
        self.X = sm.add_constant(self.X)
        self.model = sm.OLS(self.Y, self.X)
        self.reg_results = self.model.fit()
        betas = list(self.reg_results.params)[1:]
        self.betas = [toDecimal(b) for b in betas]
        self.pvalues = self.reg_results.pvalues[1:]
        self.alpha = self.reg_results.params[0]
        self.rsq_adj = self.reg_results.rsquared_adj
        self.rsq = self.reg_results.rsquared
        self.coin_vol = var(self.Y)
        if len(self.ts_x) > 1:
            self.factor_cov = cov(self.X[:, 1:], rowvar=False)
            betas = [float(betas) for betas in self.betas]
            self.fcmtr = matmul(self.factor_cov, betas)
            self.crisk = [
                b * v / self.coin_vol for (b, v) in zip(betas, self.fcmtr)
            ]
        else:
            self.factor_cov = [cov(self.X[:, 1])]
            self.crisk = [self.rsq]
        self.crisk.append(1 - sum(self.crisk))
        self.crisk_cum = cumsum(self.crisk)
Beispiel #2
0
    def __init__(self,
                 folio_ts,
                 peer,
                 user_id=None,
                 factors=None,
                 Index=0,
                 regime_model=None):

        if user_id:
            peer_folio_ts = peer.folio_ts
        else:
            peer_folio_ts = peer.Performance
        common_data = align_series([folio_ts, peer_folio_ts])
        self.Name = peer.Name
        self.entire_return = peer.entire_history if user_id else 0
        self.HashKey = peer.folio_id if user_id else peer.coin_id
        self.corr = common_data.corr().iloc[0, 1]
        self.peer_stats = BasicStats(peer_folio_ts)
        self.coin_stats = BasicStats(folio_ts)
        self.peer_ts = peer_folio_ts
        self.folio_ts = folio_ts
        self.index = Index
        if factors:
            self.factors = factors
            self.factor_ts = [f.Performance for f in self.factors]
            self.peer_style = RegressionAnalysis(self.peer_ts, self.factor_ts)
        else:
            self.coin_style = None
            self.peer_style = None

        if regime_model:
            self.regime_stats = RegimeAnalysis(peer, regime_model, peer,
                                               user_id)
        self.XY = common_data.values
Beispiel #3
0
    def calc_proforma(self, db, new_weights=[], update_common_ts=True):
        """
            calcualte portfolio proforma time series
        """
        if len(self.Allocations) > 0:
            get_w = lambda: [float(a['Allocation']) for a in self.Allocations]

            weights = new_weights if len(new_weights) > 0 else get_w()
            good_weights = [w for w in weights if w > 0]

            if update_common_ts:
                if not self.coins:
                    self.coins = self.get_coins(db)

                perfs = []
                for coin, w in zip(self.coins, weights):
                    if w > 0:
                        if len(coin.Performance) == 0:
                            coin2 = db.get_coin(coin.HashKey, get_ts=True)
                            coin.Performance = coin2.Performance
                        else:
                            perfs.append(coin.Performance)

                self.common_ts = align_series(perfs)

            ret_m = matrix(self.common_ts.values)
            W = matrix(good_weights)

            proforma = ret_m * W.T
            prof_array = [p[0, 0] for p in proforma]
            dates = self.common_ts.index
            return Series(data=prof_array, index=dates, name=self.Name)
        return Series()
Beispiel #4
0
def SimpleReg(y, x, has_const=False):
    common_data = align_series([y, x])
    y = common_data.iloc[:, 0]
    x = common_data.iloc[:, 1]

    if has_const:
        x = sm.add_constant(x)
    model = sm.OLS(y, x)
    res = model.fit()
    return list(res.params.values)
Beispiel #5
0
def calc_tmy(fts, benchts):
    common_data = align_series([fts, benchts])
    common_data.columns = ['Y', 'X']
    common_data['XY'] = common_data['X']**2
    y = common_data.iloc[:, 0].values
    x = common_data.iloc[:, 1:].values
    x = sm.add_constant(x)

    model = sm.OLS(y, x)
    res = model.fit()
    return res.params
Beispiel #6
0
    def __init__(self, ts, bench_ts):
        """
            Constructor accepts to Series objects (for Coin and benchmark)
        """
        self.common_df = align_series([ts, bench_ts])
        self.data = self.common_df.values
        self.bench_data = self.data[:, 1]
        self.coin_data = self.data[:, 0]
        self.idx_bench_up = self.bench_data > 0
        self.idx_bench_dn = self.bench_data < 0
        self.T = len(self.bench_data)

        self.T_Up = len([i for i in self.idx_bench_up if i])
        self.T_Dn = len([i for i in self.idx_bench_dn if i])

        self.coin_bench = self.coin_data - self.bench_data
        self.coin_bench_up = self.coin_bench[self.idx_bench_up]
        self.coin_bench_dn = self.coin_bench[self.idx_bench_dn]

        reg_up = self.calc_beta(self.coin_data, self.bench_data,
                                self.idx_bench_up)
        reg_dn = self.calc_beta(self.coin_data, self.bench_data,
                                self.idx_bench_dn)

        self.alpha_up = reg_up[0]
        self.alpha_dn = reg_dn[0]
        self.beta_up = reg_up[1]
        self.beta_dn = reg_dn[1]

        if self.T_Up > 0:
            self.up_capture = self.calc_capture(self.coin_data,
                                                self.bench_data,
                                                self.idx_bench_up)
            self.T_Up_outperf = len([f for f in self.coin_bench_up if f > 0])
            self.up_outperf = self.T_Up_outperf / self.T_Up
            self.perf_bench_up = self.coin_bench_up.mean()
            self.bench_up = self.bench_data[self.idx_bench_up].mean()
        else:
            self.up_outperf = 0

        if self.T_Dn > 0:

            self.dn_capture = self.calc_capture(self.coin_data,
                                                self.bench_data,
                                                self.idx_bench_dn)
            self.T_Dn_outperf = len([f for f in self.coin_bench_dn if f > 0])
            self.dn_outperf = self.T_Dn_outperf / self.T_Dn
            self.perf_bench_dn = self.coin_bench_dn.mean()
            self.bench_dn = self.bench_data[self.idx_bench_dn].mean()
        else:
            self.dn_outperf = 0
Beispiel #7
0
 async def populate_time_series(self, start_at=None):
     """
         Get a set of common time series based on item and benchmarks (if any)
     """
     self.all_series = [self.perf]
     if 'Benchmarks' in self.item.__dict__:
         self.benchmarks = self.item.Benchmarks
         for ticker in self.item.Benchmarks:
             bench = await self.db.get_risk_factor(ticker, start_at)
             if bench:
                 if len(bench.Performance) > 0:
                     self.all_series.append(bench.Performance)
         self.data_frame = align_series(self.all_series)
     else:
         self.benchmarks = []
         self.n_benchmarks = 0
         self.data_frame = DataFrame(self.perf)
Beispiel #8
0
    def __init__(self, ts, bench_ts):
        self.ts = ts
        self.bench_ts = bench_ts
        self.common_data = align_series([self.ts, self.bench_ts])
        self.columns = self.common_data.columns
        self.idx_up = self.common_data[self.columns[1]] > 0
        self.idx_dn = self.common_data[self.columns[1]] < 0

        self.data_up = self.common_data[self.idx_up]
        self.data_dn = self.common_data[self.idx_dn]
        self.XY = self.common_data.values
        self.T = len(self.common_data)
        if len(self.common_data) >= 6:
            self.corr = self.common_data.corr().iloc[1, 0]

        if len(self.data_up) >= 6:
            self.corr_up = self.data_up.corr().iloc[1, 0]

        if len(self.data_dn) >= 6:
            self.corr_dn = self.data_dn.corr().iloc[1, 0]