Loading ...

98年本科生的炒币和量化之路

Author: 小天才收割机, Created: 2020-03-07 18:11:51, Updated: 2020-03-07 20:29:07

98年本科生的炒币和量化之路

1.入币圈

我98年,目前某985本科计算机大四在读,接下来会继续本校读研。

接触币圈是在2017年的9月1号,对,这个日子我记得十分清楚,因为三天之后就是轰动币圈的“94”事件,央行等五部委联合发文防范ICO风险,币价腰斩。

9月1号,我在一个微信公众号上看到了一篇介绍比特币的视频(好像是王自如的视频),对这个东西感到十分好奇,于是下载了火币,充了100块钱进去,一看比特币价格,3w多人民币,吓到我了,所以就买了一点LTC,当时好像一个120人民币左右,接下来一晚上就盯着账户里那几毛钱一块钱的浮动,以及在加的几个币圈qq群里的看人聊天。盯了一晚上,群友们都说要涨,我也觉得不够刺激,就又充了几千块钱进去,那时候火币还是银行卡充值,过了很久都没到账,我慌了,向群友求助,打客服电话,过了段时间总算是到账了,然后我又全买了LTC。

9月4号,央行一发文,币价跳水,吓得我赶紧割肉离场,然后慢慢地看着币价腰斩,那时候火币等等国内的交易所都不能注册了,国内外交易所差价巨大,肥了一波搬砖的人。

后来我就提现回学校了,也没有再冲回去抄底(新韭菜只知道追涨杀跌),但是还是关注着币圈的动向,时不时看看几个qq群里面大家在聊什么。一晃就到了12月,牛市最疯狂的月份,币安上波场涨了几百倍,其他各种币也都是翻倍地涨,50%以下都不能算波动,我心动了,然后充了几千块钱,然后各种追涨杀跌奇葩操作,眼睁睁看着各种币飞涨但是自己啥也没赚到。

18年1月,轰轰烈烈的牛市开始落幕,我注册了okcoin,开始玩合约,不得不说是真的刺激,20倍的杠杆,翻倍,爆仓,如此往复,盯着k线,夜夜不眠。

和几乎所有合约赌徒一样,到头来我也是爆仓收尾。但是不得不说,这段经历让我学到了很多金融知识,我以前是连k线都不会认的。

2.搞量化

在经历了很多个盯盘的不眠之夜后,作为一个学计算机的人,我开始思考有没有办法让程序去替我交易,这样我就可以安心睡觉了。

其实那个时候我就找到fmz了(当时叫botvs),但是当时我太菜鸡,搞了半天硬是没搞懂怎么用这个平台,所以就放弃了。

后来我就开始自己对接ok的api写机器人(github:https://github.com/ccyanxyz/okex),写了些双均线、网格之类的策略,虽然并没有怎么赚到钱,但是也算是一脚踏入了量化大门,认识了各种技术指标,学会了用talib库。到后来因为学校事情也很多就没有继续做下去,机器人也停了,又回归了手动看盘操作模式,但是频率已经很低了,时不时操作一两笔。

3.用FMZ

兜兜转转一圈之后,我还是回到了fmz,但是因为已经有了自己手写策略的经验,这次上手fmz就非常快速了。我发现fmz对接了几乎所有主流交易所,把交易、账户等等操作都统一封装起来,又方便又好用,写一份代码就可以到处跑了,对于一个花了老大力气手动封装过交易所api的人来说,简直就像是找到了救星。

我在GitHub上找到了fmz公开的策略仓库(https://github.com/fmzquant/strategies),就像找到了宝藏一样,花了一两个晚上翻遍了所有的策略,复制过来回测,读策略逻辑,尝试改进,但不得不说,我还是太菜,看遍了策略也并没有写出一台“印钞机”。

后来我也仔细冷静下来思考了一下,现在的币圈已经不是17年的币圈了,不会有2000块到2000w的神话故事了,就我这种穷学生这点本钱,想炒币翻身已经是天方夜谭了,所以我放弃了盯着币价追涨杀跌,也放弃了企图写出“印钞机”策略这种不切实际的想法,转而开始在fmz上众包区发广告接单帮人写策略,老老实实赚点辛苦钱。

到现在,我也已经给人写过很多策略了,过程其实也相当曲折,经常有人拿着一些不成熟的想法或者完全不能赚钱的策略来找我实现,很多人需求也描述不清楚,最后做出来的策略测来测去不赚钱还要扯皮,所以我把我的广告改成了下面这样,定好接单规则和标准,也让自己少烦心一点。

本来我的接单频率是越来越低的,因为学校事情多,很多人我都拒了,但是2月fcoin跑路了,卷走了我大部分的资产(不过我也没多少钱),于是最近不得不开始来者不拒,接单赚钱了。

我的策略库:

今天逛fmz的时候还发现一个有点无语的事情,某位接单“友商”居然连我的接单广告都要抄袭,如下所示,是他的广告:

就把我的“熟悉”改成了“精通”,然后起步价降低了(嗅到了一丝恶性竞争的味道)。

我为什么没有说我“精通”FMZ呢,不知道大家有没有听过一个梗,“没有人能够精通C++”,哈哈哈哈,所以我的简历等等相关技能介绍都习惯了写“熟悉”。

4.一个套利思路

最近研究了一些套利的策略,现货对冲、期现、跨期、三角套利等等,这两天看见一个之前没见过(可能是我孤陋寡闻)的套利思路,在这里也分享一下。

假设现在外汇市场有几个交易对价格如下:

USDollar/BritishPound 0.5
BritishPound/FrenchFranc 10.0
FrenchFranc/USDollar 0.21

这种情况下,不考虑手续费,假如我本来有1USD,我可以先换成BritishPound,再换成FrenchFranc,然后再换成USD,一遍下来从1USD变成了 1x0.5x10.0x0.21=1.05USD,利润0.05USD。

上面举的这个例子是存在套利机会的,下面这个就没有:

USDollar/BritishPound 0.5
USDollar/FrenchFranc 4.9
BritishPound/FrenchFranc 10.0
BritishPound/USDollar 1.99
FrenchFranc/BritishPound 0.09
FrenchFranc/USDollar 0.19

那在偌大的市场中,我们怎么判断到底有没有套利机会呢?

这个问题可以抽象成一个有向图的最短路径问题,以每一个币种作为一个顶点,以兑换价格作为边的权重,构成一个有向图,然后从一个顶点出发(比如USD),在图里面寻找一个可以套利的环形路径。

上面的例子是从一道OJ题目里来的(http://poj.org/problem?id=2240),解题思路可见此处:http://hehejun.blogspot.com/2018/10/poj2240-arbitrage.html

于是我最近就在想能不能做一个策略去捕捉套利机会并进行套利,去GitHub上一搜果然已经有了实现:https://github.com/wardbradt/peregrine ,这个项目里面是将这个套利问题抽象成了带负权边的有向图最短路径问题,和上述OJ题的解题思路不一样,带负权边的有向图最短路径用的是Bellman-ford算法,有兴趣的可以去研究研究。

我自己也在fmz上简单做了一个实现,参照的是OJ题对应的解题思路,还没有写完,也不能保证正确性,贴出来,抛砖引玉吧:

var coins = {
    EMPTY: 0,
};
var price = {};

function get_coins() {
    for(var i = 0; i < exchanges.length; ++i) {
        var base = _C(exchanges[i].GetCurrency);
        var quote = _C(exchanges[i].GetQuoteCurrency);
        var len = Object.keys(coins).length;
        if(!coins.hasOwnProperty(quote)) {
            coins[quote] = len;
            len += 1;
        }
        if(!coins.hasOwnProperty(base)) {
            coins[base] = len;
            len += 1;
        }
    }
}

function get_graph() {
    var graph = [];
    for(var i = 0; i < exchanges.length; ++i) {
        var ticker = _C(exchanges[i].GetTicker);
        var base = _C(exchanges[i].GetCurrency);
        var quote = _C(exchanges[i].GetQuoteCurrency);
        graph.push({
            from: coins[base],
            to: coins[quote],
            weight: ticker.Buy
        });
        price[base + quote] = ticker.Buy;
        graph.push({
            from: coins[quote],
            to: coins[base],
            weight: 1 / ticker.Sell
        });
        price[quote + base] = 1 / ticker.Sell;
    }
    return graph;
}

function bfm(graph, initAmount, feeRate) {
    var dist = [];
    var pre = [];
    var i;
    var j;
    var fee = 0;
    for(i = 0; i < Object.keys(coins).length; ++i) {
        dist.push(0);
        pre.push(-1);
    }
    dist[1] = initAmount;
    for(i = 0; i < Object.keys(coins).length - 1; ++i) {
        for(j = 0; j < graph.length; ++j) {
            var from = graph[j].from;
            var to = graph[j].to;
            var rate = graph[j].weight;
            if(dist[from] * rate > dist[to]) {
                dist[to] = dist[from] * rate;
                pre[to] = from;
            }
        }
    }
    if(dist[1] <= initAmount) {
        return false;
    }
    var path = [];
    var top = pre[1];
    var coin_keys = Object.keys(coins);
    path.push({
        from: coin_keys[top],
        to: coin_keys[1],
        rate: price[coin_keys[top] + coin_keys[1]]
    });
    while(top != 1) {
        var temp = top;
        top = pre[top];
        path.push({
            from: coin_keys[top],
            to: coin_keys[temp],
            rate: price[coin_keys[top] + coin_keys[temp]],
        });
    }
    path.reverse();
    
    fee = path.length * feeRate * initAmount;
    if(dist[1] - initAmount <= fee || path.length == 0) {
        return false;
    }
    return path;
}

function onTick() {
    var graph = get_graph();
    var account = _C(exchanges[0].GetAccount);
    var balance = account.Balance;
    
    var path = bfm(graph, balance, 0);
    if(!path) {
        return;
    }
    Log(path);
    
    // buy & sell follow the path 
    ...
}

function main() {
    get_coins();
    
    while(1) {
        onTick();
    }
}

5.总结

总结一下,fmz是个好平台,好用又靠谱,闷声发大财,希望fmz越来越好,我嘛,毕业继续读研(也是区块链方向),然后继续在fmz上搬搬砖赚点零花钱。

(写于2020年3月7日下午,刚帮人写完一个策略,看见自己fmz余额不足,过来骗点稿费哈哈哈哈)

微信:C790266922


Related

More

小小梦 满满的干货分享,赞!

小草 感谢分享

b6712 可以借鉴在币圈用,但是外汇套利在国际金融里是本科生的作业,可见已经没有套利的可能。

Peppa 干货满满,感谢分享, 通过量化来学习金融知识,是投入最少,收获最大的一条 Geek 之路.

John 幸苦幸苦。

小天才收割机 嗯嗯,共勉