2
fokus pada
20
Pengikut

Implementasi kuantitatif strategi arbitrase biaya penjualan pendek berbasis mata uang

Dibuat di: 2025-01-21 17:06:52, diperbarui pada: 2025-02-17 11:25:01
comments   0
hits   454

Implementasi kuantitatif strategi arbitrase biaya penjualan pendek berbasis mata uang

Bayangkan memiliki strategi yang dapat tetap stabil di tengah fluktuasi liar di pasar mata uang kripto, dan dapat memberi Anda keuntungan positif berkelanjutan terlepas dari pasar bullish atau bearish. Kedengarannya seperti fantasi? Kenyataannya tidak. Strategi arbitrase dengan menjual mata uang secara singkat dengan biaya satu kali lipat adalah alat ajaib untuk menghasilkan uang tanpa melakukan apa pun.

Dengan memanfaatkan secara cerdik properti unik dari kontrak berbasis mata uang dan mekanisme tingkat pendanaan, strategi ini tidak hanya dapat memperoleh pengembalian yang stabil di pasar yang sedang menguat, tetapi juga secara efektif menghindari risiko di pasar yang sedang melemah dan mencapai pengembalian yang stabil di seluruh siklus pasar. Sifat kontrak berbasis koin yang “dilindungi uang tunai” memastikan bahwa nilai total strategi tetap stabil bahkan jika harga pasar berfluktuasi secara signifikan. Tingkat pendanaan, sebagai mekanisme inti kontrak abadi, menyediakan sumber pendapatan tambahan bagi strategi tersebut. Artikel ini akan menganalisis secara mendalam logika inti, proses implementasi, kelebihan dan kekurangan strategi short-selling berbasis koin untuk membantu investor memahami cara mencapai “pendapatan pasif” melalui strategi ini di pasar mata uang digital. Apakah Anda seorang pemula dalam perdagangan kuantitatif atau investor berpengalaman, strategi ini layak untuk Anda pahami dan coba secara mendalam.

Penjualan pendek berbasis koin

Karakteristik standar mata uang

Unit kontrak bermargin koin diukur dalam lembaran, dan nilai setiap lembar ditetapkan (misalnya, 1 kontrak BTC bernilai 100 USD, dan 10 USD untuk ETH). Fitur ini berarti bahwa dalam kasus leverage 1x, bahkan jika harga pasar berfluktuasi besar, secara teoritis tidak akan ada margin call.

Analisis untung rugi

Dengan asumsi harga saat ini adalah 100 USD, 10 kontrak short margin koin dibuka, dan nilainya sama dengan 100 USD, yang dikonversi menjadi 1 unit koin:

  1. Penurunan harga

    • Harganya turun menjadi 50 USD, dan tingkat pengembaliannya adalah: [ Tingkat pengembalian = \frac{100 - 50}{50} = 100% ] Jumlah koin yang dimiliki menjadi 2, dan nilai totalnya tetap: [ 2 \times 50 = 100 , \text{USD} ]
  2. Kenaikan harga

    • Harganya naik menjadi 200 USD, dan tingkat pengembaliannya adalah: [ Tingkat pengembalian = \frac{100 - 200}{200} = -50% ] Jumlah koin yang dimiliki menjadi 0,5, dan nilai totalnya tetap: [ 0.5 \times 200 = 100 , \text{USD} ]

Oleh karena itu, sampai batas tertentu, nilai total penjualan pendek berbasis mata uang tetap stabil, yang merupakan operasi pelestarian uang tunai. Jadi, dari mana keuntungan dari strategi ini berasal? Mari kita perkenalkan konsep berikut:Tingkat Pendanaan

Tingkat Pendanaan

Dalam strategi penjualan pendek berbasis mata uang,Tingkat PendanaanIni adalah salah satu pendorong utama pengembalian strategi, dan karakteristik serta perubahannya secara langsung memengaruhi stabilitas dan profitabilitas strategi. Dengan memanfaatkan karakteristik tingkat pendanaan secara tepat, strategi dapat mempertahankan kinerja yang baik di berbagai lingkungan pasar, tetapi perlu juga memperhatikan potensi keterbatasannya.

Definisi dan Karakteristik Tingkat Pendanaan

Tingkat pendanaan adalah mekanisme regulasi dalam pasar kontrak abadi, yang bertujuan untuk menyeimbangkan biaya kepemilikan pihak jangka panjang dan jangka pendek serta mencegah harga kontrak abadi menyimpang dari harga spot untuk jangka waktu yang lama. Faktanya, teman-teman yang pernah belajar CFA pasti masih ingat nama asli kontrak abadi, swap. Inspirasi desain mekanisme tingkat pendanaan kontrak abadi sebagian besar berasal dari pertukaran suku bunga dalam keuangan tradisional. Dalam pertukaran suku bunga, dua pihak saling menukar pembayaran bunga secara berkala berdasarkan suku bunga yang disepakati (misalnya, suku bunga tetap vs. suku bunga mengambang) untuk melindungi dari risiko fluktuasi suku bunga. Demikian pula, mekanisme tingkat pendanaan kontrak abadi juga menyeimbangkan biaya kepemilikan pihak panjang dan pendek dengan membayar atau memungut biaya secara teratur, memastikan bahwa kesenjangan antara harga kontrak dan harga spot tidak terlalu besar.

Implementasi kuantitatif strategi arbitrase biaya penjualan pendek berbasis mata uang

Pengenalan tingkat pendanaan pada hakikatnya adalah untuk memecahkan masalah dasar antara kontrak abadi dan harga spot. Bila harga kontrak abadi lebih tinggi daripada harga spot, maka tingkat pendanaannya positif dan pihak yang memegang posisi long membayar biaya kepada pihak yang memegang posisi short. Bila harga kontrak abadi lebih rendah daripada harga spot, maka tingkat pendanaannya negatif dan pihak yang memegang posisi short membayar biaya kepada pihak yang memegang posisi long. Mekanisme ini tidak hanya memanfaatkan konsep inti pertukaran suku bunga, tetapi juga menggabungkan karakteristik pasar mata uang digital untuk membentuk alat regulasi pasar yang unik. Di bidang mata uang digital, fitur utamanya meliputi:

  1. Penawaran dan permintaan pasar menentukan:Tingkat pendanaan ditentukan oleh hubungan penawaran dan permintaan antara posisi long dan short di pasar dan merupakan hasil permainan antara kekuatan long dan short.
  2. Pembayaran Berkala:Tingkat pendanaan dibayarkan pada periode tertentu (misalnya 8 jam), dan biaya ditransfer antara posisi panjang dan pendek.
  3. Refleksi emosional:Tingkat pendanaan yang positif biasanya menunjukkan bahwa sentimen pasar sedang bullish dan harga kontrak berjangka lebih tinggi daripada harga spot; tingkat pendanaan yang negatif biasanya menunjukkan bahwa sentimen pasar sedang bearish dan harga kontrak berjangka lebih rendah daripada harga spot.

Tingkat Pendanaan Positif (Tingkat Pendanaan > 0)

  • Pertunjukan:Dalam lingkungan tingkat pendanaan positif, pihak yang memegang posisi long harus membayar biaya kepada pihak yang memegang posisi short.
  • Logika Pendapatan:Dengan pembayaran tingkat pendanaan yang stabil, strategi terus mengumpulkan biaya pendanaan dengan menahan posisi pendek, dan bahkan jika harga pasar naik, hal itu tidak akan memiliki dampak negatif yang signifikan pada pengembalian. Misalnya, ketika tingkat pendanaan adalah 0,02%/8 jam, memegang kontrak senilai $10.000 akan menghasilkan pengembalian harian berikut: [ Pendapatan harian = 10.000 \kali 0,02% \times 3 = 6 , \text{USDT} ] Sumber pendapatan ini relatif stabil dan kurang berkorelasi dengan fluktuasi harga.

Tingkat Pendanaan Negatif (Tingkat Pendanaan < 0)

  • Pertunjukan:Ketika tingkat pendanaan negatif, posisi pendek perlu membayar biaya kepada posisi panjang, dan pengembalian strategi dapat tertekan atau bahkan mengakibatkan kerugian.
  • Titik Risiko:Jika suku bunga pendanaan negatif bertahan dalam jangka waktu lama atau berfluktuasi drastis, seperti pada pasar yang melemah dalam jangka waktu lama, strategi tersebut mungkin menghadapi biaya yang lebih tinggi akibat membayar biaya pendanaan, yang mengakibatkan laba keseluruhan tidak mampu menutupi biaya operasional.

Sumber keuntungan strategis

Seperti yang dikatakan Master Zinan, pada tahap awal pembangunan strategi, perlu dipahami sumber keuntungan dan risiko strategi. Berdasarkan uraian di atas, kita pahami bahwa nilai total short selling dalam standar mata uang akan tetap stabil, sehingga sumber pendapatannya adalah pendanaan arbitrase suku bunga. Beberapa siswa mungkin penasaran, apakah tingkat pendanaan akan terus memberikan hasil positif yang stabil? Kami melakukan pekerjaan analisis data di Stasiun Internasional 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 dinamis menggunakan bursa Binance, dan kontrak memilih kontrak standar Bitcoin (btc_usd) untuk menampilkan tingkat pendanaan kumulatif. Terlihat bahwa sejak tahun 2020 sampai dengan saat ini, pendapatan tingkat pendanaan menunjukkan tingkat peningkatan yang stabil, dengan pendapatan kumulatif lima tahun mencapai 50%. Meskipun tidak dapat dibandingkan dengan keuntungan ratusan atau ribuan, namun relatif stabil, sehingga kita dapat memilah sumber keuntungan dari strategi ini.

Dalam strategi penjualan pendek berbasis koin, tingkat pendanaan adalah sumber utama keuntungan. Karena unit kontrak bermargin koin bersifat tetap, bahkan jika harga pasar berfluktuasi, perubahan nilai kontrak untuk penjual pendek biasanya dapat dikendalikan, sehingga tingkat pendanaan menjadi sumber keuntungan utama bagi strategi tersebut. Berikut ini adalah dampak spesifik tingkat pendanaan terhadap strategi:

  1. Fase Pasar Bull (Tingkat Pendanaan Positif)

    • Fenomena pasar: Dalam pasar yang sedang menguat, akibat sentimen pasar yang tinggi, para investor pada umumnya cenderung mengambil posisi panjang, yang mengakibatkan peningkatan dalam posisi panjang, sehingga mendorong tingkat pendanaan ke nilai positif.
    • Logika Pendapatan: Dalam kasus ini, penjual pendek akan mendapat keuntungan dari tingkat pendanaan yang dibayarkan oleh penjual panjang, yang akan menjadi sumber keuntungan utama bagi strategi tersebut. Karena tingkat pendanaan positif, posisi short dapat terus menghasilkan keuntungan, dan dengan memanfaatkan tingkat pendanaan yang diperoleh, Anda dapat terus membuka posisi short dan memperoleh lebih banyak manfaat tingkat pendanaan.
    • Dampak spesifik: Jika tingkat pendanaan positif dan stabil, short akan menerima tingkat pendanaan secara teratur dan tidak akan terlalu terpengaruh oleh fluktuasi harga. Bahkan jika harga pasar naik, penjual pendek mungkin menghadapi kerugian besar atas kontrak tersebut, tetapi secara keseluruhan, nilai bersih dana tersebut tetap relatif stabil. Hal ini karena sumber keuntungan dari strategi tersebut terutama bergantung pada pengumpulan tingkat pendanaan daripada fluktuasi harga. Meskipun fluktuasi harga dapat memengaruhi kerugian nyata kontrak, karena perubahan nilai kontrak pada posisi short dapat dikendalikan, laba utama dana tersebut tetap berasal dari pengumpulan tingkat pendanaan secara berkala, bukan dari fluktuasi harga pasar. Hal ini memungkinkan strategi tersebut untuk mengimbangi risiko fluktuasi harga sampai batas tertentu dan mempertahankan apresiasi dana yang stabil.
  2. Fase Pasar Beruang (Tingkat Pendanaan Negatif)

    • Fenomena pasar: Dalam pasar yang sedang melemah, harga pasar turun dengan cepat dan posisi short biasanya melonjak, menyebabkan tingkat pendanaan menjadi negatif, yang berarti bahwa pihak short harus membayar pihak long. Akan tetapi, karena pasar mata uang digital sedang berkembang pesat dalam beberapa tahun terakhir, fase pasar melemah relatif jarang terjadi.
    • Logika Pendapatan:Meskipun tingkat pendanaan negatif dan pihak short perlu membayar biaya, karakteristik lindung nilai dari strategi tersebut masih berlaku karena unit kontrak short bersifat tetap dan nilai kontrak posisi short hanya berubah sedikit. Fluktuasi harga yang tajam tidak akan menyebabkan kerugian besar. Pada saat yang sama, beban suku bunga pendanaan relatif dapat dikendalikan, dan strategi masih dapat tetap stabil sampai batas tertentu.

Melalui analisis kedua lingkungan pasar ini, dapat dilihat bahwa profitabilitas dan risiko strategi penjualan pendek berbasis mata uang terutama dipengaruhi oleh tingkat pendanaan. Ketika tingkat pendanaan positif di pasar bullish, penjual pendek dapat mengambil keuntungan darinya; sementara di pasar bearish, meskipun tingkat pendanaan negatif, strategi tersebut masih memiliki kemampuan kuat untuk mempertahankan nilai karena perubahan dalam nilai kontrak dapat dikendalikan.

Arsitektur logika kebijakan

Kerangka strategi yang kuat merupakan kunci keberhasilan implementasi suatu strategi. Kerangka ini menyediakan kerangka pelaksanaan yang jelas untuk memastikan bahwa strategi dapat beroperasi secara stabil dalam berbagai kondisi pasar dan secara efektif menangani risiko dan volatilitas. Di sini kami merujuk pada kerangka strategi kontrak multimata uang berbasis U dari Xiaocao Dashen, dan membuat modifikasi serta peningkatan tertentu pada standar mata uang.

'''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)

1. Variabel global dan deskripsi fungsi

Strategi ini didasarkan pada definisi variabel sederhana dan menerapkan penambahan posisi bergulir dan pemantauan status melalui fungsi modular.

  • SYMBOLS: Perdagangan mata uang (seperti “BTC”).
  • QUOTO:Mata uang dasar, mata uang standar biasanya USD.
  • INTERVAL: Interval waktu antara siklus kebijakan.
  • ICEMONEY: Jumlah pesanan awal, digunakan untuk pesanan gunung es.
  • ROLLINGNUM: Jumlah posisi yang ditambahkan setelah laba bergulir.

2. Modul fungsional inti

Berikut ini adalah deskripsi singkat dari setiap modul fungsional:

  1. Fungsi inisialisasi (InitInfo)
    Digunakan untuk memuat informasi mata uang transaksi dan status awal akun.

  2. Dapatkan Informasi Presisi (GetPrecision)
    Dapatkan ukuran pesanan minimum dan nilai kontrak untuk setiap pasangan perdagangan melalui API bursa.

  3. PembaruanTicker
    Dapatkan informasi pasar terkini secara berkala, termasuk harga penawaran terbaik, harga permintaan terbaik, dan harga terbaru.

  4. Pembaruan akun dan posisi (UpdateAccount, UpdatePosition)
    Sinkronisasi saldo akun dan informasi posisi secara real-time menyediakan dasar untuk keputusan perdagangan.

  5. Perdagangan dan Manajemen Pesanan (Pesanan, Perdagangan)
    Fungsi penempatan dan eksekusi order terpadu, mendukung order terbatas dan order pasar.

  6. Pemantauan Status (UpdateStatus)
    Melacak status strategi, termasuk laba rugi terkini dan pesanan yang belum terpenuhi.

3. Logika urutan strategi (MakeOrder)

Inti dari strategi ini adalahPosisi Awal(Posisi Gunung Es) danPosisi berguling(Dikendalikan oleh parameter posisi bergulir ROLLINGNUM). Berikut ini adalah penjelasan rinci tentang logika spesifiknya:

  1. Pemeriksaan posisi awal:Verifikasi apakah saldo akun lebih besar dari jumlah awal pembukaan gunung es (ICEMONEY). Jika persyaratan terpenuhi, posisi akan dibuka secara bertahap dalam beberapa kelompok untuk mengurangi selip harga berlebihan yang disebabkan oleh pembukaan posisi sekaligus.
  2. Strategi posisi bergulir:Sesuai dengan profitabilitas akun (pendapatan tingkat pendanaan), tingkatkan posisi secara wajar, optimalkan pendapatan melalui peningkatan posisi bergilir, sehingga dapat meningkatkan profitabilitas strategi secara keseluruhan.

Implementasi kuantitatif strategi arbitrase biaya penjualan pendek berbasis mata uang

Berdasarkan hasil pengujian ulang strategi, kita dapat melihat bahwa strategi tersebut telah mencapai laba yang stabil dalam berbagai siklus pasar, terutama pada pasar bullish di mana tingkat pendanaan telah positif dalam jangka waktu yang lama. Oleh karena itu, strategi ini sangat cocok untuk pengelolaan dana besar sampai batas tertentu. Karakteristiknya yang volatilitas rendah dan pengembalian stabil dapat memenuhi kebutuhan ganda dana besar untuk pengendalian risiko dan pengembalian stabil. Pada saat yang sama, strategi ini mengadopsi leverage 1x, yang menghindari risiko likuidasi yang disebabkan oleh leverage tinggi dan lebih meningkatkan keamanannya.

Analisis keuntungan dan kerugian strategi

keuntungan

  1. Strateginya sederhana dan mudah dijalankan
    Logikanya jelas dan tidak memerlukan perhitungan rumit, sehingga cocok untuk pengelolaan dana besar oleh dana lindung nilai atau investor individu.

  2. Resistensi risiko yang kuat
    Leverage 1x dapat menghindari risiko likuidasi, dan karakteristik berbasis mata uang memastikan bahwa nilai dolar AS tetap konstan, terlepas dari fluktuasi pasar yang besar.

  3. Pendapatan stabil
    Dalam pasar yang sedang naik, tingkat pendanaan lebih tinggi dan memiliki skalabilitas yang kuat, dan mata uang yang dihasilkan dapat digunakan untuk investasi lain (seperti staking).

kekurangan

  1. Ketergantungan yang kuat pada mata uang dan kondisi pasar
    Ini adalah kelemahan. Ketika tingkat pendanaan suatu mata uang positif untuk jangka waktu yang lama (short membayar long), seperti kontrak BNB, gunakan DATADATA untuk memilih kontrak berbasis koin BNB. Anda dapat melihat bahwa karena pengaturan bursa, tingkat pendanaan terakumulasi ke nilai negatif. Selain itu, ketika siklus besar berada dalam pasar beruang jangka panjang (2022) dan tingkat pendanaan negatif, pengembaliannya mungkin tidak dapat menutupi biaya operasi strategi.

  1. Kurangnya kekakuan strategi
    Strategi saat ini tidak menyertakan logika penyesuaian dinamis, seperti kurangnya tindakan respons (seperti strategi stop-loss atau take-profit) saat beralih antara pasar bullish dan bearish.

  2. Margin keuntungan terbatas
    Dana ini cocok untuk mengenakan biaya yang “tetap” dan tidak dapat memperoleh keuntungan berlebih dalam fluktuasi pasar yang besar. Dalam beberapa kasus, tingkat keuntungan tidak sebaik dana obligasi tradisional.

Kesimpulan

Strategi arbitrase biaya penjualan pendek satu kali berbasis koin memanfaatkan sepenuhnya properti khusus kontrak berbasis koin dan menyediakan solusi berisiko rendah untuk pelestarian modal dan apresiasi yang stabil. Namun, dalam menghadapi tahapan pasar yang berbeda, strategi perlu memiliki tingkat fleksibilitas tertentu untuk mengatasi fluktuasi dalam tingkat pendanaan dan potensi risiko. Arah pengoptimalan di masa mendatang mungkin mencakup:

  1. Tambahkan langkah-langkah manajemen dinamis untuk peralihan pasar bull-bear;
  2. Sesuaikan laju penambahan posisi berdasarkan perubahan dalam tingkat pendanaan.

Namun pada intinya, strategi ini memiliki beberapakontradiksi. Asumsi awal dari strategi ini adalah bahwa pasar mata uang digital akan berada dalam pasar bullish jangka panjang, dan penjualan kontrak berbasis mata uang dapat digunakan untuk menjaga arus kas yang stabil dan memperoleh manfaat tingkat pendanaan. Akan tetapi, jika kita berasumsi bahwa pasar sedang dalam bull market jangka panjang, mengapa tidak memilih menimbun koin (hlod) dan menunggu kenaikan Bitcoin yang stabil? Tentu saja, strategi ini masih dapat diandalkan bagi mereka yang mengejar keuntungan stabil. Tujuan artikel ini adalah untuk memperkenalkan ide desain ini dan menyediakan kerangka strategi investasi kuantitatif, yang dapat Anda tingkatkan dan optimalkan lebih lanjut. Diharapkan bahwa strategi ini dapat menjadi alat yang efektif bagi investor kuantitatif dalam mata uang digital.

Referensi

Cara cepat membangun strategi perdagangan multi mata uang universal setelah peningkatan FMZ

Diary Praktik Trading Algoritmik (19) - Seri Penjelasan Rinci Strategi Arbitrase (1): Arbitrase Biaya Short-Selling Berbasis Mata Uang

Tips yang baik:Investasi berisiko, harap berhati-hati saat memasuki pasar. Investor disarankan untuk mengalokasikan dana secara wajar dan mengontrol posisi dan leverage secara ketat berdasarkan pemahaman menyeluruh tentang logika strategi dan risiko, sesuai dengan toleransi risiko mereka sendiri. Konten artikel ini hanya untuk referensi dan tidak merupakan nasihat investasi.