示例#1
0
def reconcile_share(share_obj):
    transactions = Transactions.objects.filter(
        share=share_obj).order_by('trans_date')
    try:
        stock = Stock.objects.get(exchange=share_obj.exchange,
                                  symbol=share_obj.symbol)
        bonuses = Bonusv2.objects.filter(stock=stock)
        splits = Splitv2.objects.filter(stock=stock)
        round_qty_to_int = True if share_obj.exchange in [
            'NSE', 'BSE', 'NSE/BSE'
        ] else False
        qty, buy_value, buy_price, realised_gain, unrealised_gain = reconcile_event_based(
            transactions,
            bonuses,
            splits,
            round_qty_to_int=round_qty_to_int,
            latest_price=share_obj.latest_price,
            latest_conversion_rate=share_obj.conversion_rate)
        share_obj.quantity = qty
        share_obj.buy_value = buy_value
        share_obj.buy_price = buy_price
        share_obj.realised_gain = realised_gain
        share_obj.gain = unrealised_gain
        roi = 0
        if qty > 0:
            roi = get_roi(transactions, share_obj.latest_value)
        share_obj.roi = roi
        share_obj.save()
    except Stock.DoesNotExist:
        description = 'Stock not found in db. No splits/bonuses data available.  This affects other calculations.'
        create_alert(
            summary=
            f'{share_obj.exchange} {share_obj.symbol}  not found in db.',
            content=description,
            severity=Severity.warning,
            alert_type="Application")
    except Exception as ex:
        print(
            f'exception {ex} when reconciling {share_obj.exchange} {share_obj.symbol}'
        )
示例#2
0
    def get_goal_yearly_contrib(self, goal_id, yr):
        st_date = datetime.date(year=yr, day=1, month=1)
        end_date = datetime.date(year=yr, day=31, month=12)
        if end_date > datetime.date.today():
            end_date = datetime.date.today()
        cash_flows = list()
        contrib = 0
        deduct = 0
        total = 0

        for share_obj in Share.objects.filter(goal=goal_id):
            transactions = Transactions.objects.filter(share=share_obj, trans_date__lte=end_date)
            stock = Stock.objects.get(exchange=share_obj.exchange, symbol=share_obj.symbol)
            bonuses = Bonusv2.objects.filter(stock=stock, record_date__lte=end_date)
            splits = Splitv2.objects.filter(stock=stock, ex_date__lte=end_date)
            round_qty_to_int = True if share_obj.exchange in ['NSE', 'BSE', 'NSE/BSE'] else False
            qty, buy_value, buy_price, realised_gain, unrealised_gain = reconcile_event_based(transactions, bonuses, splits, round_qty_to_int=round_qty_to_int, latest_price=share_obj.latest_price, latest_conversion_rate=share_obj.conversion_rate)
            for t in transactions:
                if t.trans_date >= st_date:
                    if t.trans_type == 'Buy':
                        cash_flows.append((t.trans_date, -1*float(t.trans_price)))
                        contrib += float(t.trans_price)
                    else:
                        cash_flows.append((t.trans_date, float(t.trans_price)))
                        deduct += -1*float(t.trans_price)
            if qty > 0:
                year_end_value_vals = get_historical_stock_price_based_on_symbol(share_obj.symbol, share_obj.exchange, end_date+relativedelta(days=-5), end_date)
                if year_end_value_vals:
                    conv_rate = 1
                    if share_obj.exchange == 'NASDAQ' or share_obj.exchange == 'NYSE':
                        conv_val = get_conversion_rate('USD', 'INR', end_date)
                        if conv_val:
                            conv_rate = conv_val
                        for k,v in year_end_value_vals.items():
                            total += float(v)*float(conv_rate)*float(qty)
                            break
                else:
                    print(f'failed to get year end values for {share_obj.exchange} {share_obj.symbol} {end_date}')            
        return cash_flows, contrib, deduct, total
示例#3
0
def rsu_insights(request):
    template = 'rsus/rsu_insights.html'
    ret = list()
    today = datetime.date.today()
    total = dict()
    
    for i, award in enumerate(RSUAward.objects.all()):
        rsus = RestrictedStockUnits.objects.filter(award=award)
        if len(rsus) > 0:
            std = award.award_date
            r = lambda: random.randint(0,255)
            color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
            ret.append({
                'label':str(award.award_id),
                'data': list(),
                'fill': 'false',
                'borderColor':color
            })
            std = std.replace(day=1)
            reset_to_zero = False
            while True:
                val = 0
                for rsu in RestrictedStockUnits.objects.filter(award=award, vest_date__lte=std):
                    trans = list()
                    trans.append(Trans(rsu.shares_for_sale, rsu.vest_date, 'buy', rsu.shares_for_sale*rsu.aquisition_price))
                    for st in RSUSellTransactions.objects.filter(rsu_vest=rsu, trans_date__lte=std):
                        trans.append(Trans(st.units, st.trans_date, 'sell', st.trans_price))
                    q, _,_,_,_ = reconcile_event_based(trans, list(), list())
                    lv = get_historical_stock_price_based_on_symbol(award.symbol, award.exchange, std+relativedelta(days=-5), std)
                    if lv:
                        print(lv)
                        conv_rate = 1
                        if award.exchange == 'NASDAQ' or award.exchange == 'NYSE':
                            conv_val = get_conversion_rate('USD', 'INR', std)
                            if conv_val:
                                conv_rate = conv_val
                            for k,v in lv.items():
                                val += float(v)*float(conv_rate)*float(q)
                                break
                    else:
                        print(f'failed to get value of {award.award_id} {award.exchange}:{award.symbol} on {std}')
                if val > 0:
                    x = std.strftime('%Y-%m-%d')
                    ret[i]['data'].append({'x': x, 'y':round(val,2)})
                    total[x] = total.get(x, 0) + round(val,2)
                    reset_to_zero = True
                elif reset_to_zero:
                    x = std.strftime('%Y-%m-%d')
                    ret[i]['data'].append({'x': x, 'y':0})
                    reset_to_zero = False
                    total[x] = total.get(x, 0)
                if std == today:
                    break
                std = std+relativedelta(months=1)
                if std > today:
                    std = today
    print(ret)
    if len(ret) > 0:
        d = list()
        for k,v in sorted(total.items()):
            d.append({'x':k, 'y':round(v, 2)})
        r = lambda: random.randint(0,255)
        color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
        ret.append({
                    'label':'total',
                    'data': d,
                    'fill': 'false',
                    'borderColor':color
                })
    context = dict()
    context['progress_data'] = ret
    return render(request, template, context)
示例#4
0
    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        rsu = data['object']
        data['sell_trans'] = RSUSellTransactions.objects.filter(rsu_vest=rsu)
        data['curr_module_id'] = 'id_rsu_module'
        std = rsu.vest_date
        today = datetime.date.today()
        r = lambda: random.randint(0,255)
        color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
        ret = list()
        ret.append({
            'label':'',
            'data': list(),
            'fill': 'false',
            'borderColor':color
        })
        ret[0]['data'].append({'x': rsu.vest_date.strftime('%Y-%m-%d'), 'y':round(float(rsu.shares_for_sale*rsu.aquisition_price*rsu.conversion_rate),2)})

        std = std+relativedelta(months=1)
        if std > today:
            std = today
        else:
            std = std.replace(day=1)
            
        while True:
            val = 0
            trans = list()
            trans.append(Trans(rsu.shares_for_sale, rsu.vest_date, 'buy', rsu.shares_for_sale*rsu.aquisition_price*rsu.conversion_rate))
            for st in RSUSellTransactions.objects.filter(rsu_vest=rsu, trans_date__lte=std):
                trans.append(Trans(st.units, st.trans_date, 'sell', st.trans_price))
            q, _,_,_,_ = reconcile_event_based(trans, list(), list())
            lv = get_historical_stock_price_based_on_symbol(rsu.award.symbol, rsu.award.exchange, std+relativedelta(days=-5), std)
            if lv:
                print(lv)
                conv_rate = 1
                if rsu.award.exchange == 'NASDAQ' or rsu.award.exchange == 'NYSE':
                    conv_val = get_conversion_rate('USD', 'INR', std)
                    if conv_val:
                        conv_rate = conv_val
                    for k,v in lv.items():
                        val += float(v)*float(conv_rate)*float(q)
                        break
            else:
                print(f'failed to get value of {rsu.award.exchange}:{rsu.award.symbol} on {std}')
            if val > 0:
                x = std.strftime('%Y-%m-%d')
                ret[0]['data'].append({'x': x, 'y':round(val,2)})
            if std == today:
                break   
            std = std+relativedelta(months=1)
            if std > today:
                std = today
        data['progress_data'] = ret
        try:
            s = Stock.objects.get(symbol=rsu.award.symbol, exchange=rsu.award.exchange)
            last_date = datetime.date.today()
            if rsu.unsold_shares == 0:
                all_sell = RSUSellTransactions.objects.filter(rsu_vest=rsu).order_by('trans_date')
                last_date = all_sell[len(all_sell)-1].trans_date

            res = get_comp_index_values(s, rsu.vest_date, last_date)
            if 'chart_labels' in res and len(res['chart_labels']) > 0:
                for k, v in res.items():
                    data[k] = v 
        except Stock.DoesNotExist:
            print(f'trying to get stock that does not exist {rsu.award.symbol} {rsu.award.exchange}')
        return data
示例#5
0
def espp_insights(request):
    template = 'espps/espp_insights.html'
    ret = list()
    today = datetime.date.today()
    total = dict()

    for i, espp in enumerate(Espp.objects.all()):
        std = espp.purchase_date
        r = lambda: random.randint(0, 255)
        color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
        ret.append({
            'label': espp.purchase_date.strftime('%Y-%m-%d'),
            'data': list(),
            'fill': 'false',
            'borderColor': color
        })
        std = std + relativedelta(months=1)
        if std > today:
            std = today
        else:
            std = std.replace(day=1)
        reset_to_zero = False

        while True:
            val = 0
            trans = list()
            trans.append(
                Trans(espp.shares_purchased, espp.purchase_date, 'buy',
                      espp.total_purchase_price))
            for st in EsppSellTransactions.objects.filter(espp=espp,
                                                          trans_date__lte=std):
                trans.append(
                    Trans(st.units, st.trans_date, 'sell', st.trans_price))
            q, _, _, _, _ = reconcile_event_based(trans, list(), list())
            lv = get_historical_stock_price_based_on_symbol(
                espp.symbol, espp.exchange, std + relativedelta(days=-5), std)
            if lv:
                print(lv)
                conv_rate = 1
                if espp.exchange == 'NASDAQ' or espp.exchange == 'NYSE':
                    conv_val = get_conversion_rate('USD', 'INR', std)
                    if conv_val:
                        conv_rate = conv_val
                    for k, v in lv.items():
                        val += float(v) * float(conv_rate) * float(q)
                        break
                    else:
                        print(
                            f'failed to get value of {espp.exchange}:{espp.symbol} on {std}'
                        )
                if val > 0:
                    x = std.strftime('%Y-%m-%d')
                    ret[i]['data'].append({'x': x, 'y': round(val, 2)})
                    total[x] = total.get(x, 0) + round(val, 2)
                    reset_to_zero = True
                elif reset_to_zero:
                    x = std.strftime('%Y-%m-%d')
                    ret[i]['data'].append({'x': x, 'y': 0})
                    reset_to_zero = False
                    total[x] = total.get(x, 0)
                if std == today:
                    break
                std = std + relativedelta(months=1)
                if std > today:
                    std = today
    print(ret)
    if len(ret) > 0:
        d = list()
        for k, v in sorted(total.items()):
            d.append({'x': k, 'y': v})
        r = lambda: random.randint(0, 255)
        color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
        ret.append({
            'label': 'total',
            'data': d,
            'fill': 'false',
            'borderColor': color,
            'spanGaps': 'false'
        })
    context = dict()
    context['progress_data'] = ret
    print(context)
    return render(request, template, context)
示例#6
0
    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        print(data)
        data['goal_str'] = get_goal_name_from_id(data['object'].goal)
        data['user_str'] = get_user_name_from_id(data['object'].user)
        obj = data['object']
        cash_flows = list()
        cash_flows.append(
            (obj.purchase_date, -1 * float(obj.total_purchase_price)))
        for st in EsppSellTransactions.objects.filter(espp=data['object']):
            cash_flows.append((st.trans_date, float(st.trans_price)))
        if float(obj.latest_value) > 0:
            cash_flows.append((obj.as_on_date, float(obj.latest_value)))
        roi = xirr(cash_flows, 0.1) * 100
        roi = round(roi, 2)
        data['roi'] = roi
        data['curr_module_id'] = 'id_espp_module'
        '''
        data['transactions'] = list()
        for st in EsppSellTransactions.objects.filter(espp=data['object']):
            data['transactions'].append({
                'id':st.id,
                'trans_date':st.trans_date,
                'price':st.price,
                'units':st.units,
                'conversion_rate':st.conversion_rate,
                'trans_price':st.trans_price,
                'realised_gain':st.realised_gain,
                'notes':st.notes
            })
        '''
        std = obj.purchase_date
        today = datetime.date.today()
        r = lambda: random.randint(0, 255)
        color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r())
        ret = list()
        ret.append({
            'label': '',
            'data': list(),
            'fill': 'false',
            'borderColor': color
        })
        ret[0]['data'].append({
            'x': obj.purchase_date.strftime('%Y-%m-%d'),
            'y': round(float(obj.total_purchase_price), 2)
        })
        std = std + relativedelta(months=1)
        if std > today:
            std = today
        else:
            std = std.replace(day=1)
        reset_to_zero = False
        while True:
            val = 0
            trans = list()
            trans.append(
                Trans(obj.shares_purchased, obj.purchase_date, 'buy',
                      obj.total_purchase_price))
            for st in EsppSellTransactions.objects.filter(espp=obj,
                                                          trans_date__lte=std):
                trans.append(
                    Trans(st.units, st.trans_date, 'sell', st.trans_price))
            q, _, _, _, _ = reconcile_event_based(trans, list(), list())
            lv = get_historical_stock_price_based_on_symbol(
                obj.symbol, obj.exchange, std + relativedelta(days=-5), std)
            if lv:
                print(lv)
                conv_rate = 1
                if obj.exchange == 'NASDAQ' or obj.exchange == 'NYSE':
                    conv_val = get_conversion_rate('USD', 'INR', std)
                    if conv_val:
                        conv_rate = conv_val
                    for k, v in lv.items():
                        val += float(v) * float(conv_rate) * float(q)
                        break
            else:
                print(
                    f'failed to get value of {obj.exchange}:{obj.symbol} on {std}'
                )
            if val > 0 or reset_to_zero:
                x = std.strftime('%Y-%m-%d')
                ret[0]['data'].append({'x': x, 'y': round(val, 2)})
                if val > 0:
                    reset_to_zero = True
                else:
                    reset_to_zero = False

            if std == today:
                break
            std = std + relativedelta(months=1)
            if std > today:
                std = today
        data['progress_data'] = ret
        try:
            s = Stock.objects.get(symbol=obj.symbol, exchange=obj.exchange)
            last_date = datetime.date.today()
            if obj.shares_avail_for_sale == 0:
                all_sell = EsppSellTransactions.objects.filter(
                    espp=obj).order_by('trans_date')
                last_date = all_sell[len(all_sell) - 1].trans_date

            res = get_comp_index_values(s, obj.purchase_date, last_date)
            if 'chart_labels' in res and len(res['chart_labels']) > 0:
                for k, v in res.items():
                    data[k] = v
        except Stock.DoesNotExist:
            print(
                f'trying to get stock that does not exist {obj.symbol} {obj.exchange}'
            )

        return data