Skip to main content

面對比特幣減半該如何調整交易策略

· One min read
Yumi
Researcher

一、ETF 的巨大需求量

市場參與者經常將比特幣減半視為多頭市場的前兆,因為它旨在降低新比特幣的產生速度增加稀缺性,但目前的市場狀況與歷史常態不同。隨著減半的臨近,且 ETF 不斷增長的需求,新開採並釋放到流通中的比特幣的影響變得越來越小。

以下圖片是 ETF 和比特幣的每日交易量,可以看出 ETF 是比特幣的好幾倍。

橘色 : 比特幣

藍色 : ETF

二、長期持有人對比特幣的影響

比特幣交易除了礦工的貢獻外,主要供應來源來自長期持有人(LTH),他們出售與否將影響整個市場供求。

LTH : 被 Glassnode 定義為持有比特幣超過 155 天,觀察到超過 155 天的持有人的比特幣不太會因市場波動而被出售,這說明持有人對長期價值有更強的信念。

1、長期持有人市場通貨膨脹率指標

它顯示了 LTH 相較於每日礦工發行量的比特幣累積的年化率。

  • 我們將相對於流通供應量向礦工發行的比特幣視為名目通膨率(黃色軌跡),被認為是持續的賣方壓力。

  • 我們將長期持有者供應量減市場流通供應量再進行年化,作為市場需求的衡量標準。將該值乘以負 1,

    該值為負看漲,為正看跌

我們將此 LTH 累積率添加到名目通膨率中,以計算市場通膨率(綠色跡線)。我們可以看到的是:

  • 在熊市後期 2015 年,市場通膨率嚴重為負(可用供應處於通貨緊縮狀態),達到-14%至-15%。這意味著 LTH 每年累積的流通供應量超過礦工發行量的 15%。
  • 在牛市頂峰 2018 年,市場通膨達到峰值,高於名目通膨,這表明 LTH 透過撤資顯著增加了賣方壓力(可用供應的通膨率非常高)。這最終導致供應過剩並引發熊市
  • 目前由負轉正中,可能為多頭轉空頭的現象。

2、減半是個拋售新聞事件嗎

減半通常被解讀為比特幣看漲訊號,但對市場的直接影響卻很大程度是受到心理的影響

2016 年,市場減半使價格從 $760 跌至 $540,這次下跌展示了減半引發立即市場波動的影響

image 2.png

2020 年減半沒有出現大幅拋售,由於減半前價格回升,表示市場受到更廣泛的經濟狀況市場情緒影響。

image 3.png

三、若在減半前達到幣價的歷史新高會帶來新的情況

但如果與 2021 年 4 月的 ATH 保持一致,週期的進展就會和歷史發展一樣。

ATH : 「all time high」意思為幣價創造歷史新高。

\

總結 : 此週期有什麼不同

以週期性模式來看,在減半之前突破 ATH 並不意味著我們已經偏離了比特幣的歷史規範。關鍵是要評估上一周期牛市見頂的時間,發生在 2021 年 4 月

從技術上講,比特幣的價格在 2021 年 11 月上漲。基於以下原因:在 4 月高點後,絕大多數技術指標市場情緒投資者行為顯示出典型的熊市價值,但並且未正確恢復。

image 4.png

2021 年 4 月為上一次多頭高點,可知當前週期非常符合歷史常態。這暗示著牛市可能會持續更長時間,儘管我們在減半之前已經突破了先前的最高水平。本週期的調整幅度較小,與過去多頭市場中典型的 30-40% 的大幅下跌不同。

image 5.png

  • 2024/4/11

    image 6.png

    目前其他社交平台熱度如何?

    隨著 BTC 已進入減半前的最後倒數,該話題的主導已達到今年的最高水平!

    本主題中的峰值應該被視為 Crypto 市場的高可信度價格反轉。目前 BTC 可能只是暫時在頂部,如果價格回落至 67,000 美元時,關於減半話題討論激增,這代表此時是 FUD 的跡象 ! 你將有機會信心購買 !

    可以關注此網站,了解目前減半在各個平台的熱門度!

    https://app.santiment.net/s/MhwlVtGs?utm

    image 7.png

    走勢了解目前各大平台討論度 :

ACE X CA X Lead Capital 量化課程

· One min read
BCA Daniel
Quant Lead & BD & MM
Details
此頁的QR連結
Details
課綱
this is it
asdf

print("hello")

Crypto-Arsenal

  • 註冊連結 (可以 Google 註冊)
  • 如何用 CA 串接和自動化任何 TradingView 策略: 到 Strategy > New Strategy > TradingView (詳細教學)
  • 如何用 CA 回測和實單策略: 到 Strategy > New Strategy > Technical Indicator > EMA

TradingView

7/26 簡易EMA策略 + 簡易 Filter (濾網) i.e RSI & Momentum

//@version=5
strategy(title="CA_test", shorttitle="EMA", overlay=true, default_qty_value = 80)

ema10 = ta.ema(close,10)
ema20 = ta.ema(close,20)
//filter
rsi = ta.rsi(close,20)
mom = math.abs( ta.mom(close,49) )

//condition
long = ta.crossover(ema10,ema20)
short = ta.crossunder(ema10,ema20)

//position
if(long and mom >= 10 and rsi < 50)
if(strategy.position_size != 0)
strategy.close_all()
strategy.entry("long",strategy.long)
if(short and mom >= 10 and rsi > 50)
if(strategy.position_size != 0)
strategy.close_all()
strategy.entry("short",strategy.short)

if( rsi > 80 or rsi < 20 )
strategy.close_all()

plot(rsi , color = color.blue)
plot(ema10, color=#f37f20)
plot(ema20 , color = color.red)

7/19 簡易EMA策略

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Crypto-Arsenal

//@version=5
strategy("我的策略", overlay=true, margin_long=100, margin_short=100)
//@version=5
//indicator(title="Moving Average Exponential", shorttitle="EMA", overlay=true, timeframe="", timeframe_gaps=true)
ema10 = ta.ema(close,10)
ema20 = ta.ema(close,20)
plot(ema10, title="Smoothing Line", color=#f37f20)
plot(ema20, title="Smoothing Line", color=#4320f3)

longCondition = ta.crossover(ema10,ema20)
if (longCondition)
strategy.close_all()
strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ema10,ema20)
if (shortCondition)
strategy.close_all()
strategy.entry("My Short Entry Id", strategy.short)

Python

7/19 Superposition EMA Python 策略

"""
Contributed by BCA_Daniel @BCA_Quantrade / Crypto-Arsenal & Alan Wu @Crypto-Arsenal
-
Superposition EMAs are designed to smooth out EMAs and reduce noise interference.
This strategy utilizes four EMAs and uses the output of the previous EMA as the input for the next EMA.

Strategy designer: BCA_Daniel 2023.07.16
"""
class Strategy(StrategyBase):
def __init__(self):
# strategy property
self.subscribed_books = {}
self.period = 60 * 30
self.options = {}
self.last_type = 'sell'

### fast / slow ema period
self.fast_period = 14
self.sp1_period = 14
self.sp2_period =14
self.slow_period = 14

self.divide_quote = 0
self.proportion = 0.2

def on_order_state_change(self, order):
pass

# called every self.period
def trade(self, candles):
exchange, pair, base, quote = CA.get_exchange_pair()
ca_position = self.get_ca_position()

close_price_history = [candle['close'] for candle in candles[exchange][pair]]
high_price_history = [candle['high'] for candle in candles[exchange][pair]]
low_price_history = [candle['low'] for candle in candles[exchange][pair]]

# convert to chronological order for talib
close_price_history.reverse()
high_price_history.reverse()
low_price_history.reverse()

# convert np.array
close_price_history = np.array(close_price_history)
high_price_history = np.array(high_price_history)
low_price_history = np.array(low_price_history)

close_price = close_price_history[0]
high_price = high_price_history[0]

#ema fast / slow create
#np.nan_to_num used to refilled nan to 0 for output array
EMA_fast = talib.EMA(close_price_history, timeperiod=self.fast_period)
EMA_fast_filled = np.nan_to_num(EMA_fast, nan=0)
EMA_superposition_1 = talib.EMA(EMA_fast_filled, timeperiod=self.sp1_period)
EMA_superposition_1_filled = np.nan_to_num(EMA_superposition_1, nan=0)
EMA_superposition_2 = talib.EMA(EMA_superposition_1_filled,self.sp2_period)
EMA_superposition_2_filled = np.nan_to_num(EMA_superposition_2, nan=0)
EMA_slow = talib.EMA(EMA_superposition_2_filled, self.slow_period)

if len(close_price_history) < self.slow_period + 1:
return []

# current ema fast / slow
curr_ema_fast = EMA_fast[-1]
curr_ema_slow = EMA_slow[-1]

# previous time stamp ema
prev_ema_fast = EMA_fast[-2]
prev_ema_slow = EMA_slow[-2]

# get available balance
base_balance = CA.get_balance(exchange, base)
quote_balance = CA.get_balance(exchange, quote)
available_base_amount = base_balance.available
available_quote_amount = quote_balance.available
if self.divide_quote == 0:
self.divide_quote = np.round(available_quote_amount* self.proportion, 5)

# initialize signal to be 0
signal = 0
if available_base_amount< self.divide_quote/high_price and available_base_amount > -self.divide_quote/high_price:
# open long position
if curr_ema_fast > curr_ema_slow and prev_ema_fast < prev_ema_slow:
signal = 1
# open short position
if curr_ema_fast < curr_ema_slow and prev_ema_fast > prev_ema_slow:
signal = -1

# Sell short
if signal == -1:
self['is_shorting'] = 'true'
CA.log('Sell short ' + str(base))
if ca_position:
CA.place_order(exchange, pair, action='close_long', conditional_order_type='OTO', child_conditional_orders=[{'action': 'open_short', 'percent':80}])
else:
CA.place_order(exchange, pair, action='open_short', percent=80)

# Buy long
if signal == 1:
self['is_shorting'] = 'false'
CA.log('Buy ' + str(base))
if ca_position:
CA.place_order(exchange, pair, action='close_short', conditional_order_type='OTO', child_conditional_orders=[{'action': 'open_long', 'percent':80}])
else:
CA.place_order(exchange, pair, action='open_long', percent=80)


# return current total position: -n 0, +n where n is number of contracts
def get_ca_position(self):
exchange, pair, base, quote = CA.get_exchange_pair()

long_position = CA.get_position(exchange, pair, CA.PositionSide.LONG)
if long_position:
return abs(long_position.total_size)

short_position = CA.get_position(exchange, pair, CA.PositionSide.SHORT)
if short_position:
return -1 * abs(short_position.total_size)

return 0