2
konzentrieren Sie sich auf
20
Anhänger

Quantitative Umsetzung einer währungsbasierten Short-Selling-Gebührenarbitrage-Strategie

Erstellt in: 2025-01-21 17:06:52, aktualisiert am: 2025-02-17 11:25:01
comments   0
hits   455

Quantitative Umsetzung einer währungsbasierten Short-Selling-Gebührenarbitrage-Strategie

Stellen Sie sich vor, Sie hätten eine Strategie, die trotz der starken Schwankungen auf dem Kryptowährungsmarkt stabil bleibt und Ihnen unabhängig von Bullen- oder Bärenmärkten dauerhaft positive Renditen bescheren kann. Klingt das wie eine Fantasie? Eigentlich ist es das nicht. Die Arbitragestrategie, die Währung mit dem Einfachen der Gebühr zu shorten, ist solch ein magisches Mittel, um Geld zu verdienen, ohne etwas dafür zu tun.

Durch geschickte Ausnutzung der einzigartigen Eigenschaften währungsbasierter Verträge und des Finanzierungssatzmechanismus können mit dieser Strategie nicht nur stabile Renditen in einem Bullenmarkt erzielt werden, sondern auch Risiken in einem Bärenmarkt wirksam vermieden und über Marktzyklen hinweg stabile Renditen erzielt werden. Der „Bargeldschutz“ der münzbasierten Verträge stellt sicher, dass der Gesamtwert der Strategie auch bei erheblichen Marktpreisschwankungen stabil bleibt. Der Finanzierungssatz als Kernmechanismus unbefristeter Verträge stellt eine zusätzliche Einnahmequelle für die Strategie dar. In diesem Artikel werden die Kernlogik, der Implementierungsprozess sowie die Vor- und Nachteile der münzbasierten Leerverkaufsstrategie eingehend analysiert, um Anlegern zu helfen, zu verstehen, wie sie mit dieser Strategie auf dem Markt für digitale Währungen ein „passives Einkommen“ erzielen können. Unabhängig davon, ob Sie ein Neuling im quantitativen Handel oder ein erfahrener Anleger sind, lohnt es sich, diese Strategie gründlich zu verstehen und auszuprobieren.

Münzbasierte Leerverkäufe

Merkmale des Währungsstandards

Die Einheit des Münzmargenvertrags wird in Blättern gemessen und der Wert jedes Blatts ist festgelegt (zum Beispiel ist 1 BTC-Vertrag 100 USD wert, und 10 USD ETH). Diese Funktion bedeutet, dass bei einem Hebel von 1x selbst bei starken Marktpreisschwankungen theoretisch kein Margin Call erfolgt.

Gewinn- und Verlustanalyse

Angenommen, der aktuelle Preis beträgt 100 USD, dann werden 10 Coin-Margin-Short-Kontrakte eröffnet und ihr Wert beträgt 100 USD, was in 1 Coin-Einheit umgerechnet wird:

  1. Preissenkung

    • Der Preis sinkt auf 50 USD und die Rendite beträgt: [ \text{Rendite} = \frac{100 - 50}{50} = 100% ] Die Anzahl der gehaltenen Münzen beträgt 2 und der Gesamtwert bleibt: [ 2 \times 50 = 100 , \text{USD} ]
  2. Preiserhöhung

    • Der Preis steigt auf 200 USD und die Rendite beträgt: [ \text{Rendite} = \frac{100 - 200}{200} = -50% ] Die Anzahl der gehaltenen Münzen beträgt 0,5 und der Gesamtwert bleibt: [ 0.5 \times 200 = 100 , \text{USD} ]

Daher bleibt der Gesamtwert der währungsbasierten Leerverkäufe bis zu einem gewissen Grad stabil, es handelt sich dabei um eine Operation zur Bargelderhaltung. Woher kommt also der Gewinn dieser Strategie? Lassen Sie uns das nächste Konzept vorstellen:Finanzierungssatz

Finanzierungssatz

Bei der währungsbasierten LeerverkaufsstrategieFinanzierungssatzEs handelt sich um einen der Haupttreiber der Strategierendite und seine Eigenschaften und Änderungen wirken sich direkt auf die Stabilität und Rentabilität der Strategie aus. Durch die richtige Ausnutzung der Eigenschaften der Finanzierungssätze können Strategien in unterschiedlichen Marktumgebungen eine gute Performance aufrechterhalten, aber es ist auch notwendig, auf ihre potenziellen Einschränkungen zu achten.

Definition und Merkmale des Finanzierungssatzes

Der Finanzierungssatz ist ein Regulierungsmechanismus auf dem Markt für unbefristete Kontrakte, der darauf abzielt, die Haltekosten von Long- und Short-Parteien auszugleichen und zu verhindern, dass der Preis für unbefristete Kontrakte über einen längeren Zeitraum vom Spotpreis abweicht. Tatsächlich werden sich Freunde, die CFA studiert haben, noch an den ursprünglichen Namen des unbefristeten Vertrags erinnern, „Swap“. Die Gestaltungsinspiration für den Finanzierungsratenmechanismus unbefristeter Verträge ist weitgehend vom Zinsswap im traditionellen Finanzwesen abgeleitet. Bei einem Zinsswap tauschen zwei Parteien in regelmäßigen Abständen Zinszahlungen auf Basis eines vereinbarten Zinssatzes (z. B. Festzins vs. variabler Zinssatz) aus, um sich gegen das Risiko von Zinsschwankungen abzusichern. In ähnlicher Weise gleicht der Finanzierungsratenmechanismus unbefristeter Verträge die Haltekosten von Long- und Short-Parteien aus, indem er regelmäßig Gebühren zahlt oder einzieht und so sicherstellt, dass die Lücke zwischen dem Vertragspreis und dem Spotpreis nicht zu groß ist.

Quantitative Umsetzung einer währungsbasierten Short-Selling-Gebührenarbitrage-Strategie

Die Einführung eines Finanzierungssatzes dient im Wesentlichen der Lösung des Basisproblems zwischen unbefristeten Verträgen und Spotpreisen. Wenn der Preis des unbefristeten Kontrakts höher ist als der Spotpreis, ist der Finanzierungssatz positiv und Long-Positionen zahlen Gebühren an Short-Positionen; wenn der Preis des unbefristeten Kontrakts niedriger ist als der Spotpreis, ist der Finanzierungssatz negativ und Short-Positionen zahlen Gebühren an Long-Positionen. Dieser Mechanismus greift nicht nur das Kernkonzept von Zinsswaps auf, sondern kombiniert auch die Merkmale des digitalen Währungsmarktes zu einem einzigartigen Instrument der Marktregulierung. Zu den Hauptmerkmalen im Bereich der digitalen Währung gehören:

  1. Angebot und Nachfrage auf dem Markt bestimmen:Der Finanzierungssatz wird durch das Angebots- und Nachfrageverhältnis zwischen Longs und Shorts auf dem Markt bestimmt und ist das Ergebnis des Spiels zwischen Long- und Short-Kräften.
  2. Periodische Zahlung: Der Finanzierungssatz wird in einem bestimmten Zeitraum (z. B. alle 8 Stunden) ausgezahlt und die Gebühren werden zwischen Long- und Short-Positionen übertragen.
  3. Emotionale Reflexion: Ein positiver Finanzierungssatz zeigt normalerweise an, dass die Marktstimmung optimistisch ist und der Preis des unbefristeten Vertrags höher ist als der Spotpreis. Ein negativer Finanzierungssatz zeigt normalerweise an, dass die Marktstimmung pessimistisch ist und der Preis des unbefristeten Vertrags niedriger ist als der Spotpreis.

Positive Finanzierungsrate (Finanzierungsrate > 0)

  • Leistung: In einem Umfeld mit positiven Finanzierungszinsen müssen Long-Positionen Gebühren an Shorts zahlen.
  • Umsatzlogik:Bei stabiler Zahlung des Finanzierungssatzes sammelt die Strategie weiterhin Finanzierungsgebühren durch das Halten von Short-Positionen, und selbst wenn der Marktpreis steigt, wirkt sich dies nicht wesentlich negativ auf die Rendite aus. Wenn beispielsweise der Finanzierungssatz 0,02 %/8 Stunden beträgt, ergibt sich bei einem Kontrakt im Wert von 10.000 US-Dollar folgende tägliche Rendite: [ Tagesumsatz = 10.000 \times 0,02% \times 3 = 6 , \text{USDT} ] Diese Einnahmequelle ist relativ stabil und weniger von Preisschwankungen abhängig.

Negativer Finanzierungssatz (Finanzierungssatz < 0)

  • Leistung:Wenn der Finanzierungssatz negativ ist, müssen für Short-Positionen Gebühren für Long-Positionen gezahlt werden, und die Strategierenditen können sinken oder sogar zu Verlusten führen.
  • Risikopunkte:Wenn negative Finanzierungszinsen über einen langen Zeitraum bestehen bleiben oder stark schwanken, wie etwa in einer lang anhaltenden Baisse, können für die Strategie aufgrund der Zahlung von Finanzierungsgebühren höhere Kosten anfallen, was dazu führt, dass die Gesamtrendite die Betriebskosten nicht decken kann.

Strategische Gewinnquellen

Wie Meister Zinan sagte, ist es in der Anfangsphase der Strategieentwicklung notwendig, die Ertragsquellen und Risiken der Strategie zu verstehen. Auf Grundlage der oben genannten Punkte gehen wir davon aus, dass der Gesamtwert der Leerverkäufe in der Standardwährung stabil bleiben muss, sodass die Einnahmequelle in der Finanzierungszinsarbitrage liegt. Manche Studierende fragen sich vielleicht, ob der Finanzierungssatz auch weiterhin stabile positive Erträge bringen wird? Wir führen Datenanalysearbeiten bei DATADATA International Station durch:

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;

Die dynamischen Parameter verwenden die Binance-Börse und der Vertrag wählt den Bitcoin-Standardvertrag (btc_usd) aus, um den kumulativen Finanzierungssatz anzuzeigen. Es ist ersichtlich, dass die Einnahmen aus der Finanzierungsrate von 2020 bis heute ein stetig steigendes Niveau aufweisen, wobei die kumulierten Einnahmen der letzten fünf Jahre 50 % erreichen. Obwohl er sich nicht mit den Gewinnen von Hunderten oder Tausenden vergleichen lässt, ist er relativ stabil, sodass wir die Gewinnquellen dieser Strategie herausfinden können.

Bei der münzbasierten Leerverkaufsstrategie ist der Finanzierungssatz die wichtigste Gewinnquelle. Da die Einheiten von Coin-Margin-Kontrakten fest sind, sind die Veränderungen des Kontraktwerts für Leerverkäufer in der Regel kontrollierbar, selbst wenn die Marktpreise schwanken, sodass der Finanzierungssatz zur Hauptgewinnquelle für die Strategie wird. Im Folgenden sind die spezifischen Auswirkungen der Finanzierungsraten auf Strategien aufgeführt:

  1. Bullenmarktphase (Finanzierungsrate ist positiv)

    • Marktphänomen:In einem Bullenmarkt tendieren Anleger aufgrund der hohen Marktstimmung im Allgemeinen zu Long-Positionen, was zu einem Anstieg der Long-Positionen führt und somit den Finanzierungssatz auf einen positiven Wert treibt.
    • Umsatzlogik: In diesem Fall profitieren Leerverkäufer vom Finanzierungssatz, den Long-Positionen zahlen, was zur Hauptgewinnquelle der Strategie wird. Da der Finanzierungssatz positiv ist, können Short-Positionen weiterhin Gewinne erzielen, und durch die Nutzung des erhaltenen Finanzierungssatzes können Sie weiterhin Short-Positionen eröffnen und weitere Vorteile aus dem Finanzierungssatz ziehen.
    • Spezifische Auswirkungen: Wenn der Finanzierungssatz positiv und stabil ist, erhalten Shorts den Finanzierungssatz regelmäßig und sind von Preisschwankungen nicht zu stark betroffen. Selbst wenn der Marktpreis steigt, müssen die Leerverkäufer mit scheinbar hohen Verlusten aus dem Kontrakt rechnen, insgesamt bleibt der Nettowert der Fonds jedoch relativ stabil. Dies liegt daran, dass die Gewinnquelle der Strategie in erster Linie von der Erhebung von Finanzierungssätzen und nicht von Preisschwankungen abhängt. Obwohl Preisschwankungen den scheinbaren Verlust des Kontrakts beeinflussen können, resultiert der Hauptgewinn der Fonds, da die Änderungen des Kontraktwerts der Short-Position kontrollierbar sind, immer noch aus der regelmäßigen Erhebung der Finanzierungssätze und nicht aus Marktpreisschwankungen. Dadurch ist die Strategie in der Lage, das Risiko von Preisschwankungen bis zu einem gewissen Grad auszugleichen und eine stabile Wertsteigerung der Fonds aufrechtzuerhalten.
  2. Bärenmarktphase (negativer Finanzierungssatz)

    • Marktphänomen: In einem Bärenmarkt fallen die Marktpreise schnell und Short-Positionen steigen normalerweise stark an, wodurch der Finanzierungssatz negativ wird und Shortseller für Long-Positionen zahlen müssen. Aufgrund des Booms des digitalen Währungsmarktes in den letzten Jahren sind Bärenmarktphasen jedoch relativ selten.
    • Umsatzlogik: Obwohl der Finanzierungssatz negativ ist und Short-Positionen Gebühren zahlen müssen, sind die Absicherungseigenschaften der Strategie weiterhin gültig, da die Einheit des Short-Kontrakts fest ist und sich der Kontraktwert der Short-Position kaum ändert. Heftige Preisschwankungen führen nicht zu großen Verlusten. Gleichzeitig ist die Belastung durch die Finanzierungsraten relativ kontrollierbar und die Strategie kann bis zu einem gewissen Grad noch stabil bleiben.

Durch die Analyse dieser beiden Marktumgebungen wird deutlich, dass die Rentabilität und das Risiko der währungsbasierten Leerverkaufsstrategie hauptsächlich vom Finanzierungssatz beeinflusst werden. Wenn der Finanzierungssatz im Bullenmarkt positiv ist, können Leerverkäufer davon profitieren; im Bärenmarkt hingegen verfügt die Strategie trotz eines negativen Finanzierungssatzes immer noch über ein starkes Werterhaltungspotenzial, da die Änderungen des Kontraktwerts kontrollierbar sind.

Architektur der Richtlinienlogik

Ein robuster Strategierahmen ist der Schlüssel zur erfolgreichen Umsetzung einer Strategie. Er bietet einen klaren Rahmen für die Umsetzung, um sicherzustellen, dass die Strategie unter verschiedenen Marktbedingungen stabil funktionieren und Risiken und Volatilität effektiv bewältigen kann. Hier beziehen wir uns auf das U-basierte Mehrwährungsvertragsstrategie-Framework von Xiaocao Dashen und nehmen bestimmte Änderungen und Verbesserungen am Währungsstandard vor.

'''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. Globale Variablen und Funktionsbeschreibung

Die Strategie basiert auf einfachen Variablendefinitionen und implementiert rollierende Positionsergänzungen und Statusüberwachungen durch modulare Funktionen.

  • SYMBOLS: Handelswährung (z. B. „BTC“).
  • QUOTO: Basiswährung, der Währungsstandard ist normalerweise USD.
  • INTERVAL: Das Zeitintervall zwischen Richtlinienzyklen.
  • ICEMONEY: Ursprünglicher Bestellbetrag, der für Iceberg-Orders verwendet wird.
  • ROLLINGNUM: Die Anzahl der nach Rollgewinnen hinzugefügten Positionen.

2. Kernfunktionsmodule

Nachfolgend finden Sie eine kurze Beschreibung der einzelnen Funktionsmodule:

  1. Initialisierungsfunktion (InitInfo)
    Wird zum Laden von Transaktionswährungsinformationen und des anfänglichen Kontostatus verwendet.

  2. Präzisionsinformationen abrufen (GetPrecision)
    Holen Sie sich die Mindestbestellgröße und den Kontraktwert für jedes Handelspaar über die Börsen-API.

  3. UpdateTicker
    Erhalten Sie regelmäßig aktuelle Marktinformationen, darunter den besten Geldkurs, den besten Briefkurs und den aktuellsten Kurs.

  4. Konto- und Positionsaktualisierungen (UpdateAccount, UpdatePosition)
    Die Echtzeit-Synchronisierung von Kontoständen und Positionsinformationen bietet eine Grundlage für Handelsentscheidungen.

  5. Handel und Auftragsmanagement (Order, Trade)
    Einheitliche Funktionen zur Auftragserteilung und -ausführung, die Limit- und Marktaufträge unterstützen.

  6. Statusüberwachung (UpdateStatus)
    Verfolgen Sie den Strategiestatus, einschließlich aktueller Gewinne und Verluste sowie nicht ausgeführter Aufträge.

3. Strategie-Bestelllogik (MakeOrder)

Der Kern der Strategie istAusgangslage(Eisbergposition) undRollposition(Gesteuert durch den Rollpositionsparameter ROLLINGNUM). Nachfolgend finden Sie eine detaillierte Beschreibung der spezifischen Logik:

  1. Überprüfung der Ausgangslage: Überprüfen Sie, ob der Kontostand höher ist als der anfängliche Eröffnungsbetrag des Icebergs (ICEMONEY). Wenn die Bedingungen erfüllt sind, werden die Positionen schrittweise in Chargen eröffnet, um übermäßige Preisschwankungen zu vermeiden, die durch das einmalige Öffnen einer Position entstehen.
  2. Rollpositionsstrategie: Erhöhen Sie die Position entsprechend der Rentabilität des Kontos (Einkommen aus der Finanzierungsrate) angemessen und optimieren Sie das Einkommen durch fortlaufende Positionserhöhungen, um die Gesamtrentabilität der Strategie zu verbessern.

Quantitative Umsetzung einer währungsbasierten Short-Selling-Gebührenarbitrage-Strategie

Den Ergebnissen des Strategie-Backtests zufolge hat die Strategie in mehreren Marktzyklen stabile Renditen erzielt, insbesondere im Bullenmarkt, in dem die Finanzierungsrate lange Zeit positiv war. Daher eignet sich diese Strategie bis zu einem gewissen Grad sehr gut für die Verwaltung großer Fonds. Seine Eigenschaften der geringen Volatilität und der stabilen Erträge können den doppelten Bedarf großer Fonds nach Risikokontrolle und stabilen Erträgen erfüllen. Gleichzeitig setzt die Strategie auf einen einfachen Hebel, der das durch einen hohen Hebel bedingte Liquidationsrisiko vermeidet und die Sicherheit weiter erhöht.

Analyse der Vor- und Nachteile der Strategie

Vorteil

  1. Die Strategie ist einfach und leicht umzusetzen
    Die Logik ist klar und es sind keine komplizierten Berechnungen erforderlich, sodass es sich für die Verwaltung großer Fonds durch Hedgefonds oder Einzelanleger eignet.

  2. Hohe Risikoresistenz
    Durch den einfachen Hebel kann das Liquidationsrisiko vermieden werden und die währungsbasierten Eigenschaften stellen sicher, dass der Wert des US-Dollars unabhängig von großen Marktschwankungen konstant bleibt.

  3. Stabiles Einkommen
    In einem Bullenmarkt ist die Finanzierungsrate höher und weist eine starke Skalierbarkeit auf, und die resultierenden Währungen können für andere Investitionen (wie z. B. Staking) verwendet werden.

Mangel

  1. Starke Abhängigkeit von Währungs- und Marktbedingungen
    Dies ist ein Fehler. Wenn der Finanzierungssatz einer Währung über einen langen Zeitraum positiv ist (Shorts zahlen Longs), wie z. B. BNB-Verträge, verwenden Sie DATADATA, um auf BNB-Münzen basierende Verträge auszuwählen. Sie können sehen, dass sich der Finanzierungssatz aufgrund der Einstellungen der Börse zu einem negativen Wert ansammelt. Darüber hinaus können die Erträge möglicherweise nicht die Kosten für den Betrieb der Strategie decken, wenn sich der große Zyklus in einem langfristigen Bärenmarkt befindet (2022) und der Finanzierungssatz negativ ist.

  1. Fehlende Strategiestarrheit
    Eine dynamische Anpassungslogik, wie sie etwa durch fehlende Reaktionsmaßnahmen (wie Stop-Loss- oder Take-Profit-Strategien) beim Wechsel zwischen Bullen- und Bärenmärkten entsteht, ist in der aktuellen Strategie nicht vorgesehen.

  2. Begrenzte Gewinnspannen
    Es eignet sich für die Erhebung von Gebühren „flach liegend“ und kann bei großen Marktschwankungen keine Überrenditen erzielen. In einigen Fällen ist die Rendite nicht so gut wie bei herkömmlichen Anleihenfonds.

Zusammenfassung

Die münzbasierte Arbitragestrategie mit einmaliger Leerverkaufsgebühr nutzt die besonderen Eigenschaften münzbasierter Verträge voll aus und bietet eine risikoarme Lösung zur Kapitalerhaltung und stabilen Wertsteigerung. Angesichts unterschiedlicher Marktphasen müssen die Strategien jedoch über eine gewisse Flexibilität verfügen, um mit Schwankungen der Finanzierungssätze und potenziellen Risiken umgehen zu können. Zu den möglichen künftigen Optimierungsrichtungen zählen:

  1. Fügen Sie dynamische Managementmaßnahmen für den Wechsel von Bullen- zu Bärenmärkten hinzu.
  2. Passen Sie das Tempo der Hinzufügung von Positionen entsprechend den Änderungen der Finanzierungsraten an.

Aber im Wesentlichen hat diese Strategie gewisseWiderspruch. Die anfängliche Annahme der Strategie besteht darin, dass sich der Markt für digitale Währungen in einem langfristigen Bullenmarkt befinden wird und dass Leerverkäufe währungsbasierter Verträge dazu genutzt werden können, einen stabilen Cashflow aufrechtzuerhalten und Vorteile bei den Finanzierungszinsen zu erzielen. Wenn wir jedoch davon ausgehen, dass sich der Markt in einem langfristigen Bullenmarkt befindet, warum entscheiden wir uns dann nicht einfach dafür, Münzen zu horten (hlod) und auf den stetigen Anstieg von Bitcoin zu warten? Natürlich ist diese Strategie immer noch zuverlässig für diejenigen, die stabile Erträge anstreben. Das Ziel dieses Artikels besteht darin, diese Designidee vorzustellen und einen Rahmen für eine quantitative Anlagestrategie bereitzustellen, auf dessen Grundlage Sie diese weiter verbessern und optimieren können. Es besteht die Hoffnung, dass diese Strategie zu einem wirksamen Instrument für quantitative Anleger in digitale Währungen werden kann.

Verweise

So erstellen Sie nach dem FMZ-Upgrade schnell eine universelle Multi-Währungs-Handelsstrategie

Algorithmisches Handelspraxistagebuch (19) - Arbitragestrategie Detaillierte Erklärungsserie (1): Währungsbasierte Leerverkaufsgebühren-Arbitrage

Freundliche Tipps: Die Investition ist riskant, bitte seien Sie beim Markteintritt vorsichtig. Anlegern wird geraten, ihre Mittel entsprechend ihrer eigenen Risikotoleranz mit Bedacht zu verteilen und Positionen und Hebelwirkung auf der Grundlage eines umfassenden Verständnisses der Strategielogik und der Risiken streng zu kontrollieren. Der Inhalt dieses Artikels dient nur zu Referenzzwecken und stellt keine Anlageberatung dar.