Bayangkan mempunyai strategi yang boleh kekal stabil di tengah-tengah turun naik liar dalam pasaran mata wang kripto, dan boleh membawa anda pulangan positif yang berterusan tanpa mengira pasaran lembu atau beruang. Bunyi seperti fantasi? Sebenarnya, tidak. Strategi arbitraj memendekkan mata wang dengan satu kali bayaran hanyalah alat ajaib untuk membuat wang tanpa melakukan apa-apa.
Dengan bijak menggunakan sifat unik kontrak berasaskan mata wang dan mekanisme kadar pendanaan, strategi ini bukan sahaja boleh memperoleh pulangan yang stabil dalam pasaran menaik, tetapi juga dengan berkesan mengelakkan risiko dalam pasaran menanggung dan mencapai pulangan yang stabil merentas kitaran pasaran. Sifat kontrak berasaskan syiling yang “dilindungi tunai” memastikan jumlah nilai strategi kekal stabil walaupun harga pasaran turun naik dengan ketara. Kadar pembiayaan, sebagai mekanisme teras kontrak kekal, menyediakan sumber pendapatan tambahan untuk strategi tersebut. Artikel ini akan menganalisis secara mendalam logik teras, proses pelaksanaan, kelebihan dan keburukan strategi jualan pendek berasaskan syiling untuk membantu pelabur memahami cara mencapai “pendapatan pasif” melalui strategi ini dalam pasaran mata wang digital. Sama ada anda seorang pemula dalam perdagangan kuantitatif atau pelabur yang berpengalaman, strategi ini bernilai pemahaman dan percubaan mendalam anda.
Unit kontrak terpinggir syiling diukur dalam helaian dan nilai setiap helaian ditetapkan (contohnya, 1 kontrak BTC bernilai 100 USD dan 10 USD ETH). Ciri ini bermakna bahawa dalam kes leverage 1x, walaupun harga pasaran sangat turun naik, secara teorinya tidak akan ada panggilan margin.
Dengan mengandaikan harga semasa ialah 100 USD, 10 kontrak pendek margin syiling dibuka dan nilainya bersamaan dengan 100 USD, yang ditukar kepada 1 unit syiling:
Penurunan harga:
Kenaikan harga:
Oleh itu, pada tahap tertentu, jumlah nilai jualan pendek berasaskan mata wang kekal stabil, yang merupakan operasi pemeliharaan tunai. Jadi dari mana datangnya keuntungan strategi ini Mari kita perkenalkan konsep seterusnya:Kadar Pembiayaan。
Dalam strategi jualan pendek berasaskan mata wang,Kadar PembiayaanIa merupakan salah satu pemacu teras pulangan strategi, dan ciri serta perubahannya secara langsung mempengaruhi kestabilan dan keuntungan strategi. Dengan menggunakan ciri-ciri kadar pembiayaan dengan betul, strategi boleh mengekalkan prestasi yang baik dalam persekitaran pasaran yang berbeza, tetapi ia juga perlu untuk memberi perhatian kepada had potensinya.
Kadar pendanaan adalah mekanisme kawal selia dalam pasaran kontrak kekal, yang bertujuan untuk mengimbangi kos pegangan pihak panjang dan pendek dan menghalang harga kontrak kekal daripada menyimpang daripada harga spot untuk jangka masa yang lama. Malah, rakan-rakan yang telah belajar CFA masih akan mengingati nama asal kontrak kekal, swap. Inspirasi reka bentuk mekanisme kadar pembiayaan kontrak kekal sebahagian besarnya diperoleh daripada pertukaran kadar faedah dalam kewangan tradisional. Dalam swap kadar faedah, dua pihak menukar pembayaran faedah pada selang masa yang tetap berdasarkan kadar faedah yang dipersetujui (cth., kadar tetap berbanding kadar terapung) untuk melindung nilai risiko turun naik kadar faedah. Begitu juga, mekanisme kadar pembiayaan kontrak kekal juga mengimbangi kos pegangan pihak panjang dan pendek dengan membayar atau mengutip yuran secara berkala, memastikan jurang antara harga kontrak dan harga spot tidak terlalu besar.
Pengenalan kadar pembiayaan pada asasnya adalah untuk menyelesaikan masalah asas antara kontrak kekal dan harga spot. Apabila harga kontrak kekal lebih tinggi daripada harga spot, kadar pendanaan adalah positif, dan long membayar yuran kepada short apabila harga kontrak kekal lebih rendah daripada harga spot, kadar pembiayaan adalah negatif, dan short membayar yuran kepada long. Mekanisme ini bukan sahaja menggunakan konsep teras swap kadar faedah, tetapi juga menggabungkan ciri-ciri pasaran mata wang digital untuk membentuk alat peraturan pasaran yang unik. Dalam bidang mata wang digital, ciri utamanya termasuk:
Seperti kata Master Zinan, pada peringkat awal pembinaan strategi, adalah perlu untuk memahami sumber pulangan dan risiko strategi. Berdasarkan perkara di atas, kami memahami bahawa jumlah nilai jualan pendek dalam standard mata wang adalah untuk kekal stabil, jadi sumber pendapatan adalah arbitraj kadar pembiayaan. Sesetengah pelajar mungkin ingin tahu, adakah kadar pembiayaan akan terus membawa pulangan positif yang stabil? Kami menjalankan kerja analisis data di Stesen Antarabangsa DATADATA:
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;
Parameter dinamik menggunakan pertukaran Binance, dan kontrak memilih kontrak standard Bitcoin (btc_usd) untuk memaparkan kadar pendanaan terkumpul. Dapat dilihat bahawa dari tahun 2020 hingga sekarang, pendapatan kadar pembiayaan menunjukkan tahap yang semakin meningkat, dengan pendapatan lima tahun kumulatif mencecah 50%. Walaupun ia tidak dapat dibandingkan dengan keuntungan ratusan atau ribuan, ia agak stabil, jadi kita boleh menyusun sumber keuntungan strategi ini.
Dalam strategi jualan pendek berasaskan syiling, kadar pembiayaan adalah sumber utama keuntungan. Memandangkan unit kontrak terpinggir syiling adalah tetap, walaupun harga pasaran turun naik, perubahan dalam nilai kontrak untuk penjual pendek biasanya boleh dikawal, jadi kadar pendanaan menjadi sumber utama keuntungan untuk strategi. Berikut ialah kesan khusus kadar pembiayaan ke atas strategi:
Fasa Pasaran Bull (Kadar Pembiayaan Positif)
Fasa Pasaran Menanggung (Kadar Pembiayaan Negatif)
Melalui analisis kedua-dua persekitaran pasaran ini, dapat dilihat bahawa keuntungan dan risiko strategi jualan pendek berasaskan mata wang dipengaruhi terutamanya oleh kadar pembiayaan. Apabila kadar pendanaan positif dalam pasaran kenaikan harga, penjual pendek boleh mendapat manfaat daripadanya semasa dalam pasaran beruang, walaupun kadar pembiayaan adalah negatif, strategi masih mempunyai keupayaan yang kukuh untuk mengekalkan nilai kerana perubahan dalam nilai kontrak boleh dikawal.
Rangka kerja strategi yang teguh adalah kunci kepada kejayaan pelaksanaan strategi Ia menyediakan rangka kerja pelaksanaan yang jelas untuk memastikan bahawa strategi boleh beroperasi secara stabil di bawah pelbagai keadaan pasaran dan menangani risiko dan turun naik secara berkesan. Di sini kami merujuk kepada rangka kerja strategi kontrak berbilang mata wang berasaskan U Xiaocao Dashen, dan membuat pengubahsuaian dan penambahbaikan tertentu pada standard mata wang.
'''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)
Strategi ini berdasarkan definisi pembolehubah mudah dan melaksanakan penambahan kedudukan bergulir dan pemantauan status melalui fungsi modular.
Berikut ialah penerangan ringkas bagi setiap modul berfungsi:
Fungsi permulaan (InitInfo)
Digunakan untuk memuatkan maklumat mata wang transaksi dan status akaun awal.
Dapatkan Maklumat Ketepatan (GetPrecision)
Dapatkan saiz pesanan minimum dan nilai kontrak untuk setiap pasangan dagangan melalui API pertukaran.
Kemas KiniTicker
Dapatkan maklumat pasaran semasa dengan kerap, termasuk harga bida terbaik, harga permintaan terbaik dan harga terkini.
Kemas kini akaun dan kedudukan (UpdateAccount, UpdatePosition)
Penyegerakan masa nyata baki akaun dan maklumat kedudukan menyediakan asas untuk keputusan perdagangan.
Perdagangan dan Pengurusan Pesanan (Pesanan, Perdagangan)
Fungsi penempatan dan pelaksanaan pesanan bersatu, menyokong pesanan had dan pesanan pasaran.
Pemantauan Status (Status Kemas Kini)
Jejaki status strategi, termasuk untung rugi semasa dan pesanan yang tidak diisi.
Teras strategi ialahKedudukan Awal(Kedudukan Iceberg) danKedudukan bergolek(Dikawal oleh parameter kedudukan bergolek ROLLINGNUM). Berikut ialah penerangan terperinci tentang logik khusus:
Mengikut keputusan ujian balik strategi, kita dapat melihat bahawa strategi tersebut telah mencapai pulangan yang stabil dalam pelbagai kitaran pasaran, terutamanya dalam pasaran kenaikan harga di mana kadar pendanaan telah positif untuk jangka masa yang lama. Oleh itu, strategi ini sangat sesuai untuk pengurusan dana yang besar pada tahap tertentu. Ciri-ciri turun naik yang rendah dan pulangan yang stabil boleh memenuhi keperluan dwi dana yang besar untuk kawalan risiko dan pulangan yang stabil. Pada masa yang sama, strategi ini menggunakan leverage 1x, yang mengelakkan risiko pembubaran yang disebabkan oleh leverage yang tinggi dan seterusnya meningkatkan keselamatannya.
Strategi ini mudah dan mudah untuk dilaksanakan
Logiknya jelas dan tiada pengiraan yang rumit diperlukan, menjadikannya sesuai untuk pengurusan dana besar oleh dana lindung nilai atau pelabur individu.
Rintangan risiko yang kuat
Leverage 1x boleh mengelakkan risiko pembubaran, dan ciri berasaskan mata wang memastikan nilai dolar AS kekal malar, tanpa mengira turun naik pasaran yang besar.
Pendapatan stabil
Dalam pasaran kenaikan harga, kadar pendanaan lebih tinggi dan mempunyai skalabiliti yang kukuh, dan mata wang yang terhasil boleh digunakan untuk pelaburan lain (seperti staking).
Kekurangan ketegaran strategi
Strategi semasa tidak termasuk logik pelarasan dinamik, seperti kekurangan langkah tindak balas (seperti strategi henti rugi atau ambil untung) apabila bertukar antara pasaran kenaikkan dan penurunan harga.
Margin keuntungan terhad
Ia sesuai untuk mengenakan yuran “berbaring mendatar”, dan tidak dapat menangkap pulangan berlebihan dalam turun naik yang besar dalam pasaran Dalam sesetengah kes, kadar pulangan tidak sebagus dana bon tradisional.
Strategi arbitraj yuran jualan pendek berasaskan syiling menggunakan sepenuhnya sifat istimewa kontrak berasaskan syiling dan menyediakan penyelesaian berisiko rendah untuk pemeliharaan modal dan penghargaan yang stabil. Walau bagaimanapun, dalam menghadapi peringkat pasaran yang berbeza, strategi perlu mempunyai tahap fleksibiliti tertentu untuk menghadapi turun naik dalam kadar pembiayaan dan potensi risiko. Arah pengoptimuman masa hadapan mungkin termasuk:
Tetapi pada dasarnya, strategi ini pastipercanggahan. Andaian awal strategi ialah pasaran mata wang digital akan berada dalam pasaran kenaikan jangka panjang, dan kontrak berasaskan mata wang yang dipendekkan boleh digunakan untuk mengekalkan aliran tunai yang stabil dan mendapatkan faedah kadar pembiayaan. Walau bagaimanapun, jika kita menganggap bahawa pasaran berada dalam pasaran lembu jangka panjang, mengapa tidak memilih untuk menimbun syiling (hlod) dan menunggu kenaikan Bitcoin yang stabil? Sudah tentu, strategi ini masih boleh dipercayai untuk mereka yang mengejar pulangan yang stabil. Matlamat artikel ini adalah untuk memperkenalkan idea reka bentuk ini dan menyediakan rangka kerja strategi pelaburan kuantitatif, di mana anda boleh menambah baik dan mengoptimumkannya. Strategi ini diharapkan dapat menjadi alat yang berkesan untuk pelabur kuantitatif dalam mata wang digital.
Rujukan
Petua yang baik: Pelaburan adalah berisiko, sila berhati-hati apabila memasuki pasaran. Pelabur dinasihatkan untuk memperuntukkan dana secara munasabah dan mengawal kedudukan dan memanfaatkan dengan ketat berdasarkan pemahaman penuh logik strategi dan risiko, mengikut toleransi risiko mereka sendiri. Kandungan artikel ini adalah untuk rujukan sahaja dan tidak membentuk sebarang nasihat pelaburan.