암호화폐 시장의 극심한 변동 속에서도 안정성을 유지하고, 강세장이나 약세장에 관계없이 지속적인 긍정적 수익을 가져다 줄 수 있는 전략을 갖는다고 상상해보세요. 환상 같나요? 사실은 그렇지 않습니다. 특정 가격의 통화를 특정 가격으로 매도하는 차익거래 전략은 아무것도 하지 않고도 돈을 벌 수 있는 마법같은 도구입니다.
이러한 전략은 통화 기반 계약의 고유한 속성과 자금 조달 비율 메커니즘을 현명하게 활용하여 강세장에서 안정적인 수익을 얻을 수 있을 뿐만 아니라, 약세장에서도 위험을 효과적으로 피하고 여러 시장 주기에 걸쳐 꾸준한 수익을 달성할 수 있습니다. 코인 기반 계약의 “현금 보호” 특성은 시장 가격이 크게 변동하더라도 전략의 총 가치가 안정적으로 유지되도록 보장합니다. 자금 조달 비율은 영구 계약의 핵심 메커니즘으로서 해당 전략에 대한 추가 수입원을 제공합니다. 이 글에서는 코인 기반 공매도 전략의 핵심 논리, 구현 과정, 장단점을 심층 분석하여 투자자가 디지털 통화 시장에서 이 전략을 통해 “수동 소득”을 달성하는 방법을 이해하는 데 도움을 줍니다. 양적 거래의 초보자이든 경험이 많은 투자자이든, 이 전략은 심도 있게 이해하고 시도해 볼 만한 가치가 있습니다.
코인 마진 계약의 단위는 시트(sheet)로 측정되며, 각 시트의 가치는 고정되어 있습니다(예: BTC 1계약은 100달러, ETH 10달러의 가치가 있습니다). 이러한 특징은 1배 레버리지의 경우 시장 가격이 크게 변동하더라도 이론적으로 마진콜이 발생하지 않는다는 것을 의미합니다.
현재 가격이 100 USD라고 가정하면 10개의 코인 마진 숏 계약이 개설되고 해당 계약의 가치는 100 USD와 같으며 이를 1개의 코인 단위로 환산하면 다음과 같습니다.
가격 하락:
가격 인상:
따라서 어느 정도까지 통화기반 공매도의 총 가치는 안정적으로 유지되는데, 이는 현금 보존 작업입니다. 그렇다면 이 전략의 이익은 어디에서 오는가? 다음 개념을 소개하겠습니다.자금 조달 비율。
통화기반 공매도 전략에서는자금 조달 비율이는 전략적 수익의 핵심 요인 중 하나이며, 그 특성과 변화는 전략의 안정성과 수익성에 직접적인 영향을 미칩니다. 자금 조달 비율의 특성을 적절히 활용하면 전략은 다양한 시장 환경에서도 좋은 성과를 유지할 수 있지만, 잠재적인 한계에도 주의를 기울이는 것이 필요합니다.
자금조달 비율은 장기 및 단기 당사자의 보유 비용을 균형 있게 조정하고 장기 계약 가격이 현물 가격과 장기간 차이가 나는 것을 방지하기 위한 영구 계약 시장의 규제 메커니즘입니다. 사실, CFA를 공부한 친구들은 아직도 영구계약의 원래 이름인 스왑을 기억할 것입니다. 영구 계약의 자금 조달 비율 메커니즘의 설계 영감은 주로 전통 금융의 이자율 스왑에서 얻었습니다. 이자율 스왑에서 두 당사자는 합의된 이자율(예: 고정 금리 대 변동 금리)을 기반으로 정기적으로 이자 지급을 교환하여 이자율 변동 위험을 헤지합니다. 마찬가지로, 무기한 계약의 자금 조달 비율 메커니즘도 정기적으로 수수료를 지급하거나 징수하여 롱 포지션과 숏 포지션의 보유 비용을 균형 있게 조정하고, 계약 가격과 현물 가격의 격차가 너무 크지 않도록 보장합니다.
자금 조달 비율을 도입하는 것은 본질적으로 영구 계약과 현물 가격 사이의 기초 문제를 해결하기 위한 것입니다. 무기한 계약 가격이 현물 가격보다 높으면 자금 조달 비율은 양수가 되고, 롱 포지션이 숏 포지션에게 수수료를 지불합니다. 무기한 계약 가격이 현물 가격보다 낮으면 자금 조달 비율은 음수가 되고, 숏 포지션이 롱 포지션에게 수수료를 지불합니다. 이 메커니즘은 이자율 스왑의 핵심 개념을 활용할 뿐만 아니라, 디지털 화폐 시장의 특성을 결합하여 고유한 시장 규제 도구를 형성합니다. 디지털 화폐 분야의 주요 특징은 다음과 같습니다.
지난 스승님께서 말씀하신 것처럼, 전략 구축의 초기 단계에서는 전략의 수익과 위험의 원천을 이해하는 것이 필요합니다. 위 내용을 바탕으로, 공매도의 총 가치는 통화 기준으로 안정적으로 유지되어야 하므로, 자금조달금리차이가 수익원이라는 것을 알 수 있습니다. 일부 학생들은 자금 조달 비율이 앞으로도 안정적으로 긍정적인 수익을 가져올지 궁금해할 것입니다. 저희는 DATADATA International Station에서 데이터 분석 작업을 수행합니다.
SELECT
Exchange,
Symbol,
toDateTime(Time / 1000) AS Time, -- 将毫秒时间戳转换为时间戳
Rate,
SUM(Rate) OVER (PARTITION BY Exchange, Symbol ORDER BY Time) AS CumulativeRate -- 计算累加的 Rate
FROM
klines.funding
WHERE
Exchange = '{{exchange}}'
AND Symbol = '{{symbol}}'
ORDER BY
Time;
동적 매개변수는 바이낸스 거래소를 사용하고, 계약은 누적 자금 조달 비율을 표시하기 위해 비트코인 표준(btc_usd) 계약을 선택합니다. 2020년부터 현재까지 자금조달금리수입은 꾸준히 증가세를 보이며 5년 누적수입이 50%에 도달한 것을 볼 수 있습니다. 수백, 수천억 원의 이익과 비교할 수는 없지만 비교적 안정적이기 때문에 이 전략의 수익원을 파악할 수 있습니다.
코인 기반 공매도 전략에서 자금 조달 비율은 수익의 주요 원천입니다. 코인 증거금 계약의 단위는 고정되어 있으므로, 시장 가격이 변동하더라도 공매도자의 계약 가치 변화는 일반적으로 통제 가능하므로, 자금 조달 비율이 이 전략의 주요 수익원이 됩니다. 자금 조달 비율이 전략에 미치는 구체적인 영향은 다음과 같습니다.
강세장 국면(자금 조달 비율이 양수)
하락장 국면(마이너스 자금 조달 비율)
두 가지 시장 환경을 분석하면 통화기반 공매도 전략의 수익성과 위험성은 주로 자금조달금리에 영향을 받는 것을 알 수 있습니다. 상승장에서 자금 조달 비율이 양수이면 공매도자는 그로부터 이익을 얻을 수 있습니다. 반면, 하락장에서 자금 조달 비율이 음수이면 계약 가치의 변화를 통제할 수 있기 때문에 이 전략은 여전히 가치를 보존할 수 있는 강력한 능력을 갖습니다.
견고한 전략 프레임워크는 전략의 성공적인 구현에 핵심입니다. 이는 전략이 다양한 시장 상황에서 안정적으로 운영되고 위험과 변동성을 효과적으로 처리할 수 있도록 하는 명확한 실행 프레임워크를 제공합니다. 여기서는 샤오차오대신의 U 기반 다중 통화 계약 전략 프레임워크를 참조하고 통화 표준에 대한 몇 가지 수정 및 개선 사항을 살펴보겠습니다.
'''backtest
start: 2024-11-20 00:00:00
end: 2024-11-20 01:00:00
period: 1d
basePeriod: 1m
exchanges: [{"eid":"Futures_OKX","currency":"BTC_USD"}]
'''
import time
import json
# 全局变量,储存数据
SYMBOLS = 'BTC' # SYMBOLS代表要交易的币种,格式如"BTC,ETH,LTC"
QUOTO = 'USD' # QUOTO为基础货币, 币本位为USD
INTERVAL = 5 # INTERVAL代表循环的间隔
ICEMONEY = 2000 # 冰山下单金额
ROLLINGNUM = 1 # 滚动盈利加仓数量
Info = {
'trade_symbols': SYMBOLS.split(','), # 交易币种
'base_coin': QUOTO, # 基础货币
'ticker': {}, # 行情数据
'order': {}, # 订单信息
'account': {}, # 账户信息
'precision': {}, # 精度信息
'position': {}, # 仓位信息
'time': {}, # 时间相关数据
'count': {}, # 计数器
'interval': INTERVAL # 循环的间隔时间
}
# 初始化策略
def InitInfo():
# 初始化时间数据,控制更新的时间
Info['time'] = {
'update_ticker_time': 0, # 更新行情的时间
'update_pos_time': 0, # 更新仓位的时间
'update_profit_time': 0, # 更新利润的时间
'update_account_time': 0, # 更新账户信息的时间
'update_status_time': 0, # 更新状态的时间
'last_loop_time': 0, # 上一次主循环的时间
'loop_delay': 0, # 循环延迟
'start_time': time.time() # 起始时间
}
# 初始化每个交易币种的数据
for symbol in Info['trade_symbols']:
Info['account'][symbol] = {
'init_balance': 0, # 初始余额
'margin_balance': 0, # 保证金余额
'margin_used': 0, # 已用保证金
'margin_free': 0, # 可用保证金
'profit': 0, # 总收益
'profit_rate': 0, # 收益率
'unrealised_profit': 0, # 未实现收益
} # 初始化账户信息,初始余额为0
Info['ticker'][symbol] = {'last': 0, 'ask': 0, 'bid': 0} # 行情
Info['order'][symbol] = { # 订单信息
'buy': {'id': 0, 'price': 0, 'amount': 0},
'sell': {'id': 0, 'price': 0, 'amount': 0}
}
Info['position'][symbol] = { # 仓位信息
'amount': 0, 'hold_price': 0, 'unrealised_profit': 0, 'open_time': 0, 'value': 0
}
Info['precision'][symbol] = {} # 精度信息初始化为空
Info['position'][symbol] = { # 仓位信息
'amount': 0, 'hold_price': 0, 'unrealised_profit': 0, 'open_time': 0, 'value': 0
}
# 获取精度信息
def GetPrecision():
# 获取交易所的市场信息
# 回测系统需要获取行情信息后, 才能获取市场信息,实盘系统可忽略
for symbol in Info['trade_symbols']:
curcontract = symbol + '_' + QUOTO + '.swap'
exchange.GetTicker(curcontract)
exchange_info = exchange.GetMarkets()
# 遍历市场中的所有交易对
for pair, data in exchange_info.items():
symbol = pair.split('_')[0] # 永续合约交易对的格式为 BTC_USDT.swap
# 检查该交易对是否为我们要交易的币种,基础货币是否匹配,且是永续合约
if symbol in Info['trade_symbols'] and pair.split('.')[0].endswith(Info['base_coin']) and pair.endswith('swap'):
# 获取该交易对的精度信息
Info['precision'][symbol] = {
'tick_size': data['TickSize'], # 价格精度
'amount_size': data['AmountSize'], # 数量精度
'price_precision': data['PricePrecision'], # 价格小数位精度
'amount_precision': data['AmountPrecision'], # 数量小数位精度
'min_qty': data['MinQty'], # 最小下单数量
'max_qty': data['MaxQty'], # 最大下单数量
'min_notional': data['MinNotional'], # 最小交易额
'ctVal': data['CtVal'] # 合约价值,如1张代表100USD
}
Log(f"初始化币种信息: {symbol}, "
f"价格精度: {Info['precision'][symbol]['tick_size']}, "
f"数量精度: {Info['precision'][symbol]['amount_size']}, "
f"价格小数位精度: {Info['precision'][symbol]['price_precision']}, "
f"数量小数位精度: {Info['precision'][symbol]['amount_precision']}, "
f"最小下单数量: {Info['precision'][symbol]['min_qty']}, "
f"最大下单数量: {Info['precision'][symbol]['max_qty']}, "
f"最小交易额: {Info['precision'][symbol]['min_notional']}, "
f"合约价值(张): {Info['precision'][symbol]['ctVal']}")
# 更新行情信息
def UpdateTicker():
# 记录当前更新时间戳
Info['time']['update_ticker_time'] = time.time() * 1000 # 使用time.time()获取当前时间的时间戳
# 遍历获取到的行情数据
for symbol in Info['trade_symbols']:
curcontract = symbol + '_' + QUOTO + '.swap'
data = exchange.GetTicker(curcontract)
if not data:
Log("获取行情失败", GetLastError())
return
# 更新行情的卖出价、买入价和最后成交价
Info['ticker'][symbol]['ask'] = float(data['Sell']) # 卖出价
Info['ticker'][symbol]['bid'] = float(data['Buy']) # 买入价
Info['ticker'][symbol]['last'] = float(data['Last']) # 最后成交价
# 更新账户信息
def UpdateAccount():
# 遍历所有交易币种,更新账户信息
for symbol in Info['trade_symbols']:
curcontract = symbol + '_' + QUOTO # 拼接币种和报价货币,形成合约标识
exchange.SetCurrency(curcontract) # 设置当前合约
# 获取账户信息
account = exchange.GetAccount()
# 如果账户信息获取失败,记录日志并结束函数
if account is None:
Log(curcontract, ": 更新账户失败")
return
# 计算账户的关键信息
# 'Stocks': 可用余额, 'FrozenStocks': 冻结余额, 'Equity': 总权益, 'UPnL': 未实现盈亏, 区别U本位(Balance)
Info['account'][symbol]['margin_used'] = account['Equity'] - account['Stocks'] # 已用保证金
Info['account'][symbol]['margin_balance'] = account['Equity'] # 当前账户总权益
Info['account'][symbol]['margin_free'] = account['Stocks'] # 当前可用余额
Info['account'][symbol]['unrealised_profit'] = account['UPnL'] # 未实现盈亏
# 从全局存储中读取账户初始余额字典
accDict = _G("init_balance")
if accDict is None:
accDict = {} # 如果全局存储为空,则初始化为空字典
# 初始化账户初始余额(仅在第一次运行时设置)
if not Info['account'][symbol]['init_balance']:
# 如果全局存储有记录且余额大于0,则使用该记录作为初始余额
if accDict and accDict.get(symbol) and accDict[symbol] > 0:
Info['account'][symbol]['init_balance'] = round(accDict[symbol], 2)
else:
# 否则,将当前保证金余额作为初始余额
Info['account'][symbol]['init_balance'] = Info['account'][symbol]['margin_balance'] * Info['ticker'][symbol]['last']
accDict[symbol] = Info['account'][symbol]['init_balance'] # 更新全局存储
_G("init_balance", accDict)
# 计算账户利润及利润率
Info['account'][symbol]['profit'] = round(Info['account'][symbol]['margin_balance'] * Info['ticker'][symbol]['last'] - Info['account'][symbol]['init_balance'], 2) # 当前利润
Info['account'][symbol]['profit_rate'] = round((100 * Info['account'][symbol]['profit']) / Info['account'][symbol]['init_balance'], 2) # 当前利润率(百分比)
# 更新仓位信息
def UpdatePosition():
# 获取永续合约的仓位信息
# 调用接口获取指定币种的仓位信息
pos = exchange.GetPositions(Info['base_coin'] + ".swap")
# 记录仓位信息的更新时间(单位:毫秒)
Info['time']['update_pos_time'] = time.time() * 1000
# 初始化仓位信息
# 为每个交易币种创建默认的仓位信息
position_info = {symbol: {'amount': 0, 'hold_price': 0, 'unrealised_profit': 0} for symbol in Info['trade_symbols']}
# 遍历获取到的仓位信息,更新对应币种的仓位数据
for data in pos:
# 提取币种名称(Symbol)的一部分作为标识
symbol = data['Symbol'].split("_")[0]
# 过滤掉不属于指定基准币种或不在交易列表中的币种
if not data['Symbol'].split(".")[0].endswith(Info['base_coin']) or symbol not in Info['trade_symbols']:
continue
# 更新仓位信息,区分多头和空头(通过 Type 字段)
position_info[symbol] = {
'amount': data['Amount'] if data['Type'] == 0 else -data['Amount'], # 多头为正,空头为负
'hold_price': data['Price'], # 仓位持有价格
'unrealised_profit': data['Profit'] # 未实现盈亏
}
# 初始化每个币种的仓位统计数据
# long: 多头价值, short: 空头价值, total: 总仓位价值, leverage: 杠杆率
for symbol in Info['trade_symbols']:
Info['count'][symbol] = {'long': 0, 'short': 0, 'total': 0, 'leverage': 0}
# 遍历更新后的仓位信息
for symbol, info in position_info.items():
# 计算仓位变化量
deal_volume = abs(info['amount'] - Info['position'][symbol]['amount'])
# 计算变化方向(正数为增仓,负数为减仓)
direction = 1 if info['amount'] - Info['position'][symbol]['amount'] > 0 else -1
# 如果仓位发生变化,记录成交信息
if deal_volume:
# 获取成交价格(买入或卖出)
deal_price = Info['order'][symbol]['buy']['price'] if direction == 1 else Info['order'][symbol]['sell']['price']
# 打印仓位更新日志
Log(
symbol,
"仓位更新:",
round(Info['position'][symbol]['amount'], 1),
" -> ",
round(info['amount'], 1),
", 买" if direction == 1 else ", 卖",
", 成交价:",
deal_price,
", 成本价:",
round(Info['position'][symbol]['hold_price'], Info['precision'][symbol]['price_precision']),
)
# 更新仓位信息
Info['position'][symbol]['amount'] = info['amount'] # 更新仓位数量
Info['position'][symbol]['hold_price'] = info['hold_price'] # 更新持仓价格
Info['position'][symbol]['value'] = round(Info['position'][symbol]['amount'] * Info['precision'][symbol]['ctVal'], 2) # 仓位价值
Info['position'][symbol]['unrealised_profit'] = info['unrealised_profit'] # 更新未实现盈亏
# 统计多头和空头仓位价值
if Info['position'][symbol]['amount'] > 0:
# 如果为多头,增加多头仓位价值
Info['count'][symbol]['long'] += abs(Info['position'][symbol]['value'])
else:
# 如果为空头,增加空头仓位价值
Info['count'][symbol]['short'] += abs(Info['position'][symbol]['value'])
# 计算仓位总价值(按最新价格计算)
Info['count'][symbol]['total'] = round((Info['count'][symbol]['long'] + Info['count'][symbol]['short']) / Info['ticker'][symbol]['last'], 2)
# 计算杠杆率(总仓位价值与账户保证金的比值)
Info['count'][symbol]['leverage'] = round(Info['count'][symbol]['total'] / Info['account'][symbol]['margin_balance'], 2)
# 订单函数
def Order(symbol, direction, price, amount, msg):
pair = f"{symbol}_{Info['base_coin']}.swap" # 构造交易对名称
ret = exchange.CreateOrder(pair, direction, price, amount, msg) # 执行下单操作
# 判断是否下单成功
if ret:
Info['order'][symbol][direction]['id'] = ret # 记录订单ID
Info['order'][symbol][direction]['price'] = price # 记录下单价格
Log('记录下单价格:', price, direction, Info['order'][symbol][direction]['price'], )
else:
Log(f"{symbol} {direction} {price} {amount} 下单异常") # 输出异常信息
# 交易函数
def Trade(symbol, direction, price, amount, msg):
# 根据最小价格变动调整价格
price = round(price - (price % Info['precision'][symbol]['tick_size']), Info['precision'][symbol]['price_precision'])
# 计算调整后的交易数量
amount = amount / Info['precision'][symbol]['ctVal'] # 计算真实合约数量
amount = round(amount - (amount % Info['precision'][symbol]['amount_size']), Info['precision'][symbol]['amount_precision'])
# 限制最大交易数量
if Info['precision'][symbol]['max_qty'] > 0:
amount = min(amount, Info['precision'][symbol]['max_qty'])
new_order = False
# 如果新价格与之前的订单价格差异大于0.0001,则重新下单
if Info['order'][symbol][direction]['price'] > 0 and abs(price - Info['order'][symbol][direction]['price']) / price > 0.0001:
Log('已持订单,订单价格发生变化')
new_order = True
# 如果交易数量为0或者当前订单ID为0,则撤单
if amount <= 0 or Info['order'][symbol][direction]['id'] == 0:
Log('新订单产生')
new_order = True
# 如果需要新订单
if new_order:
# 如果有原有订单,撤销它
if Info['order'][symbol][direction]['id'] != 0:
exchange.CancelOrder(Info['order'][symbol][direction]['id'])
Info['order'][symbol][direction]['id'] = 0
Info['order'][symbol][direction]['price'] = 0
Log('撤单成功:', symbol)
# 如果更新仓位或ticker的延迟太高,则不下单
#if (time.time() * 1000 - Info['time']['update_pos_time'] > 2 * Info['interval'] * 1000 or
# time.time() * 1000 - Info['time']['update_ticker_time'] > 2 * Info['interval'] * 1000):
# Log('仓位更新时间', time.time() * 1000, Info['time']['update_pos_time'], time.time() * 1000 - Info['time']['update_pos_time'])
# Log('Ticker更新时间', time.time() * 1000, Info['time']['update_ticker_time'], time.time() * 1000 - Info['time']['update_ticker_time'])
# Log('延迟过高')
# return
# 如果订单金额或数量过低,不执行下单操作
if price * amount <= Info['precision'][symbol]['min_notional'] or amount < Info['precision'][symbol]['min_qty']:
Log(f"{symbol} 下单量太低", price * amount)
return
# 执行下单操作
Log('order下单:', symbol)
Order(symbol, direction, price, amount, msg)
# 更新状态函数
def UpdateStatus():
# 更新状态时间
Info['time']['update_status_time'] = time.time() * 1000
# 账户信息表格
table1 = {
"type": "table",
"title": "账户信息",
"cols": [
"币种", "初始权益", "实时权益", "可用余额",
"总收益", "收益率"
],
"rows": [],
}
# 遍历每个交易对,填充交易对信息
for symbol in Info['trade_symbols']:
table1['rows'].append([
symbol, # 币种
round(Info['account'][symbol]['init_balance'], 2), # 初始权益
round(Info['account'][symbol]['margin_balance'] * Info['ticker'][symbol]['last'], 2), # 实时权益
round(Info['account'][symbol]['margin_free'] * Info['ticker'][symbol]['last'], 2), # 可用余额
round(Info['account'][symbol]['profit'], 2), # 总收益
str(Info['account'][symbol]['profit_rate']) + "%" # 收益率
])
# 交易对信息表格
table2 = {
"type": "table",
"title": "交易对信息",
"cols": [
"币种", "方向", "数量", "持仓价格", "持仓价值",
"现价"
],
"rows": [],
}
# 遍历每个交易对,填充交易对信息
for symbol in Info['trade_symbols']:
table2['rows'].append([
symbol, # 币种
"LONG" if Info['position'][symbol]['amount'] > 0 else "SHORT", # 方向
Info['position'][symbol]['amount'], # 数量
round(Info['position'][symbol]['hold_price'], Info['precision'][symbol]['price_precision']), # 持仓价格
round(Info['position'][symbol]['value'], 2), # 持仓价值
round(Info['ticker'][symbol]['last'], Info['precision'][symbol]['price_precision']) # 现价
])
# 输出状态日志
LogStatus(
f"初始化时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(Info['time']['start_time']))}\n",
f"`{json.dumps(table1)}`\n" + f"`{json.dumps(table2)}`\n",
f"循环延时: {str(Info['time']['loop_delay']) + 'ms'}\n",
f"最后执行时间: {_D()}\n"
)
totalprofit = 0
for symbol in Info['trade_symbols']:
totalprofit += Info['account'][symbol]['profit']
# 每10秒钟更新一次账户信息
if time.time() * 1000 - Info['time']['update_profit_time'] > 10 * 1000:
LogProfit(round(totalprofit, 3), '&') # 输出收益日志
Info['time']['update_profit_time'] = time.time() * 1000 # 更新收益时间
def MakeOrder():
# 遍历所有交易对
for symbol in Info['trade_symbols']:
availBal = Info['account'][symbol]['margin_free'] * Info['ticker'][symbol]['last'] #可用金额
sell_price = Info['ticker'][symbol]['ask'] #卖出价格
if availBal > ICEMONEY: #可用金额大于冰山挂单数量,起始建仓
Trade(symbol, "sell", sell_price, ICEMONEY, symbol) # 执行买入操作
elif availBal > ROLLINGNUM * Info['precision'][symbol]['ctVal']: #可用盈利大于滚动加仓数量,逐步下单
Trade(symbol, "sell", sell_price, ROLLINGNUM * Info['precision'][symbol]['ctVal'], symbol) # 执行买入操作
def OnTick():
# 更新市场行情信息
UpdateTicker()
# 更新账户信息
UpdateAccount()
# 更新持仓信息
UpdatePosition()
# 执行下单操作
MakeOrder()
# 更新状态信息
UpdateStatus()
def main():
LogReset(0) # 日志重置
Log('策略起始#0000ff')
# 初始化信息
InitInfo() # 初始化币种信息
GetPrecision() # 获取精度信息
exchange.SetMarginLevel(1) # 设置杠杆倍数
while True: # 无限循环
loop_start_time = time.time() * 1000 # 获取当前时间(毫秒)
# 检查上次循环时间与设定的间隔时间是否已过
if time.time() * 1000 - Info['time']['last_loop_time'] > Info['interval'] * 1000:
OnTick() # 调用 OnTick 函数
# 更新最后一次循环时间
Info['time']['last_loop_time'] = time.time() * 1000
# 计算当前循环的延迟时间
Info['time']['loop_delay'] = time.time() * 1000 - loop_start_time
# 暂停5毫秒,避免过度消耗CPU资源
Sleep(5)
이 전략은 간단한 변수 정의에 기반을 두고 있으며 모듈식 기능을 통해 롤링 위치 추가 및 상태 모니터링을 구현합니다.
각 기능 모듈에 대한 간략한 설명은 다음과 같습니다.
초기화 함수(InitInfo)
거래 통화 정보와 초기 계좌 상태를 로드하는 데 사용됩니다.
정밀 정보 가져오기(GetPrecision)
거래소 API를 통해 각 거래 쌍에 대한 최소 주문 크기와 계약 가치를 알아보세요.
업데이트 티커
최고 입찰 가격, 최고 매도 가격, 최신 가격을 포함한 현재 시장 정보를 정기적으로 받아보세요.
계정 및 위치 업데이트(UpdateAccount, UpdatePosition)
계좌 잔액과 포지션 정보를 실시간으로 동기화하여 거래 결정의 기반을 제공합니다.
거래 및 주문 관리(주문, 거래)
통합된 주문 배치 및 실행 기능으로 지정가 주문과 시장가 주문을 지원합니다.
상태 모니터링(UpdateStatus)
현재 손익과 미처리 주문을 포함하여 전략 상태를 추적합니다.
전략의 핵심은초기 위치(빙산 위치) 및롤링 포지션(롤링 위치 매개변수 ROLLINGNUM에 의해 제어됨). 구체적인 논리에 대한 자세한 설명은 다음과 같습니다.
전략 백테스팅 결과에 따르면, 해당 전략은 여러 시장 주기에서 안정적인 수익을 달성한 것으로 나타났으며, 특히 자금 조달 비율이 장기간 플러스를 보인 강세장에서 그 효과가 두드러졌습니다. 따라서 이 전략은 어느 정도 대규모 펀드 운용에 매우 적합합니다. 낮은 변동성과 안정적인 수익률의 특성을 갖추고 있어 대규모 펀드의 위험 관리와 안정적인 수익률이라는 두 가지 요구를 모두 충족할 수 있습니다. 동시에 해당 전략은 1배 레버리지를 채택하여 높은 레버리지로 인한 청산 위험을 피하고 안전성을 더욱 강화합니다.
전략은 간단하고 실행하기 쉽습니다.
논리가 명확하고 복잡한 계산이 필요하지 않아 헤지펀드나 개인 투자자가 대규모 펀드를 운용하는 데 적합합니다.
강력한 위험 저항성
1배 레버리지는 청산 위험을 피할 수 있으며, 통화 기반의 특성 덕분에 시장 변동이 심해지더라도 미국 달러의 가치가 일정하게 유지됩니다.
안정적인 수입
강세장에서는 자금 조달 비율이 더 높고 확장성이 뛰어나며, 그로 인해 발생하는 통화를 다른 투자(예: 스테이킹)에 사용할 수 있습니다.
전략적 경직성 부족
현재의 전략에는 강세장과 약세장 사이를 전환할 때 대응책(손절매 전략이나 이익실현 전략 등)이 부족한 등 역동적인 조정 논리가 포함되지 않았습니다.
제한된 이익 마진
“평평하게” 수수료를 부과하는 데 적합하며, 시장의 큰 변동에서 초과 수익을 포착할 수 없습니다. 어떤 경우에는 수익률이 전통적인 채권 펀드만큼 좋지 않습니다.
코인 기반 일회성 공매도 수수료 차익거래 전략은 코인 기반 계약의 특수한 속성을 최대한 활용하여 자본 보존과 안정적인 가격 상승을 위한 저위험 솔루션을 제공합니다. 그러나 시장 단계가 다르기 때문에 자금 조달 금리 변동과 잠재적 위험에 대처하기 위해 전략에는 어느 정도 유연성이 필요합니다. 향후 최적화 방향에는 다음이 포함될 수 있습니다.
그러나 본질적으로 이 전략에는 특정모순. 이 전략의 초기 가정은 디지털 화폐 시장이 장기적으로 강세장을 보일 것이며, 화폐 기반 계약을 공매도하면 안정적인 현금 흐름을 유지하고 자금 조달 비율 혜택을 얻을 수 있다는 것입니다. 하지만 시장이 장기적으로 강세장이라고 가정한다면, 그냥 코인을 쌓아두고(hlod) 비트코인이 꾸준히 상승할 때까지 기다리는 게 왜 안 될까? 물론, 이러한 전략은 안정적인 수익을 추구하는 사람들에게는 여전히 신뢰할 만한 방법입니다. 이 글의 목적은 이러한 디자인 아이디어를 소개하고, 이를 더욱 개선하고 최적화할 수 있는 양적 투자 전략 프레임워크를 제공하는 것입니다. 이 전략이 디지털 통화에 투자하는 양적 투자자들에게 효과적인 도구가 될 수 있기를 기대합니다.
참고문헌
FMZ 업그레이드 후 범용 다중 통화 거래 전략을 빠르게 구축하는 방법
알고리즘 트레이딩 실무일지(XIX) - 아비트라지 전략 상세설명 시리즈(1): 통화기반 공매도 수수료 아비트라지
친절한 팁: 투자는 위험한 일이니, 시장에 진입할 때는 주의하시기 바랍니다. 투자자들에게는 자금을 합리적으로 배분하고, 전략 논리와 위험에 대한 완벽한 이해를 바탕으로 자신의 위험 허용 범위에 따라 포지션과 레버리지를 엄격하게 통제하는 것이 좋습니다. 본 기사의 내용은 참고용일 뿐이며, 어떠한 투자 조언도 구성하지 않습니다.