Solo es una simulación aproximada, para que todos tengan una idea concreta de la magnitud de los daños. Puede descargar un portátil, subirlo al entorno de investigación de FMZ y ejecutar el código por sí mismo. La estrategia tiene una versión de actualización de pago, con muchas mejoras, los interesados pueden agregar WeChat wangweibing_ustb.
币安做空超涨做多超跌策略的风险估计
先看原始报告:https://www.fmz.com/digest-topic/5294 , 改进报告:https://www.fmz.com/digest-topic/5364
策略公开了4天,前期表现实在太好,收益很高,极少回撤,以至于很多人上了很高的杠杆,去搏每天10%的收益。但如同开始的报告所说,没有完美的策略,空超涨做多超跌是利用了山寨币同涨同跌的特性,如果有币种走出独特的趋势,会积累很多仓位,虽然改进版加上了移动平均来追踪从初始价格,但风险依然存在,本报告主要量化具体的风险,以及为什么参数推荐trade_value要占总资金的3%。
为了代码突出,把这部分提前了,大家先运行后面的代码(从导入库开始)。
为了模拟我们假设了20个币种,但只用添加BTC和ETH,用BTC代表价格不变的19个币,ETH表示出现独立行情的币种。由于只是模拟,这里就不用移动平均来追踪初始价格了,假设价格是很快的速度上涨来的。
首先模拟一下单个币价不断上涨的情况,stop_loss表示止损偏离,这里仅仅模拟,实际情况会有间歇性的回调,不会如此差。
假设这个币没有任何回调,但止损偏离为0.41时,此时ETH上涨了44%,最终亏损了7倍的交易额,即trade_value*7。如果trade_value设置为总资金的3%,那么亏损=总资金*0.03*7。最大回撤约为0.03*7=21%。
可以根据下面的结果估算自己的风险承受能力。
btc_price = [1]*500 #比特币价格,一直不变 eth_price = [i/100. for i in range(100,500)] #以太坊,一个周期上涨1% for stop_loss in [i/1000. for i in range(10,1500,50)]: e = Exchange(['BTC','ETH'],initial_balance=10000,commission=0.0005,log=False) trade_value = 300 # 交易额为300 for i in range(200): index = (btc_price[i]*19+eth_price[i])/20. #指数 e.Update(i,{'BTC':btc_price[i], 'ETH':eth_price[i]}) diff_btc = btc_price[i] - index #偏差 diff_eth = eth_price[i] - index btc_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount']) eth_value = e.account['ETH']['value']*np.sign(e.account['ETH']['amount']) aim_btc_value = -trade_value*round(diff_btc/0.01,1)*19 #这里BTC代替的是19个币种 aim_eth_value = -trade_value*round(diff_eth/0.01,1) if aim_btc_value - btc_value > 20: e.Buy('BTC',btc_price[i],(aim_btc_value - btc_value)/btc_price[i]) if aim_eth_value - eth_value < -20 and diff_eth < stop_loss: e.Sell('ETH',eth_price[i], (eth_value-aim_eth_value)/eth_price[i],diff_eth) if diff_eth > stop_loss and eth_value < 0: #止损 stop_price = eth_price[i] e.Buy('ETH',eth_price[i], (-eth_value)/eth_price[i],diff_eth) print('币价:',stop_price,' 止损偏离:', stop_loss,'最终余额:',e.df['total'].iloc[-1], ' 亏损交易额倍数:',round((e.initial_balance-e.df['total'].iloc[-1])/300,1))
币价: 1.02 止损偏离: 0.01 最终余额: 9968.840396 亏损交易额倍数: 0.1 币价: 1.07 止损偏离: 0.06 最终余额: 9912.862738 亏损交易额倍数: 0.3 币价: 1.12 止损偏离: 0.11 最终余额: 9793.616067 亏损交易额倍数: 0.7 币价: 1.17 止损偏离: 0.16 最终余额: 9617.477263 亏损交易额倍数: 1.3 币价: 1.23 止损偏离: 0.21 最终余额: 9337.527299 亏损交易额倍数: 2.2 币价: 1.28 止损偏离: 0.26 最终余额: 9051.5166 亏损交易额倍数: 3.2 币价: 1.33 止损偏离: 0.31 最终余额: 8721.285267 亏损交易额倍数: 4.3 币价: 1.38 止损偏离: 0.36 最终余额: 8350.582251 亏损交易额倍数: 5.5 币价: 1.44 止损偏离: 0.41 最终余额: 7856.720861 亏损交易额倍数: 7.1 币价: 1.49 止损偏离: 0.46 最终余额: 7406.412066 亏损交易额倍数: 8.6 币价: 1.54 止损偏离: 0.51 最终余额: 6923.898356 亏损交易额倍数: 10.3 币价: 1.59 止损偏离: 0.56 最终余额: 6411.276143 亏损交易额倍数: 12.0 币价: 1.65 止损偏离: 0.61 最终余额: 5758.736222 亏损交易额倍数: 14.1 币价: 1.7 止损偏离: 0.66 最终余额: 5186.230956 亏损交易额倍数: 16.0 币价: 1.75 止损偏离: 0.71 最终余额: 4588.802975 亏损交易额倍数: 18.0 币价: 1.81 止损偏离: 0.76 最终余额: 3841.792751 亏损交易额倍数: 20.5 币价: 1.86 止损偏离: 0.81 最终余额: 3193.215479 亏损交易额倍数: 22.7 币价: 1.91 止损偏离: 0.86 最终余额: 2525.155765 亏损交易额倍数: 24.9 币价: 1.96 止损偏离: 0.91 最终余额: 1837.699982 亏损交易额倍数: 27.2 币价: 2.02 止损偏离: 0.96 最终余额: 988.009942 亏损交易额倍数: 30.0 币价: 2.07 止损偏离: 1.01 最终余额: 260.639618 亏损交易额倍数: 32.5 币价: 2.12 止损偏离: 1.06 最终余额: -483.509646 亏损交易额倍数: 34.9 币价: 2.17 止损偏离: 1.11 最终余额: -1243.486107 亏损交易额倍数: 37.5 币价: 2.24 止损偏离: 1.16 最终余额: -2175.438384 亏损交易额倍数: 40.6 币价: 2.28 止损偏离: 1.21 最终余额: -2968.19255 亏损交易额倍数: 43.2 币价: 2.33 止损偏离: 1.26 最终余额: -3774.613275 亏损交易额倍数: 45.9 币价: 2.38 止损偏离: 1.31 最终余额: -4594.305499 亏损交易额倍数: 48.6 币价: 2.44 止损偏离: 1.36 最终余额: -5594.651063 亏损交易额倍数: 52.0 币价: 2.49 止损偏离: 1.41 最终余额: -6441.474964 亏损交易额倍数: 54.8 币价: 2.54 止损偏离: 1.46 最终余额: -7299.652662 亏损交易额倍数: 57.7
在模拟一下不断下跌的情况,下跌伴随这合约价值的减小,因此风险比上涨更高,随着价格下跌,亏损上升的速度加速。止损偏离值为-0.31时,此时币价下跌33%,亏损了6.5个交易额,如果交易额trade_value设置为总资金的3%,最大回撤约为0.03*6.5=19.5%。
btc_price = [1]*500 #比特币价格,一直不变 eth_price = [2-i/100. for i in range(100,200)] #以太坊 for stop_loss in [-i/1000. for i in range(10,1000,50)]: e = Exchange(['BTC','ETH'],initial_balance=10000,commission=0.0005,log=False) trade_value = 300 # 交易额为300 for i in range(100): index = (btc_price[i]*19+eth_price[i])/20. #指数 e.Update(i,{'BTC':btc_price[i], 'ETH':eth_price[i]}) diff_btc = btc_price[i] - index #偏差 diff_eth = eth_price[i] - index btc_value = e.account['BTC']['value']*np.sign(e.account['BTC']['amount']) eth_value = e.account['ETH']['value']*np.sign(e.account['ETH']['amount']) aim_btc_value = -trade_value*round(diff_btc/0.01,1)*19 #这里BTC代替的是19个币种 aim_eth_value = -trade_value*round(diff_eth/0.01,1) if aim_btc_value - btc_value < -20: e.Sell('BTC',btc_price[i],-(aim_btc_value - btc_value)/btc_price[i]) if aim_eth_value - eth_value > 20 and diff_eth > stop_loss: e.Buy('ETH',eth_price[i], -(eth_value-aim_eth_value)/eth_price[i],diff_eth) if diff_eth < stop_loss and eth_value > 0: e.Sell('ETH',eth_price[i], (eth_value)/eth_price[i],diff_eth) stop_price = eth_price[i] print('币价:',round(stop_price,2),' 止损偏离:', stop_loss,'最终余额:',e.df['total'].iloc[-1], ' 亏损交易额倍数:',round((e.initial_balance-e.df['total'].iloc[-1])/300,1))
币价: 0.98 止损偏离: -0.01 最终余额: 9983.039091 亏损交易额倍数: 0.1 币价: 0.93 止损偏离: -0.06 最终余额: 9922.200148 亏损交易额倍数: 0.3 币价: 0.88 止损偏离: -0.11 最终余额: 9778.899361 亏损交易额倍数: 0.7 币价: 0.83 止损偏离: -0.16 最终余额: 9545.316075 亏损交易额倍数: 1.5 币价: 0.77 止损偏离: -0.21 最终余额: 9128.800213 亏损交易额倍数: 2.9 币价: 0.72 止损偏离: -0.26 最终余额: 8651.260863 亏损交易额倍数: 4.5 币价: 0.67 止损偏离: -0.31 最终余额: 8037.598952 亏损交易额倍数: 6.5 币价: 0.62 止损偏离: -0.36 最终余额: 7267.230651 亏损交易额倍数: 9.1 币价: 0.56 止损偏离: -0.41 最终余额: 6099.457595 亏损交易额倍数: 13.0 币价: 0.51 止损偏离: -0.46 最终余额: 4881.767442 亏损交易额倍数: 17.1 币价: 0.46 止损偏离: -0.51 最终余额: 3394.414792 亏损交易额倍数: 22.0 币价: 0.41 止损偏离: -0.56 最终余额: 1575.135344 亏损交易额倍数: 28.1 币价: 0.35 止损偏离: -0.61 最终余额: -1168.50508 亏损交易额倍数: 37.2 币价: 0.29 止损偏离: -0.66 最终余额: -4071.007983 亏损交易额倍数: 46.9 币价: 0.25 止损偏离: -0.71 最终余额: -7750.361195 亏损交易额倍数: 59.2 币价: 0.19 止损偏离: -0.76 最终余额: -13618.366286 亏损交易额倍数: 78.7 币价: 0.14 止损偏离: -0.81 最终余额: -20711.473968 亏损交易额倍数: 102.4 币价: 0.09 止损偏离: -0.86 最终余额: -31335.965608 亏损交易额倍数: 137.8 币价: 0.04 止损偏离: -0.91 最终余额: -51163.223715 亏损交易额倍数: 203.9 币价: 0.04 止损偏离: -0.96 最终余额: -81178.565715 亏损交易额倍数: 303.9
# 需要导入的库 import pandas as pd import requests import matplotlib.pyplot as plt import seaborn as sns import numpy as np %matplotlib inline
price_usdt = pd.read_csv('https://www.fmz.com/upload/asset/20227de6c1d10cb9dd1.csv ', index_col = 0) price_usdt.index = pd.to_datetime(price_usdt.index) price_usdt_norm = price_usdt/price_usdt.fillna(method='bfill').iloc[0,] price_usdt_btc = price_usdt.divide(price_usdt['BTC'],axis=0) price_usdt_btc_norm = price_usdt_btc/price_usdt_btc.fillna(method='bfill').iloc[0,]
class Exchange: def __init__(self, trade_symbols, leverage=20, commission=0.00005, initial_balance=10000, log=False): self.initial_balance = initial_balance #初始的资产 self.commission = commission self.leverage = leverage self.trade_symbols = trade_symbols self.date = '' self.log = log self.df = pd.DataFrame(columns=['margin','total','leverage','realised_profit','unrealised_profit']) self.account = {'USDT':{'realised_profit':0, 'margin':0, 'unrealised_profit':0, 'total':initial_balance, 'leverage':0, 'fee':0}} for symbol in trade_symbols: self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0, 'margin':0, 'unrealised_profit':0,'fee':0} def Trade(self, symbol, direction, price, amount, msg=''): if self.date and self.log: print('%-20s%-5s%-5s%-10.8s%-8.6s %s'%(str(self.date), symbol, 'buy' if direction == 1 else 'sell', price, amount, msg)) cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount) open_amount = amount - cover_amount self.account['USDT']['realised_profit'] -= price*amount*self.commission #扣除手续费 self.account['USDT']['fee'] += price*amount*self.commission self.account[symbol]['fee'] += price*amount*self.commission if cover_amount > 0: #先平仓 self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #利润 self.account['USDT']['margin'] -= cover_amount*self.account[symbol]['hold_price']/self.leverage #释放保证金 self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount self.account[symbol]['amount'] -= -direction*cover_amount self.account[symbol]['margin'] -= cover_amount*self.account[symbol]['hold_price']/self.leverage self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price'] if open_amount > 0: total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount total_amount = direction*self.account[symbol]['amount']+open_amount self.account['USDT']['margin'] += open_amount*price/self.leverage self.account[symbol]['hold_price'] = total_cost/total_amount self.account[symbol]['amount'] += direction*open_amount self.account[symbol]['margin'] += open_amount*price/self.leverage self.account[symbol]['unrealised_profit'] = (price - self.account[symbol]['hold_price'])*self.account[symbol]['amount'] self.account[symbol]['price'] = price self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*price return True def Buy(self, symbol, price, amount, msg=''): self.Trade(symbol, 1, price, amount, msg) def Sell(self, symbol, price, amount, msg=''): self.Trade(symbol, -1, price, amount, msg) def Update(self, date, close_price): #对资产进行更新 self.date = date self.close = close_price self.account['USDT']['unrealised_profit'] = 0 for symbol in self.trade_symbols: if np.isnan(close_price[symbol]): continue self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount'] self.account[symbol]['price'] = close_price[symbol] self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*close_price[symbol] self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit'] self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6) self.account['USDT']['leverage'] = round(self.account['USDT']['margin']/self.account['USDT']['total'],4)*self.leverage self.df.loc[self.date] = [self.account['USDT']['margin'],self.account['USDT']['total'],self.account['USDT']['leverage'],self.account['USDT']['realised_profit'],self.account['USDT']['unrealised_profit']]
Las hierbas/upload/asset/295a58e8490ca09dee6.csv /upload/asset/20fd9fc1b5f15ee472c.csv /upload/asset/17d46d81df76072032d.csv y /upload/asset/17d46d81df76072032d.csv
Las hierbasLas autoridades competentes de los Estados miembros deberán tener en cuenta los requisitos de la presente Directiva en el momento de la adopción de la presente Decisión.
¿Qué quieres decir?Como minorista, también les agradezco que hayan proporcionado una gran cantidad de liquidez a los futuros de Bitcoin.
¿Qué es eso?El gobierno de los Estados Unidos está tratando de poner fin a este tipo de violencia.
- ¿Qué quieres decir?El gobierno de los Estados Unidos está tratando de poner fin a este tipo de violencia.
el jingfengzEl gobierno de los Estados Unidos está tratando de poner fin a este tipo de violencia.
Las hierbasHay miles de talentos que pueden afectar el mercado
Las hierbasEn la actualidad, la mayoría de los usuarios de Twitter están en línea con el sitio web de Twitter de Twitter, y el número de usuarios que se han conectado a Twitter es muy pequeño en comparación con el tráfico en sí.