BMex反向合约盈亏计算

import os,sys
import logging
import numpy as np
import pandas as pd

pd.set_option('display.width', 1000)
pd.set_option('display.max_rows', 500)


ENTRY = 11440
POSITION = -500
LEVERAGE = 3
FX_RATE_RMB_USD = 6.9

WALLET = 0.0978 # BTC

STEP = 10
N = 50

START_PRICE = 11200

def next():
    for p in START_PRICE + np.arange(N)*STEP:
        yield p

def snap_shot(price):
    delta_spot = price - ENTRY
    factor = 1 if POSITION>0 else -1 # different view for long/short position holders
    pnl_pct = factor*(1/ENTRY - 1/price)*price*100
    delta_b = (1/ENTRY - 1/price)*POSITION
    delta_b_rmb = delta_b * FX_RATE_RMB_USD * ENTRY

    portfolio_b = delta_b + WALLET
    portfolio_rmb = portfolio_b * FX_RATE_RMB_USD * price
    portfolio_gain = portfolio_rmb - ENTRY * WALLET * FX_RATE_RMB_USD

    row = dict( market_price=price,
                    delta_spot=delta_spot, 
                    pnl_pct=pnl_pct, 
                    delta_pos_in_btc=delta_b,
                    delta_pos_in_rmb=delta_b_rmb,
                    portfolio_b = portfolio_b,
                    portfolio_rmb = portfolio_rmb,
                    portfolio_gain = portfolio_gain
                    )
    return row

import click
@click.command()
@click.option('--step', default=5, help='Price step')
@click.option('--entry', default=10000, help='Entry price')
@click.option('--position', default=0, help='BMex position in $')
@click.option('--wallet', default=0.0, help='Wallet balance in BTC')
def main(step,entry,position,wallet):
    global START_PRICE, STEP,ENTRY,POSITION,WALLET
    START_PRICE = entry*.98
    STEP = step
    ENTRY=entry
    POSITION=position
    WALLET=wallet
   
    print('*'*30)
    print(f'Assume position ($): {POSITION}')
    print('*'*30)

    rows = []
    for price in next():
        row = snap_shot(price)
        rows += [row]

    df = pd.DataFrame.from_records( rows )
    df.pnl_pct = df.pnl_pct.apply(lambda e: '{:.2f}%'.format(e) )
    df.portfolio_rmb = df.portfolio_rmb.apply(lambda e: '¥{:.2f}'.format(e))
    df.portfolio_gain = df.portfolio_gain.apply(lambda e: '¥{:.2f}'.format(e))

    margin = abs(POSITION)/ENTRY/LEVERAGE
    total_loss = -margin # - indicates loss
    total_loss_usd = total_loss * ENTRY

    print(df)
    print(f'\nMargin(B): {margin}\nTotal Loss: {total_loss}\nTotal Loss ($): {total_loss_usd}')

if __name__ == '__main__':
    main()


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值