主页 > imtoken不让安装 > 给比特币矿工的礼物:价值平均销售策略
给比特币矿工的礼物:价值平均销售策略
以下是正文:
在之前的文章《价值投资策略在比特币市场的应用》中,我们为比特币忠实粉丝(坚定看好比特币市场)提供了一条出路,希望阅读我文章的朋友在前期会收币,在这波大行情中赚了不少钱。
本文将介绍另一种策略,该策略为比特币市场中的另一类卖方参与者(矿工)提供了一种方式来最大化出售硬币的利润。
一、策略介绍
价值平均销售策略是一种长期销售策略。提前确定各期的预期总仓位(一般逐期递减)。根据持仓的预期市值与实际市值的差额,确定买入/卖出的标的的数量。比传统的固定目标数量出售更加灵活,适合矿工使用。
下图是该策略下用户持有的比特币市值占净资产比例的变化。我们可以看到它是一个线性递减的过程:
二、实现方法
首先,制定我们希望在每个时期达到的总位置。既然是卖出策略,这个头寸应该逐渐减少。例如,初始持仓为10万元,总净值为20万元,则初始持仓比例为50%。设定后比特币起始价格,各期标的头寸占资产总净值的比例降低1%。那么第一阶段的目标位置比例为49%,第二阶段为48%,以此类推。现有头寸会随着基础价格的波动而变化,因此每个时期的卖出比例都会发生变化。比如第一期,由于价格上涨,持仓从50%增加到51%。为了将仓位调整到49%的目标仓位,我们需要卖出2%仓位的目标。第二期,由于价格下跌,持仓从49%下降到48.5%。为了将仓位调整到 48% 的目标仓位,我们不得不卖出 0.5% 的仓位目标。可以看出,当价格上涨时,卖出更多;当价格下跌时,销售量减少。如果价格下跌太多,为了调整到目标位置,甚至需要反向买入目标。价格高的时候多卖,价格低的时候少卖甚至买。这无形中帮助我们进行了类似于“高卖低买”的操作。
三、优势
相对于传统的固定数量订单,价值平均订单更加灵活。该策略的本质是通过投资标的价格变化来调整每个时期的销售数量。此外,价值平均法还具有购买机制。如果某个时期的价格突然暴跌,可能会导致该时期的仓位低于目标仓位。这时候,为了达到目标仓位,我们不会继续卖出,而是买入。以足够低的价格购买,有助于稀释持仓成本,并在后续销售中获得更大的回报。定额卖出只卖不买,持有标的物只减不增。这是两者最大的区别,也是平均值顺序的优势。
四、缺点
由于每期要卖出的数量不是一个固定的或可预测的值,会给投资者带来一些麻烦。卖出金额是按期间计算的,一个期间所需的金额突然增加(由价格暴涨引起)可能会给投资者带来意想不到的压力。
五、策略源码
#!/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
六、回测
从策略源码我们可以很容易的看出策略的回测参数如下:
回测时长一共184天,按天回测,初始账户有1000个1比特币,没有现金,所以初始持仓100%,目标是年底卖光所有比特币回测,让仓位降到0%比特币起始价格,所以每个周期(天)的仓位减少比例应该是100% / 184 = 0.5464%。
回测结果如下:
与基准相比,该策略的性能更稳定,回撤更小。相对较大的超额收益。在整个市场出现反转下跌的情况下,这种策略可以控制用户净资产下降的速度。而且,因为这是一种卖出策略,所以账户里的钱是不断增加的,是锁定收益。投资者可以根据个人需求将现金投入到其他产品或策略中,无需一直保留在账户中。因此,账户的实际收益率被低估了。这个策略不是教你如何“投资”,而是教你如何“提现”,更合理地变现自己持有的数字货币。因此非常适合数字货币生产者(矿工)使用。
七、总结
价值平均挂单策略是对固定数量挂单的改进,可以在无形中帮助投资者“高卖低买”。行情确定交易数量。非常适合挖矿的矿工习惯于更合理的变现手中的数字货币。