FMZ量化交易[千团大战]币安期货做空超涨做多超跌策略风险分析(第3篇)
admin
2023-07-31 14:28:15
0

目前不清退的交易所推荐:

1、全球第二大交易所OKX欧意

国区邀请链接: https://www.myts3cards.com/cn/join/1837888   币种多,交易量大!

国际邀请链接:https://www.okx.com/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!

2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gate.win/signup/649183

全球最大交易所币安,国区邀请链接:https://accounts.binance.com/zh-CN/register?ref=16003031  币安注册不了IP地址用香港,居住地选香港,认证照旧,邮箱推荐如gmail、outlook。支持币种多,交易安全!

买好币上KuCoin:https://www.kucoin.com/r/af/1f7w3  CoinMarketCap前五的交易所,注册友好操简单快捷!

FMZ量化交易平台邀请链接:https://www.fmz.com/

只是粗略模拟,让大家有具体的亏损幅度概念。 可以下载notebook上传到FMZ研究环境,自己运行代码。
策略有收费升级版,改进许多,有兴趣可以加微信 wangweibing_ustb 联系

币安做空超涨做多超跌策略风险估计.ipynb下载 

币安做空超涨做多超跌策略的风险估计

先看原始报告: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%。

可以根据下面的结果估算自己的风险承受能力。

In [49]:

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))

Out[49]:

币价: 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%。

In [56]:

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))

Out[56]:

币价: 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

In [ ]:

In [1]:

# 需要导入的库
import pandas as pd
import requests
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline

In [2]:

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,]

In [3]:

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\']]

In [ ]:

FMZ量化交易平台邀请链接:https://www.fmz.com/

全球最大交易所币安,国区邀请链接:https://accounts.binance.com/zh-CN/register?ref=16003031  币安注册不了IP地址用香港,居住地选香港,认证照旧,邮箱推荐如gmail、outlook。支持币种多,交易安全!

买好币上KuCoin:https://www.kucoin.com/r/af/1f7w3  CoinMarketCap前五的交易所,注册友好操简单快捷!

目前不清退的交易所推荐:

1、全球第二大交易所OKX欧意,邀请链接:https://www.myts3cards.com/cn/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!。

2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gate.win/signup/649183

买好币上币库:https://www.kucoin.com/r/1f7w3

火必所有用户现在可用了,但是要重新注册账号火币:https://www.huobi.com

全球最大交易所币安,

国区邀请链接:https://accounts.suitechsui.mobi/zh-CN/register?ref=16003031 支持86手机号码,网页直接注册。

相关内容

热门资讯

Windows 11 和 10... Windows 11/10 文件夹属性中缺少共享选项卡 – 已修复 1.检查共享选项卡是否可用 右键...
事件 ID 7034:如何通过... 点击进入:ChatGPT工具插件导航大全 服务控制管理器 (SCM) 负责管理系统上运行的服务的活动...
Hive OS LOLMine... 目前不清退的交易所推荐: 1、全球第二大交易所OKX欧意 国区邀请链接: https://www.m...
Radmin VPN Wind... Radmin VPN 是一款免费且用户友好的软件,旨在牢固地连接计算机以创建一个有凝聚力的虚拟专用网...
如何修复 Steam 内容文件... Steam 内容文件锁定是当您的 Steam 文件无法自行更新时出现的错误。解决此问题的最有效方法之...
Hive OS 部署 PXE ... 目前不清退的交易所推荐: 1、全球第二大交易所OKX欧意 国区邀请链接: https://www.m...
如何在Instagram上扫描... 如何在Instagram上扫描名称标签/ QR? 总而言之,您可以通过大约四种不同的方法来扫描这些I...
在 Windows 11 中打... 什么是链路状态电源管理? 您可以在系统控制面板的电源选项中看到链接状态电源管理。它是 PCI Exp...
farols1.1.501.0... faro ls 1.1.501.0(64bit)可以卸载,是一款无需连接外部PC机或笔记本计算机即可...
Hive OS 新建飞行表的方... 目前不清退的交易所推荐: 1、全球第二大交易所OKX欧意 国区邀请链接: https://www.m...