Exemplo n.º 1
0
 def __init__(self, perf_ts, risk_free= 0, z_score = 1.96, folio_name=""):
     debug_info("BasicStats perf_ts : %s"%(str(perf_ts)))
     self.perf_ts = perf_ts
     self.z_score = z_score
     self.risk_free = risk_free
     freq = get_frequency(self.perf_ts)
     
     self.freq = "Day" if freq == "D" else freq
     self.ann_factor = ann_factor[self.freq[0]]
     self.sqrt_factor = self.ann_factor ** 0.55
     self.tsarr = self.perf_ts.values  # [perf["NetReturn"] for perf in perf_ts]
     self.tsarr_rf = [float(x) - risk_free / self.ann_factor for x in self.tsarr] if self.ann_factor else []
     self.perf_rf = Series(data=self.tsarr_rf, index=self.perf_ts.index)
     self.T = len(self.perf_ts)
     self.mean = np.mean(self.tsarr)
     self.std = np.std(self.tsarr)
     self.skew = stats.skew(self.tsarr)
     self.kurt = stats.kurtosis(self.tsarr)+3
     self.mdd_ser = BasicStats.under_water_series(self.perf_ts)
     
     self.maxdd = min(self.mdd_ser) if self.ann_factor else 0
     self.up_returns = [r for r in self.tsarr if r > 0]
     self.dn_returns = [r for r in self.tsarr if r < 0]
     self.T_UP = len(self.up_returns)
     
     self.T_DN = len(self.dn_returns)
     self.pct_up = self.T_UP / float(self.T)
     self.pct_dn = self.T_DN / float(self.T)
     self.avg_gain = np.mean(self.up_returns)
     self.avg_loss = np.mean(self.dn_returns)
     self.std_gain = np.std(self.up_returns)
     self.std_loss = np.std(self.dn_returns)
     self.vami = BasicStats.vami_arr(self.perf_ts)
     
     self.vami_rf = BasicStats.vami_arr(self.perf_rf)
     self.cum_return = self.vami[-1] -1
     self.cum_return_rf = self.vami_rf[-1] - 1
     self.ann_return = ((1+self.cum_return) **(self.ann_factor / self.T) - 1) #if self.T >=365 else self.cum_return / self.T * 365
     self.ann_return_rf = (1+self.cum_return_rf) **(self.ann_factor / self.T) - 1 #if self.T >=365 else self.cum_return_rf / self.T * 365
     self.ann_std = self.std * np.sqrt(self.ann_factor)
     self.std_rf = np.std(self.tsarr_rf)
     self.mean_rf = np.mean(self.tsarr_rf)
     self.sharpe = self.mean_rf * self.sqrt_factor / self.std_rf
     self.var = self.mean - self.z_score * self.std
     self.adj_z = adj_z_score(self.z_score, self.skew, self.kurt)
     self.var_adj = self.mean - self.adj_z * self.std
     self.cvar = cvar(self.tsarr)
     self.best = max(self.tsarr)
     
     self.worst = min(self.tsarr)
     self.down_dev = self.downside_deviation(self.tsarr_rf)
     self.sortino = self.ann_return_rf / (self.std_loss * self.sqrt_factor)
     self.sortino_adj = self.ann_return_rf / (self.down_dev * self.sqrt_factor)
     X = self.perf_ts[1:].values
     X_1 = self.perf_ts[:-1].values
     self.ser_df = DataFrame([X,X_1]).transpose()
     self.serr_corr = self.ser_df.corr().iloc[0,1]
     self.socre = self.sharpe * 5 + self.ann_return * 10 + self.sortino * 5 - self.maxdd * 5
Exemplo n.º 2
0
 def __init__(self, weights,series):
     self.weights = weights
     self.series = series
     self.mean = mean(series)
     self.std = std(series)
     self.freq = get_frequency(series)
     self.ann_factor = freq_map[self.freq]
     self.ann_return = self.mean * self.ann_factor
     self.ann_vol = self.std * (self.ann_factor ** 0.5)
Exemplo n.º 3
0
 def write_coin_stats(coin, i):
     wsh.write(i + 1, 3, len(coin.Performance))
     if (len(coin.Performance)) > 0:
         wsh.write(
             i + 1, 4,
             min(coin.Performance.index).to_datetime().strftime(
                 "%m/%d/%Y"))
         wsh.write(
             i + 1, 5,
             max(coin.Performance.index).to_datetime().strftime(
                 "%m/%d/%Y"))
         wsh.write(i + 1, 6, get_frequency(coin.Performance))
Exemplo n.º 4
0
    def __init__(self, perf_ts, risk_free=0, z_score=1.96):

        self.perf_ts = perf_ts
        self.z_score = z_score
        self.risk_free = risk_free
        self.freq = get_frequency(perf_ts)
        self.ann_factor = ann_factor[self.freq[0]]
        self.sqrt_factor = self.ann_factor**0.5
        self.tsarr = perf_ts.values
        self.tsarr_rf = [x - risk_free / self.ann_factor for x in self.tsarr]
        self.perf_rf = Series(data=self.tsarr_rf, index=self.perf_ts.index)
        self.T = len(self.perf_ts)
        self.mean = np.mean(self.tsarr)
        self.std = np.std(self.tsarr)
        self.skew = stats.skew(self.tsarr)
        self.kurt = stats.kurtosis(self.tsarr) + 3
        self.mdd_ser = BasicStats.under_water_series(self.perf_ts)
        self.maxdd = min(self.mdd_ser)
        self.up_returns = [r for r in self.tsarr if r > 0]
        self.dn_returns = [r for r in self.tsarr if r < 0]
        self.T_UP = len(self.up_returns)
        self.T_DN = len(self.dn_returns)
        self.pct_up = self.T_UP / float(self.T)
        self.pct_dn = self.T_DN / float(self.T)
        self.avg_gain = np.mean(self.up_returns)
        self.avg_loss = np.mean(self.dn_returns)
        self.std_gain = np.std(self.up_returns)
        self.std_loss = np.std(self.dn_returns)
        self.vami = BasicStats.vami_arr(self.perf_ts)
        self.vami_rf = BasicStats.vami_arr(self.perf_rf)
        self.cum_return = self.vami[-1] - 1
        self.cum_return_rf = self.vami_rf[-1] - 1
        self.ann_return = (1 + self.cum_return)**(self.ann_factor / self.T) - 1
        self.ann_return_rf = (1 + self.cum_return_rf)**(self.ann_factor /
                                                        self.T) - 1
        self.ann_std = self.std * np.sqrt(self.ann_factor)
        self.std_rf = np.std(self.tsarr_rf)
        self.mean_rf = np.mean(self.tsarr_rf)
        self.sharpe = self.mean_rf * self.sqrt_factor / self.std_rf
        self.var = self.mean - self.z_score * self.std
        self.adj_z = adj_z_score(self.z_score, self.skew, self.kurt)
        self.var_adj = self.mean - self.adj_z * self.std
        self.cvar = cvar(self.tsarr)
        self.best = max(self.tsarr)
        self.worst = min(self.tsarr)
        self.down_dev = self.downside_deviation(self.tsarr_rf)
        self.sortino = self.ann_return_rf / (self.std_loss * self.sqrt_factor)
        self.sortino_adj = self.ann_return_rf / (self.down_dev *
                                                 self.sqrt_factor)
        X = self.perf_ts[1:].values
        X_1 = self.perf_ts[:-1].values
        self.ser_df = DataFrame([X, X_1]).transpose()
        self.serr_corr = self.ser_df.corr().iloc[0, 1]
Exemplo n.º 5
0
    def update_portfolio_coin(self, portfolio):

        coin = self.get_portfolio_coin(portfolio)
        coin.Name = portfolio.Name
        coin.StrategyCode = 'Portfolio'
        coin.lowername = portfolio.Name.lower()
        prof = portfolio.calc_proforma(self)

        coin.Performance = prof
        coin.T = len(prof)
        coin.MaxDate = int(prof.index[-1].timestamp())
        coin.Frequency = get_frequency(prof)
        self.get_table("Coin").put_item(Item=coin.to_db_item())
        return coin
Exemplo n.º 6
0
    def __init__(self, *, OwnerId=None, Data={}):
        self.import_dict(Data)
        self.OwnerID = OwnerId if OwnerId else Data['OwnerID']
        if 'HashKey' not in self.__dict__:
            self.HashKey = str(uuid1())

        if "Name" not in self.__dict__:
            if "CoinName" in self.__dict__:
                self.Name = self.__dict__["CoinName"]
            else:
                self.Name = "Coin %s" % self.HashKey

        if 'IsPortfolio' not in Data:
            self.IsPortfolio = False

        if 'Frequency' not in Data:
            self.Frequency = "M"

        float_fields = [
            'CoinCAP', 'ManagementFee', 'PerformanceFee', 'ManagerCAP'
        ]
        for field in float_fields:

            if hasattr(self, field):
                setattr(self, field, float(getattr(self, field)))
            else:
                setattr(self, field, 0)

        if 'Performance' in self.__dict__:

            dates = [
                datetime.fromtimestamp(p['EffectiveDate'])
                for p in self.Performance
            ]
            rets = [float(p["NetReturn"]) for p in self.Performance]
            self.Performance = Series(data=rets, index=dates, name=self.Name)
            self.Performance.sort_index(inplace=True)
            if len(self.Performance) > 3:
                self.Frequency = get_frequency(self.Performance)
            self.T = len(self.Performance)
        else:
            self.Performance = Series()

        if 'MaxDate' in self.__dict__:
            self.MaxDate = datetime.fromtimestamp(self.MaxDate)

        if 'MinDate' in self.__dict__:
            self.MinDate = datetime.fromtimestamp(self.MinDate)
Exemplo n.º 7
0
    def __init__(self, series):
        self.series = series
        if len(series) < 3:
            self.freq = 'M'
        else:
            self.freq = get_frequency(series)
            self.month_dict = {}

        freq_idx = freq_map[self.freq[0]]
        """
            month dict contains peformance data for getting list of date 
            with perormance for each month. this allows us to drill down into
            each month performance
        """
        dates = series.index
        values = series.values
        for d, v in zip(dates, values):
            index = d.year * 100 + d.month
            if index in self.month_dict:
                arr = self.month_dict[index]
                arr.append((d.strftime("%m/%d"), "%0.2f" % (v * 100) + "%"))
            else:
                self.month_dict[index] = [(d.strftime("%m/%d"),
                                           "%0.2f" % (v * 100) + "%")]

        if freq_idx == 12:
            self.monthly = series

        if freq_idx > 12:
            self.monthly = series.resample("M").apply(logreturns)

        self.annual = series.resample("A").apply(logreturns)

        monthly_index = self.monthly.index
        self.ann_perf = []
        for year_index in self.annual.index:
            y = year_index.year
            perf = AnnualPerformance(y)
            midx = [m for m in monthly_index if m.year == y]
            for m in midx:
                perf.months[m.month - 1] = self.monthly[m]

            perf.ytd = self.annual[year_index]
            perf.calc_month_table()
            self.ann_perf.append(perf)

        self.series.sort_index(inplace=True)
Exemplo n.º 8
0
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 31 13:11:48 2016

@author: coin-ai
"""

from datalib.datalib import Connection
from datalib.coin import Coin
from datetime import datetime
from analytics.time_series import get_frequency

db = Connection()
COINS = db.get_all_coins()
table = db.get_table("COIN")

for COIN in COINS:
    # print(COIN.Name)
    ts = COIN.Performance
    T = len(ts)
    mx = int(max(ts.index).timestamp())
    mn = int(min(ts.index).timestamp())
    item = COIN.to_db_item()
    item['MaxDate'] = mx
    item['MinDate'] = mn
    item['Frequency'] = get_frequency(ts)
    item['T'] = T
    table.put_item(Item=item)
    # print("COIN updated: %s" % COIN.Name)