主页 > imtoken不让安装 > 给比特币矿工的礼物:价值平均销售策略

给比特币矿工的礼物:价值平均销售策略

imtoken不让安装 2023-03-09 07:46:49

以下是正文:

在之前的文章《价值投资策略在比特币市场的应用》中,我们为比特币忠实粉丝(坚定看好比特币市场)提供了一条出路,希望阅读我文章的朋友在前期会收币,在这波大行情中赚了不少钱。

本文将介绍另一种策略,该策略为比特币市场中的另一类卖方参与者(矿工)提供了一种方式来最大化出售硬币的利润。

一、策略介绍

sitebishijie.com 比特币价格今日的价格_外国的比特币便宜中国的比特币贵为什么?_比特币起始价格

价值平均销售策略是一种长期销售策略。提前确定各期的预期总仓位(一般逐期递减)。根据持仓的预期市值与实际市值的差额,确定买入/卖出的标的的数量。比传统的固定目标数量出售更加灵活,适合矿工使用。

下图是该策略下用户持有的比特币市值占净资产比例的变化。我们可以看到它是一个线性递减的过程:

二、实现方法

外国的比特币便宜中国的比特币贵为什么?_比特币起始价格_sitebishijie.com 比特币价格今日的价格

首先,制定我们希望在每个时期达到的总位置。既然是卖出策略,这个头寸应该逐渐减少。例如,初始持仓为10万元,总净值为20万元,则初始持仓比例为50%。设定后比特币起始价格,各期标的头寸占资产总净值的比例降低1%。那么第一阶段的目标位置比例为49%,第二阶段为48%,以此类推。现有头寸会随着基础价格的波动而变化,因此每个时期的卖出比例都会发生变化。比如第一期,由于价格上涨,持仓从50%增加到51%。为了将仓位调整到49%的目标仓位,我们需要卖出2%仓位的目标。第二期,由于价格下跌,持仓从49%下降到48.5%。为了将仓位调整到 48% 的目标仓位,我们不得不卖出 0.5% 的仓位目标。可以看出,当价格上涨时,卖出更多;当价格下跌时,销售量减少。如果价格下跌太多,为了调整到目标位置,甚至需要反向买入目标。价格高的时候多卖,价格低的时候少卖甚至买。这无形中帮助我们进行了类似于“高卖低买”的操作。

三、优势

相对于传统的固定数量订单,价值平均订单更加灵活。该策略的本质是通过投资标的价格变化来调整每个时期的销售数量。此外,价值平均法还具有购买机制。如果某个时期的价格突然暴跌,可能会导致该时期的仓位低于目标仓位。这时候,为了达到目标仓位,我们不会继续卖出,而是买入。以足够低的价格购买,有助于稀释持仓成本,并在后续销售中获得更大的回报。定额卖出只卖不买,持有标的物只减不增。这是两者最大的区别,也是平均值顺序的优势。

四、缺点

外国的比特币便宜中国的比特币贵为什么?_比特币起始价格_sitebishijie.com 比特币价格今日的价格

由于每期要卖出的数量不是一个固定的或可预测的值,会给投资者带来一些麻烦。卖出金额是按期间计算的,一个期间所需的金额突然增加(由价格暴涨引起)可能会给投资者带来意想不到的压力。

五、策略源码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 策略代码总共分为三大部分,1)PARAMS变量 2)intialize函数 3)handle_data函数
# 请根据指示阅读。或者直接点击运行回测按钮,进行测试,查看策略效果。
# 策略名称:价值平均定卖策略
# 策略详细介绍:https://zhuanlan.zhihu.com/p/24513918
# 关键词:卖出策略、矿工首选、高抛低吸、分批卖出。
# 方法:
# 1)确定每个周期的目标仓位;
# 2)每一期将仓位调整至目标仓位;
# 阅读1,首次阅读可跳过:
# PARAMS用于设定程序参数,回测的起始时间、结束时间、滑点误差、初始资金和持仓。
# 可以仿照格式修改,基本都能运行。如果想了解详情请参考新手学堂的API文档。
PARAMS = {
    "start_time": "2014-05-01 00:00:00",
    "end_time": "2014-11-01 00:00:00",
    "slippage": 0.00001,
    "account_initial": {"huobi_cny_cash": 0,
                        "huobi_cny_btc": 1000},
}
# 阅读2,遇到不明白的变量可以跳过,需要的时候回来查阅:
# initialize函数是两大核心函数之一(另一个是handle_data),用于初始化策略变量。
# 策略变量包含:必填变量,以及非必填(用户自己方便使用)的变量
def initialize(context):
    # 以日为单位进行回测
    context.frequency = "1d"
    # 设定以比特币为基准
    context.benchmark = "huobi_cny_btc"
    # 设定操作的标的为比特币
    context.security = "huobi_cny_btc"
    # 设置策略参数
    # 每个frequency的持仓占净资产减少的比例(%)
    context.user_data.pos_value_decrease_per_period = 0.5464
    # 记录下当前处于第几个投资周期
    context.user_data.invest_period_count = 0
    # 设置策略期望初始仓位(%)
    context.user_data.initial_pos_ratio = 100
# 阅读3,策略核心逻辑:
# handle_data函数定义了策略的执行逻辑,按照frequency生成的bar依次读取并执行策略逻辑,直至程序结束。
# handle_data和bar的详细说明,请参考新手学堂的解释文档。
def handle_data(context):
    # 取得最新价格
    latest_close_price = context.data.get_current_price(context.security)
    # 计算当前实时仓位(元)
    current_pos_value = getattr(context.account, context.security) * latest_close_price
    # 计算当前实时仓位比例(%)
    current_pos_ratio = current_pos_value / context.account.huobi_cny_net * 100
    if context.user_data.initial_pos_ratio is None:
        context.user_data.initial_pos_ratio = current_pos_ratio
    # 计算当前期望仓位比例 (%)
    expected_pos_ratio = context.user_data.initial_pos_ratio - context.user_data.pos_value_decrease_per_period * (context.user_data.invest_period_count + 1)
    # 计算当前期望仓位 (元)
    expected_pos_value = (expected_pos_ratio / 100) * context.account.huobi_cny_net
    # 当前账户持有的人民币现金
    current_cash_pos = context.account.huobi_cny_cash
    # 当前账户持有的数字货币数量
    current_sec_pos = getattr(context.account, context.security)
    # 计算本期需要卖出的数量(若为负,则需要买入数字货币)
    quantity_to_sell = quantity_to_sell_fn(context, expected_pos_value, current_pos_value, current_cash_pos, current_sec_pos, latest_close_price)
    context.log.info("目标仓位: %s 元, 现有仓位: %s 元" % (expected_pos_value, current_pos_value))
    # 更新投资周期至下一期
    context.user_data.invest_period_count += 1
    if quantity_to_sell > 0:
        # 需要卖出仓位,市价单卖出
        context.log.info("正在卖出 %s" % context.security)
        context.log.info("卖出数量为 %s" % quantity_to_sell)
        context.order.sell(context.security, quantity=str(quantity_to_sell))
    elif quantity_to_sell < 0:
        # 需要买入仓位,计算需要买入的金额,市价单买入
        cash_to_buy = -1 * quantity_to_sell * latest_close_price
        context.log.info("正在买入%s" % context.security)
        context.log.info("下单金额为 %s 元" % cash_to_buy)
        context.order.buy(context.security, cash_amount=str(cash_to_buy))
    else:
        context.log.info("无加减仓操作")
def quantity_to_sell_fn(context, expected_pos_value, current_pos_value, current_cash_pos, current_sec_pos, latest_close_price):
    # 高于目标仓位,需要卖出减仓
    if current_pos_value > expected_pos_value:
        result = current_pos_value - expected_pos_value
        pos_qty_to_sell = result / latest_close_price
        # 当前仓位可以满足卖出需求
        if pos_qty_to_sell <= current_sec_pos:
            context.log.info("需要卖出,来达到目标仓位")
            return pos_qty_to_sell
        else:  # 仓位不足,卖出全部仓位
            context.log.warn(
                "现有仓位不足以满足目标仓位, 需要卖出仓位:%.2f, 现有仓位:%.2f. 本次将卖出所有仓位" % (pos_qty_to_sell, current_sec_pos))
            return current_sec_pos
    # 低于目标仓位,需要买入加仓
    elif current_pos_value < expected_pos_value:
        result = expected_pos_value - current_pos_value
        if result < current_cash_pos:
            context.log.info("需要买入,来达到目标仓位")
            quantity_to_buy = result / latest_close_price
            return -1 * quantity_to_buy
        else:  # 现金不足,投入全部现金加仓
            context.log.warn(
                "现金不足以满足目标仓位, 需要现金:%.2f, 现有现金:%.2f. 本次将用完全部现金" % (result, current_cash_pos))
            return -1 * current_cash_pos / latest_close_price
    else:
        return 0

六、回测

sitebishijie.com 比特币价格今日的价格_比特币起始价格_外国的比特币便宜中国的比特币贵为什么?

从策略源码我们可以很容易的看出策略的回测参数如下:

回测时长一共184天,按天回测,初始账户有1000个1比特币,没有现金,所以初始持仓100%,目标是年底卖光所有比特币回测,让仓位降到0%比特币起始价格,所以每个周期(天)的仓位减少比例应该是100% / 184 = 0.5464%。

回测结果如下:

外国的比特币便宜中国的比特币贵为什么?_比特币起始价格_sitebishijie.com 比特币价格今日的价格

与基准相比,该策略的性能更稳定,回撤更小。相对较大的超额收益。在整个市场出现反转下跌的情况下,这种策略可以控制用户净资产下降的速度。而且,因为这是一种卖出策略,所以账户里的钱是不断增加的,是锁定收益。投资者可以根据个人需求将现金投入到其他产品或策略中,无需一直保留在账户中。因此,账户的实际收益率被低估了。这个策略不是教你如何“投资”,而是教你如何“提现”,更合理地变现自己持有的数字货币。因此非常适合数字货币生产者(矿工)使用。

七、总结

价值平均挂单策略是对固定数量挂单的改进,可以在无形中帮助投资者“高卖低买”。行情确定交易数量。非常适合挖矿的矿工习惯于更合理的变现手中的数字货币。