美文网首页区块链研习社金马带你定投区块链
聪明的投资者在区块链量化领域大展身手

聪明的投资者在区块链量化领域大展身手

作者: 354052fde259 | 来源:发表于2018-11-07 14:28 被阅读4次

    NO.1

    沃伦 · 巴菲特的导师本杰明 · 格雷厄姆曾经在《聪明的投资者》一书中,曾经提到过一种股票债券动态平衡的交易模式。

    这种交易模式非常简单:

    把手中 50% 的资金投资于股票基金,剩下 50% 投资于债券基金。即股票和债券两者各占一半。

    根据固定间隔时间或市场变化进行一次资产再平衡,使股票资产和债券资产的比例恢复到初始的 1:1。

        这就是整个策略的全部逻辑,包含了什么时候买卖,以及买卖多少。

    NO.2

    在这个方法中,债券基金的波动率其实很小,远远低于股票波动率,所以债券在这里被当做『参照锚』,也就是说,用债券来衡量股票究竟是涨得太多了,还是涨得太少了。

    如果,股票价格上涨,会使得股票的市值大于债券的市值,当两者市值比率超过设定的阈值时,则对总仓位进行重新调整,卖出股票,并且买入债券,使股债市值比例恢复至初始的 1:1。

    反之,股票价格下跌,会使得股票的市值小于债券的市值,当两者市值比率超过设定的阈值时,则对总仓位进行重新调整,买入股票,并且卖出债券,使股债市值比例恢复至初始的 1:1。

    就这样,在动态平衡股票和债券之间的比例,就够享受到股票成长的果实,并且减少了资产波动率。作为价值投资的先驱,格雷厄姆为我们提供了一个很好的思路。既然这是一个完整的策略,为何我们不把它用在数字货币上呢?

    NO.3

    策略逻辑

    按照当前的 BTC 的价值,账户余额保留¥4500 现金和 0.1个 BTC,即现金和BTC 市值的初始比例是 1:1。

    如果 EOS 的价格上涨至¥6000,即 BTC 市值大于账户余额,并且其之间的差超过设定的阈值,就卖掉(6000-4500)/6000/2个币。说明 BTC 升值了,把钱兑换回来。

    如果 BTC 的价格下跌至¥4000,即 BTC市值小于账户余额,并且其之间的差超过设定的阈值,就买入(4500-4000)/4000/2个币。说明 BTC 贬值了,把 BTC 买回来。

    就这样,不管 BTC 是升值还是贬值,始终动态保持账户余额和 BTC 的市值相等。如果 BTC 贬值了就买一些,等再涨回来,就再卖一些,就好像天平一样。

    NO.4

    那么,如何用代码去实现呢?

    我们以博特bqt89交易平台为例,首先让我们看一下策略框架:

    // 策略参数var threshold = 0.05;

    // 阈值var LoopInterval = 60;

    // 轮询间隔(秒)var MinStock = 0.001;

    // 最小交易量var XPrecision = 4;

    // 量精度var ZPrecision = 8;

    // 价格精度

    // 撤单函数function CancelPendingOrders() {

    }// 下单函数function onTick() {

    }// 主函数function main() {    // 过滤非重要信息

    SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");    while (true) { // 轮询模式

    if (onTick()) { // 执行 onTick 函数

    CancelPendingOrders(); // 取消未成交的挂单

    }

    Sleep(LoopInterval * 1000); // 休眠

    }

    }

    整个策略框架其实很简单,一个 main 主函数、一个 onTick 下单函数、一个 CancelPendingOrders 函数、以及必要参数。利用博特bqt89量化交易平台就可以完美实现。

    NO.5

    下单模块

    // 下单函数function onTick() {   var acc = _C(exchange.GetAccount); // 获取账户信息

    var ticker = _C(exchange.GetTicker); // 获取 Tick 数据

    var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差

    // 账户余额与当前持仓价值的差值的 0.5倍

    var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;    var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额

    LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间

    if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值

    return false; // 返回 false

    }    if (ratio > 0) { // 如果 ratio大于 0

    var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格

    var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量

    if (buyAmount < MinStock) { // 如果下单量小于最小交易量

    return false; // 返回 false

    }

    exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单

    } else {        var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格

    var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量

    if (sellAmount < MinStock) { // 如果下单量小于最小交易量

    return false; // 返回 false

    }

    exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单

    }    return true; // 返回 true}

    下单交易逻辑条理清晰,所有的注释都已经写到代码里面了。

    主要流程如下:

    获取账户信息。

    获取 Tick 数据。

    计算 Tick 数据买卖价差。

    计算账户余额和 BTC 市值价差。

    计算买卖条件、下单价格、下单量。

    下单,并返回 true。

    NO.6

    撤单模块

    // 撤单函数function CancelPendingOrders() {

    Sleep(1000); // 休眠 1秒

    var ret = false;    while (true) {        var orders = null;        // 持续获取未成交订单数组,如果返回异常,则继续获取

    while (!(orders = exchange.GetOrders())) {

    Sleep(1000); // 休眠 1秒

    }        if (orders.length == 0) { // 如果订单数组为空

    return ret; // 返回撤单状态

    }        for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组

    exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单

    ret = true;            if (j < (orders.length - 1)) {

    Sleep(1000); // 休眠 1秒

    }

    }

    }

    }

    撤单模块就更简单了,步骤如下:

    撤单前先等待 1 秒,个别交易所,你懂的。

    持续获取未成交订单数组,如果返回异常,则继续获取。

    如果未成交订单数组为空,即时返回撤单状态。

    如果有未成交的订单,则遍历整个数组,并依次根据订单号撤单。

    NO.7

    策略全部源码

    // 回测环境/*backtest

    start: 2018-01-01 00:00:00

    end: 2018-08-01 11:00:00

    period: 1m

    exchanges: [{"eid":"OKCoin_EN","currency":"BTC"}]

    */// 撤单函数function CancelPendingOrders() {

    Sleep(1000); // 休眠 1秒

    var ret = false;    while (true) {        var orders = null;        // 持续获取未成交订单数组,如果返回异常,则继续获取

    while (!(orders = exchange.GetOrders())) {

    Sleep(1000); // 休眠 1秒

    }        if (orders.length == 0) { // 如果订单数组为空

    return ret; // 返回撤单状态

    }        for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组

    exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单

    ret = true;            if (j < (orders.length - 1)) {

    Sleep(1000); // 休眠 1秒

    }

    }

    }

    }// 下单函数function onTick() {    var acc = _C(exchange.GetAccount); // 获取账户信息

    var ticker = _C(exchange.GetTicker); // 获取 Tick 数据

    var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差

    // 账户余额与当前持仓价值的差值的 0.5倍

    var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;    var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额

    LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间

    if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值

    return false; // 返回 false

    }    if (ratio > 0) { // 如果 ratio大于 0

    var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格

    var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量

    if (buyAmount < MinStock) { // 如果下单量小于最小交易量

    return false; // 返回 false

    }

    exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单

    } else {        var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格

    var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量

    if (sellAmount < MinStock) { // 如果下单量小于最小交易量

    return false; // 返回 false

    }

    exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单

    }    return true; // 返回 true}// 主函数function main() {    // 过滤非重要信息

    SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");    while (true) { // 轮询模式

    if (onTick()) { // 执行 onTick 函数

    CancelPendingOrders(); // 取消未成交的挂单

    Log(_C(exchange.GetAccount)); // 打印当前账户信息

    }

    Sleep(LoopInterval * 1000); // 休眠

    }

    }

    借助博特bqt89量化交易平台,短短 80 行代码,一个完整的区块链 BTC 动态平衡策略应运而生。

    NO.8

    动态平衡策略

    动态平衡策略只有一个核心参数(threshold 阈值),是一个很简单的投资方法,追求的不是超额的收益,而是稳健的收益。与趋势策略相反,动态平衡策略却是逆势而动。在市场热的时候减仓降温,市场冷清的时候加仓埋伏从而形成动态平衡。

    其实,动态平衡策略正是秉承了价格不可预测的观念,同时又捕捉价格波动的一门手艺。动态平衡策略的关键核心在设定和调整资产配置比例,还有触发阈值。

    鉴于篇幅原因,一篇文章没办法做到面面俱到,要知道文字之外,存乎一心。动态平衡策略最重要的是投资思想,你甚至可以把本篇中的单个 BTC 资产换成其他区块链资产组合同样适用。

    结束本篇:

    币圈市场并非一个能精确衡量价值的『 称重计 』,相反它是一个『 投票机 』,不计其数的人所做出的决定是一种理性和感性的掺杂物,有很多时候这些抉择和理性的价值评判相去甚远。而投资的秘诀就是在价格远远低于内在价值时投资,并且相信市场趋势会回升。

    博特目前已经全职投身区块链领域,并且跟团队一直研究币圈量化交易,总结出几套好用的策略。

    对区块链或者币 圈量化交易感兴趣的朋友可以关注并转发

    然后添加V XIN  QB 133 9284  4088   免 费 领取 博特量化交易软件跟几套专业策略 。

    免责声明:信息仅供参考,不构成投资及交易建议。投资者据此操作,风险自担。

    相关文章

      网友评论

        本文标题:聪明的投资者在区块链量化领域大展身手

        本文链接:https://www.haomeiwen.com/subject/acamxqtx.html