引言:
邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。
【历史文章汇总】请点击此处
【必读文章】EOS期现套利,一周时间,15%无风险收益
10年400倍策略分享(附视频逐行代码讲解)
个人微信:xbx9585,有问题欢迎交流。
邢不行亲历:一行代码亏损5万美金,量化投资的风险
10月15日,周一,早晨07:30
在我还睡着的时候,阿里云香港服务器上跑着的自动交易程序,在bitfinex交易所陆续对我交易的几个数字货币,开了空单。并且策略判定此次交易盈利的概率较大,所以加了3倍杠杆。
开空单:指的是做空,例如价格跌10%,我就赚10%,相应的价格涨10%,我就亏10%。
3倍杠杆:放大盈亏比例。例如价格跌10%,我就赚30%,相应的价格涨10%,我就亏30%。
下图展示的当时比特币(btc/usdt)的15分钟K线图,开空点位是6348左右。
10月15日,周一,上午
因为一些私人事情需要处理,这天上午没有到办公室。
在出门之前,通过每天早晨8点半钉钉发给我的持仓监控,了解到策略已经开空了。内心:赶紧他妈的给我暴跌吧。
因为办的事情比较麻烦,一个上午都没有时间看手机,微信群也没有查看。
10月15日,周一,下午13:15
如下图所示比特币的价格上涨到6423,相比我们的做空点位已经上涨了1.18%,空头仓位已经亏损了约3.6%。
交易的其它币种的空头仓位,也产生了一定的亏损。此时按照策略,应该马上平仓止损。
做交易就是要这样,该止损的时候绝不手软,哪怕之后被打脸。因为活下来是最重要的。
这也是量化交易的好处,帮你按照策略自动止损,避免交易者情绪的影响。
并且根据我策略的判断,此时不仅应该止损,还要反过来开多,并且仍然是3倍杠杆。
10月15日,周一,下午13:20
事情终于顺利办好了,我也在外面吃好了午饭,坐上去办公室的车,拿出手机。
这个时候不知道为什么,我打开手机上的teamviewer,远程了一下阿里云服务器。没啥特殊目的,就是顺手随便看看。
因为程序一直比较稳定,我一般是不怎么看服务器的。天知道这次怎么就想着打开手机顺便看看呢,可能是我的钱正在向我呼救吧。之后才知道,这顺手一看,救了一命。
登陆服务器之后,就看到了下面这张行情图,发现币价正在急速上涨:
内心:妈蛋,亏钱了,幸好策略应该帮我提前止损了。
之后看下我程序的实时输出,想看下当前持仓。然后发现我的程序已经暂停2个小时了,并且之前的空头仓位还在,并没有止损!
此时瞬间人就变得紧张,从椅子上坐了起来,之前办事的疲惫已经忘记。
赶紧点击重新运行按钮,让程序重新跑起来。
但我不在电脑面前,没办法手工操作平之前的仓位,眼睁睁的看着价格还在继续急速上涨,只能等着程序跑。
因为我跑策略看的是15分钟K线,所以每隔15分钟才会操作一次。所以只能等到13:30的时候,程序才进行了操作。
具体如下图所示,直到涨到6500的时候,才平空仓,并且3倍杠杆开多:
10月15日,周一,下午
等到程序帮我止损并且再开多之后,绷紧的神经才稍稍放松下来。坐在车上望着窗外的上海中心,算算到底亏了多少。
因为程序故障慢了的这15分钟,导致之前的空仓多亏了钱,新开的多仓又少赚了钱。
恩,一来一去,大约5万美金没了,妈蛋。
但是呢,随着行情的进一步发展,我深深的感到,我是多么多么多么多么多么的幸运。
因为之后的行情走势是下图这样的:
继续暴涨!
受到usdt不能承兑的影响,bitfinex交易所上面的btc/usdt交易对开始猛涨。最高一直涨到了7800美金。
如果我不是在13:20左右,随手看了下服务器,然后让停止的程序重启,那么我早晨在6348开的空仓就会一直持有。
当涨到最高点7800的时候,总共亏损:
( 7800 - 6348 ) / 6348 * 3 = 69%
按照bitfinex交易所亏损50%就强平的交易规则,早就已经爆仓了!
10月16日,周二,上午
到了第二天,还是很后怕。
想想当时真的是命大啊,怎么就突然看了眼服务器呢。要是当时不看,最终爆仓,那就是半年白干,说出去也被人笑死。
计划着周末去龙华寺烧香。
10月16日,周二,下午
下午,写代码的小哥很小心的跟我说,问题查出来了。
我仔细看了一遍之后,真的是哭笑不得。
因为这个问题,我之前在课程里面就给大家讲过,当时还重点提了一下。
下面是当时课程中的代码截图:
这两行代码很简单,大家都看的懂。作用是从okex交易所获取到最新的行情数据。
虽然这代码和案发现场的bitfinex交易所实盘代码不一样,但讲的问题是一样的。
图中第10行代码中的那串地址。是okex交易所的行情接口地址,大家可以在浏览器中输入这个地址,就能看到莱特币LTC最新的价格。
https://www.okex.com/api/v1/ticker.do?symbol=ltc_usdt
第13行代码的作用是获取行情接口返回的数据。其中有一个关键的参数叫做timeout。
当时在上课的时候我特意提到了这个timeout参数一定要加。
当我们向交易所服务器发送请求获取数据时,理论上对方应该很快返回信息。但由于网络情况复杂、交易所服务器故障等原因,有可能对方不会马上回复。
此时我们的程序就会等待。加上这个参数timeout=15就表明,我们最多等待15秒。15秒之后还没有返回,程序就会报错终止。
如果不加这个参数,程序默认会一直等下去。若消息一直不返回,就会一直等到地老天荒。此时整个程序也就和停止了没有差别。
而最终的问题就是,写代码小哥获取bitfinex持仓数据的那行代码,居然没有加上timeout参数。
恰好这次又碰上bitfinex服务器不稳定,一直没有返回数据,而我的程序就在那里一直等着。
哎,我学生都知道的东西,我自己招的写代码小哥居然不知道。
事后措施
出了问题就要解决,以后不能再犯。
原先程序每15分钟就会通过钉钉发送一次持仓简报到我手机,如果不发就说明程序停止了。后来因为长时间稳定,我嫌烦,就停了。
现在我已经乖乖的打开了,再烦我也不会关闭。
bitfinex交易所我开始交易的比较早,和交易所对接的代码都是自己写的,并没有使用课程里面推荐的ccxt。那些觉得ccxt不好,想着自己对接交易所的同学,还是省省吧。
你的代码是不可能比这些开源框架还稳健的。ccxt里面默认就写好了,所有情况下timeout为10秒。
最后,写这行代码的小哥,首先年底奖金就不要想了,其次可以考虑换个工作了。
对本文研究有自己的想法的朋友,可以在评论区留言。关于文中的代码、数据,以及下期《量化小讲堂》想了解的内容,也可以加我个人微信xbx9585交流,欢迎浏览我的朋友圈内容。
如果你想入门量化,但是始终找不到方向,可以加入我的知识星球。我会在里面解答你的问题,分享我的感悟,不论是投资、技术,还是职业选择、思维方式。