2
tập trung vào
20
Người theo dõi

Triển khai định lượng chiến lược chênh lệch phí bán khống dựa trên tiền tệ

Được tạo ra trong: 2025-01-21 17:06:52, cập nhật trên: 2025-02-17 11:25:01
comments   0
hits   453

Triển khai định lượng chiến lược chênh lệch phí bán khống dựa trên tiền tệ

Hãy tưởng tượng bạn có một chiến lược có thể duy trì ổn định giữa những biến động mạnh trên thị trường tiền điện tử và có thể mang lại cho bạn lợi nhuận dương bền vững bất kể thị trường tăng hay giảm. Nghe giống như chuyện viễn tưởng phải không? Thực ra thì không phải vậy. Chiến lược chênh lệch giá bằng cách bán khống đồng tiền với mức phí gấp một lần thực sự là một công cụ kỳ diệu để kiếm tiền mà không cần phải làm gì cả.

Bằng cách sử dụng khéo léo các đặc tính độc đáo của hợp đồng dựa trên tiền tệ và cơ chế tỷ lệ tài trợ, chiến lược này không chỉ có thể đạt được lợi nhuận ổn định trong thị trường tăng giá mà còn tránh được rủi ro trong thị trường giảm giá và đạt được lợi nhuận ổn định trong suốt các chu kỳ thị trường. Bản chất “được bảo vệ bằng tiền mặt” của các hợp đồng dựa trên tiền xu đảm bảo rằng tổng giá trị của chiến lược vẫn ổn định ngay cả khi giá thị trường biến động đáng kể. Tỷ lệ tài trợ, là cơ chế cốt lõi của hợp đồng vĩnh viễn, cung cấp nguồn thu nhập bổ sung cho chiến lược. Bài viết này sẽ phân tích sâu về logic cốt lõi, quy trình triển khai, ưu điểm và nhược điểm của chiến lược bán khống dựa trên tiền điện tử để giúp các nhà đầu tư hiểu cách đạt được “thu nhập thụ động” thông qua chiến lược này trên thị trường tiền kỹ thuật số. Cho dù bạn là người mới tham gia giao dịch định lượng hay là nhà đầu tư giàu kinh nghiệm, chiến lược này đều đáng để bạn tìm hiểu sâu sắc và thử nghiệm.

Bán khống dựa trên tiền xu

Đặc điểm của chuẩn tiền tệ

Đơn vị của hợp đồng ký quỹ bằng tiền xu được đo bằng sheet và giá trị của mỗi sheet là cố định (ví dụ: 1 hợp đồng BTC có giá trị là 100 USD và 10 USD đối với ETH). Tính năng này có nghĩa là trong trường hợp đòn bẩy 1x, ngay cả khi giá thị trường biến động mạnh, về mặt lý thuyết sẽ không có lệnh gọi ký quỹ.

Phân tích lãi lỗ

Giả sử giá hiện tại là 100 USD, 10 hợp đồng bán khống ký quỹ bằng tiền xu được mở và giá trị của chúng bằng 100 USD, được chuyển đổi thành 1 đơn vị tiền xu:

  1. Giảm giá

    • Giá giảm xuống còn 50 USD và tỷ lệ lợi nhuận là: [ \text{Tỷ lệ hoàn vốn} = \frac{100 - 50}{50} = 100% ] Số lượng tiền xu nắm giữ là 2 và tổng giá trị vẫn giữ nguyên: [ 2 \times 50 = 100 , \text{USD} ]
  2. Tăng giá

    • Giá tăng lên 200 USD và tỷ lệ lợi nhuận là: [ \text{Tỷ lệ hoàn vốn} = \frac{100 - 200}{200} = -50% ] Số lượng tiền xu nắm giữ là 0,5 và tổng giá trị vẫn giữ nguyên: [ 0.5 \times 200 = 100 , \text{USD} ]

Do đó, ở một mức độ nào đó, tổng giá trị bán khống bằng tiền tệ vẫn ổn định, đây là một hoạt động bảo toàn tiền mặt. Vậy lợi nhuận của chiến lược này đến từ đâu? Chúng ta hãy cùng giới thiệu khái niệm tiếp theo:Tỷ lệ tài trợ

Tỷ lệ tài trợ

Trong chiến lược bán khống dựa trên tiền tệ,Tỷ lệ tài trợĐây là một trong những động lực cốt lõi của lợi nhuận chiến lược và các đặc điểm cũng như thay đổi của nó ảnh hưởng trực tiếp đến tính ổn định và lợi nhuận của chiến lược. Bằng cách sử dụng hợp lý các đặc điểm của tỷ lệ tài trợ, các chiến lược có thể duy trì hiệu suất tốt trong các môi trường thị trường khác nhau, nhưng cũng cần phải chú ý đến những hạn chế tiềm ẩn của chúng.

Định nghĩa và đặc điểm của tỷ lệ tài trợ

Tỷ lệ tài trợ là một cơ chế điều tiết trên thị trường hợp đồng vĩnh viễn, nhằm mục đích cân bằng chi phí nắm giữ của bên mua và bên bán, đồng thời ngăn chặn giá hợp đồng vĩnh viễn lệch khỏi giá giao ngay trong một thời gian dài. Trên thực tế, những người bạn đã từng học CFA sẽ vẫn nhớ tên gọi ban đầu của hợp đồng vĩnh viễn là swap. Cảm hứng thiết kế cơ chế tỷ lệ tài trợ của hợp đồng vĩnh viễn phần lớn bắt nguồn từ hoán đổi lãi suất trong tài chính truyền thống. Trong hợp đồng hoán đổi lãi suất, hai bên trao đổi các khoản thanh toán lãi theo các khoảng thời gian đều đặn dựa trên lãi suất đã thỏa thuận (ví dụ: lãi suất cố định so với lãi suất thả nổi) để phòng ngừa rủi ro biến động lãi suất. Tương tự như vậy, cơ chế tỷ lệ tài trợ của hợp đồng vĩnh viễn cũng cân bằng chi phí nắm giữ của bên mua và bên bán bằng cách trả hoặc thu phí thường xuyên, đảm bảo khoảng cách giữa giá hợp đồng và giá giao ngay không quá lớn.

Triển khai định lượng chiến lược chênh lệch phí bán khống dựa trên tiền tệ

Việc đưa ra tỷ lệ tài trợ về cơ bản là để giải quyết vấn đề cơ bản giữa hợp đồng vĩnh viễn và giá giao ngay. Khi giá hợp đồng vĩnh viễn cao hơn giá giao ngay, tỷ lệ tài trợ là dương và bên mua phải trả phí cho bên bán; khi giá hợp đồng vĩnh viễn thấp hơn giá giao ngay, tỷ lệ tài trợ là âm và bên bán phải trả phí cho bên mua. Cơ chế này không chỉ dựa trên khái niệm cốt lõi của hoán đổi lãi suất mà còn kết hợp các đặc điểm của thị trường tiền kỹ thuật số để tạo thành một công cụ điều tiết thị trường độc đáo. Trong lĩnh vực tiền kỹ thuật số, các tính năng chính của nó bao gồm:

  1. Cung cầu thị trường quyết định:Tỷ lệ tài trợ được xác định bởi mối quan hệ cung cầu giữa bên mua và bên bán trên thị trường và là kết quả của trò chơi giữa bên mua và bên bán.
  2. Thanh toán định kỳ:Tỷ lệ tài trợ được thanh toán vào một thời điểm nhất định (chẳng hạn như 8 giờ) và phí được chuyển giữa các vị thế mua và bán.
  3. Phản ánh cảm xúc:Tỷ lệ tài trợ dương thường chỉ ra rằng tâm lý thị trường đang tăng giá và giá hợp đồng vĩnh viễn cao hơn giá giao ngay; tỷ lệ tài trợ âm thường chỉ ra rằng tâm lý thị trường đang giảm giá và giá hợp đồng vĩnh viễn thấp hơn giá giao ngay.

Tỷ lệ tài trợ dương (Tỷ lệ tài trợ > 0)

  • Hiệu suất:Trong môi trường tỷ lệ tài trợ tích cực, bên mua phải trả phí cho bên bán.
  • Logic doanh thu:Với mức thanh toán ổn định của tỷ lệ tài trợ, chiến lược này tiếp tục thu phí tài trợ bằng cách nắm giữ các vị thế bán khống và ngay cả khi giá thị trường tăng, nó cũng sẽ không có tác động tiêu cực đáng kể đến lợi nhuận. Ví dụ, khi tỷ lệ tài trợ là 0,02%/8 giờ, nắm giữ hợp đồng có giá trị 10.000 đô la sẽ mang lại lợi nhuận hàng ngày sau: [ Doanh thu hàng ngày = 10.000 \times 0,02% \times 3 = 6 , \text{USDT} ] Nguồn thu nhập này tương đối ổn định và ít phụ thuộc vào biến động giá cả.

Tỷ lệ tài trợ âm (Tỷ lệ tài trợ < 0)

  • Hiệu suất:Khi tỷ lệ tài trợ âm, các vị thế bán khống phải trả phí cho các vị thế mua và lợi nhuận của chiến lược có thể bị giảm hoặc thậm chí dẫn đến thua lỗ.
  • Điểm rủi ro:Khi tỷ lệ tài trợ âm kéo dài trong thời gian dài hoặc biến động mạnh, chẳng hạn như trong thị trường giá xuống kéo dài, chiến lược có thể phải đối mặt với chi phí cao hơn do phải trả phí tài trợ, dẫn đến tổng lợi nhuận không đủ trang trải chi phí hoạt động.

Nguồn lợi nhuận chiến lược

Như Thầy Tử Nam đã nói, trong giai đoạn đầu xây dựng chiến lược, cần phải hiểu được nguồn lợi nhuận và rủi ro của chiến lược. Dựa trên những điều trên, chúng ta hiểu rằng tổng giá trị bán khống theo tiêu chuẩn tiền tệ là phải ổn định, do đó nguồn thu nhập là chênh lệch tỷ giá tài trợ. Một số sinh viên có thể tò mò, liệu tỷ lệ tài trợ có tiếp tục mang lại lợi nhuận tích cực ổn định hay không? Chúng tôi tiến hành công việc phân tích dữ liệu tại Trạm quốc tế 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;

Các tham số động sử dụng sàn giao dịch Binance và hợp đồng chọn hợp đồng Bitcoin tiêu chuẩn (btc_usd) để hiển thị tỷ lệ tài trợ tích lũy. Có thể thấy, từ năm 2020 đến nay, thu nhập lãi suất huy động liên tục tăng trưởng, với thu nhập lũy kế 5 năm đạt 50%. Tuy không thể so sánh với lợi nhuận hàng trăm, hàng nghìn nhưng lại tương đối ổn định nên chúng ta có thể phân loại nguồn lợi nhuận của chiến lược này.

Trong chiến lược bán khống bằng tiền xu, tỷ lệ tài trợ là nguồn lợi nhuận chính. Vì đơn vị hợp đồng ký quỹ bằng tiền xu là cố định, ngay cả khi giá thị trường biến động, những thay đổi về giá trị hợp đồng đối với người bán khống thường có thể kiểm soát được, do đó tỷ lệ tài trợ trở thành nguồn lợi nhuận chính của chiến lược này. Sau đây là những tác động cụ thể của tỷ lệ tài trợ lên các chiến lược:

  1. Giai đoạn thị trường tăng giá (Tỷ lệ tài trợ là dương)

    • Hiện tượng thị trường:Trong thị trường tăng giá, do tâm lý thị trường cao, các nhà đầu tư thường có xu hướng mua vào, dẫn đến tăng vị thế mua vào, qua đó đẩy tỷ lệ tài trợ lên giá trị dương.
    • Logic doanh thu:Trong trường hợp này, người bán khống sẽ được hưởng lợi từ tỷ lệ tài trợ do người mua trả, đây sẽ trở thành nguồn lợi nhuận chính của chiến lược. Vì tỷ lệ tài trợ là dương nên các vị thế bán khống có thể tiếp tục tạo ra lợi nhuận và bằng cách sử dụng tỷ lệ tài trợ thu được, bạn có thể tiếp tục mở các vị thế bán khống và nhận được nhiều lợi ích hơn từ tỷ lệ tài trợ.
    • Tác động cụ thể:Nếu tỷ lệ tài trợ là dương và ổn định, bên bán khống sẽ nhận được tỷ lệ tài trợ đều đặn và sẽ không bị ảnh hưởng quá nhiều bởi biến động giá. Ngay cả khi giá thị trường tăng, những người bán khống vẫn có thể phải chịu khoản lỗ lớn đối với hợp đồng, nhưng nhìn chung, giá trị ròng của các quỹ vẫn tương đối ổn định. Điều này là do nguồn lợi nhuận của chiến lược này chủ yếu phụ thuộc vào việc thu thập tỷ lệ tài trợ hơn là biến động giá. Mặc dù biến động giá có thể ảnh hưởng đến khoản lỗ rõ ràng của hợp đồng, vì những thay đổi về giá trị hợp đồng của vị thế bán khống có thể kiểm soát được, nhưng lợi nhuận chính của quỹ vẫn đến từ việc thu lãi suất tài trợ thường xuyên thay vì biến động giá thị trường. Điều này cho phép chiến lược này bù đắp rủi ro biến động giá ở một mức độ nhất định và duy trì mức tăng giá vốn ổn định.
  2. Giai đoạn thị trường giá xuống (Tỷ lệ tài trợ âm)

    • Hiện tượng thị trường:Trong thị trường giá xuống, giá thị trường giảm nhanh chóng và các vị thế bán khống thường tăng đột biến, khiến tỷ lệ tài trợ trở nên âm, nghĩa là bên bán khống phải trả tiền cho bên mua. Tuy nhiên, do thị trường tiền kỹ thuật số bùng nổ trong những năm gần đây nên giai đoạn thị trường giá xuống tương đối hiếm.
    • Logic doanh thu:Mặc dù tỷ lệ tài trợ là âm và bên bán khống phải trả phí, nhưng đặc điểm phòng ngừa rủi ro của chiến lược này vẫn có hiệu lực vì đơn vị hợp đồng bán khống là cố định và giá trị hợp đồng của vị thế bán khống thay đổi rất ít. Biến động giá mạnh sẽ không dẫn đến tổn thất lớn. Đồng thời, gánh nặng của tỷ lệ tài trợ tương đối có thể kiểm soát được và chiến lược vẫn có thể duy trì ổn định ở một mức độ nhất định.

Thông qua phân tích hai môi trường thị trường này, có thể thấy rằng lợi nhuận và rủi ro của chiến lược bán khống dựa trên tiền tệ chủ yếu bị ảnh hưởng bởi tỷ lệ tài trợ. Khi tỷ lệ tài trợ là dương trong thị trường tăng giá, những người bán khống có thể hưởng lợi từ nó; trong khi ở thị trường giảm giá, mặc dù tỷ lệ tài trợ là âm, chiến lược này vẫn có khả năng bảo toàn giá trị mạnh mẽ vì những thay đổi về giá trị hợp đồng có thể kiểm soát được.

Kiến trúc logic chính sách

Một khuôn khổ chiến lược mạnh mẽ là chìa khóa để thực hiện thành công một chiến lược. Nó cung cấp một khuôn khổ thực hiện rõ ràng để đảm bảo rằng chiến lược có thể hoạt động ổn định trong nhiều điều kiện thị trường khác nhau và xử lý hiệu quả các rủi ro và biến động. Ở đây chúng tôi tham khảo khuôn khổ chiến lược hợp đồng đa tiền tệ dựa trên U của Xiaocao Dashen và thực hiện một số sửa đổi và cải tiến đối với tiêu chuẩn tiền tệ.

'''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. Biến toàn cục và mô tả hàm

Chiến lược này dựa trên các định nghĩa biến đơn giản và triển khai các phép bổ sung vị trí liên tục và giám sát trạng thái thông qua các chức năng mô-đun.

  • SYMBOLS: Giao dịch tiền tệ (như “BTC”).
  • QUOTO:Tiền tệ cơ sở, tiền tệ chuẩn thường là USD.
  • INTERVAL: Khoảng thời gian giữa các chu kỳ chính sách.
  • ICEMONEY: Số tiền đặt hàng ban đầu, dùng cho các đơn hàng giá trị lớn.
  • ROLLINGNUM: Số lượng vị thế được thêm vào sau khi có lợi nhuận.

2. Các mô-đun chức năng cốt lõi

Sau đây là mô tả ngắn gọn về từng mô-đun chức năng:

  1. Hàm khởi tạo (InitInfo)
    Được sử dụng để tải thông tin tiền tệ giao dịch và trạng thái tài khoản ban đầu.

  2. Nhận thông tin chính xác (GetPrecision)
    Nhận kích thước lệnh tối thiểu và giá trị hợp đồng cho mỗi cặp giao dịch thông qua API của sàn giao dịch.

  3. Cập nhậtTicker
    Nhận thông tin thị trường hiện tại thường xuyên, bao gồm giá thầu tốt nhất, giá chào bán tốt nhất và giá mới nhất.

  4. Cập nhật tài khoản và vị trí (UpdateAccount, UpdatePosition)
    Việc đồng bộ hóa số dư tài khoản và thông tin vị thế theo thời gian thực cung cấp cơ sở cho các quyết định giao dịch.

  5. Quản lý giao dịch và lệnh (Order, Trade)
    Chức năng đặt và thực hiện lệnh thống nhất, hỗ trợ lệnh giới hạn và lệnh thị trường.

  6. Giám sát trạng thái (UpdateStatus)
    Theo dõi trạng thái chiến lược, bao gồm lãi lỗ hiện tại và các đơn hàng chưa thực hiện.

3. Logic lệnh chiến lược (MakeOrder)

Cốt lõi của chiến lược làVị trí ban đầu(Vị trí tảng băng trôi) vàVị trí lăn(Được điều khiển bởi tham số vị trí lăn ROLLINGNUM). Sau đây là mô tả chi tiết về logic cụ thể:

  1. Kiểm tra vị trí ban đầu:Xác minh xem số dư tài khoản có lớn hơn số tiền mở ban đầu của tảng băng trôi (ICEMONEY) hay không. Nếu đáp ứng đủ các điều kiện, các vị thế sẽ được mở dần theo từng đợt để giảm tình trạng trượt giá quá mức do mở một vị thế cùng một lúc.
  2. Chiến lược vị trí lăn:Theo lợi nhuận của tài khoản (thu nhập tỷ lệ tài trợ), tăng vị thế một cách hợp lý, tối ưu hóa thu nhập thông qua việc tăng vị thế liên tục, để cải thiện lợi nhuận chung của chiến lược.

Triển khai định lượng chiến lược chênh lệch phí bán khống dựa trên tiền tệ

Theo kết quả kiểm tra ngược chiến lược, chúng ta có thể thấy rằng chiến lược đã đạt được lợi nhuận ổn định trong nhiều chu kỳ thị trường, đặc biệt là trong thị trường tăng giá khi tỷ lệ tài trợ vẫn dương trong một thời gian dài. Do đó, chiến lược này rất phù hợp với việc quản lý quỹ lớn ở một mức độ nào đó. Đặc điểm biến động thấp và lợi nhuận ổn định có thể đáp ứng nhu cầu kép của các quỹ lớn về kiểm soát rủi ro và lợi nhuận ổn định. Đồng thời, chiến lược này áp dụng đòn bẩy 1x, giúp tránh rủi ro thanh lý do đòn bẩy cao gây ra và tăng cường thêm tính bảo mật.

Phân tích ưu nhược điểm của chiến lược

lợi thế

  1. Chiến lược này đơn giản và dễ thực hiện
    Logic rõ ràng và không cần tính toán phức tạp, phù hợp với việc quản lý quỹ lớn của các quỹ đầu cơ hoặc nhà đầu tư cá nhân.

  2. Khả năng chống chịu rủi ro mạnh mẽ
    Đòn bẩy 1x có thể tránh được rủi ro thanh lý và các đặc điểm dựa trên tiền tệ đảm bảo giá trị của đồng đô la Mỹ luôn ổn định, bất kể thị trường có biến động lớn.

  3. Thu nhập ổn định
    Trong thị trường tăng giá, tỷ lệ tài trợ cao hơn và có khả năng mở rộng mạnh mẽ, và các loại tiền tệ thu được có thể được sử dụng cho các khoản đầu tư khác (như đặt cược).

khuyết điểm

  1. Phụ thuộc nhiều vào tiền tệ và điều kiện thị trường
    Đây là một lỗi. Khi tỷ lệ tài trợ của một loại tiền tệ là dương trong một thời gian dài (short trả long), chẳng hạn như hợp đồng BNB, hãy sử dụng DATADATA để chọn hợp đồng dựa trên đồng BNB. Bạn có thể thấy rằng do cài đặt của sàn giao dịch, tỷ lệ tài trợ tích lũy thành giá trị âm. Ngoài ra, khi chu kỳ lớn nằm trong thị trường giá xuống dài hạn (năm 2022) và tỷ lệ tài trợ là âm, lợi nhuận có thể không đủ trang trải chi phí vận hành chiến lược.

  1. Thiếu sự cứng nhắc trong chiến lược
    Chiến lược hiện tại không bao gồm logic điều chỉnh động, chẳng hạn như thiếu các biện pháp ứng phó (như chiến lược dừng lỗ hoặc chốt lời) khi chuyển đổi giữa thị trường tăng giá và giảm giá.

  2. Biên lợi nhuận hạn chế
    Phù hợp với việc tính phí “nằm im”, và không thể nắm bắt được lợi nhuận vượt trội trong những biến động lớn của thị trường. Trong một số trường hợp, tỷ lệ lợi nhuận không tốt bằng quỹ trái phiếu truyền thống.

Kết luận

Chiến lược chênh lệch phí bán khống một lần dựa trên tiền xu tận dụng tối đa các đặc tính đặc biệt của hợp đồng dựa trên tiền xu và cung cấp giải pháp rủi ro thấp để bảo toàn vốn và tăng giá ổn định. Tuy nhiên, trước những giai đoạn khác nhau của thị trường, các chiến lược cần có mức độ linh hoạt nhất định để ứng phó với những biến động về tỷ lệ tài trợ và rủi ro tiềm ẩn. Các hướng tối ưu hóa trong tương lai có thể bao gồm:

  1. Thêm các biện pháp quản lý năng động để chuyển đổi giữa thị trường tăng giá và giảm giá;
  2. Điều chỉnh tốc độ thêm vị thế theo sự thay đổi của tỷ lệ tài trợ.

Nhưng về bản chất, chiến lược này có một sốsự mâu thuẫn. Giả định ban đầu của chiến lược này là thị trường tiền kỹ thuật số sẽ tăng giá dài hạn và việc bán khống hợp đồng dựa trên tiền tệ có thể được sử dụng để duy trì dòng tiền ổn định và thu được lợi ích về tỷ lệ tài trợ. Tuy nhiên, nếu chúng ta cho rằng thị trường đang trong xu hướng tăng giá dài hạn, tại sao không chọn tích trữ tiền điện tử (hlod) và chờ đợi sự tăng giá ổn định của Bitcoin? Tất nhiên, chiến lược này vẫn đáng tin cậy đối với những người theo đuổi lợi nhuận ổn định. Mục tiêu của bài viết này là giới thiệu ý tưởng thiết kế này và cung cấp khuôn khổ chiến lược đầu tư định lượng, trên đó bạn có thể cải thiện và tối ưu hóa nó hơn nữa. Hy vọng rằng chiến lược này có thể trở thành công cụ hiệu quả cho các nhà đầu tư định lượng vào tiền kỹ thuật số.

Tài liệu tham khảo

Cách nhanh chóng xây dựng chiến lược giao dịch đa tiền tệ phổ biến sau khi nâng cấp FMZ

Nhật ký thực hành giao dịch thuật toán (19) - Giải thích chi tiết về chiến lược chênh lệch giá (1): Chênh lệch giá phí bán khống dựa trên tiền tệ

Mẹo hay:Đầu tư có rủi ro, hãy thận trọng khi tham gia thị trường. Các nhà đầu tư được khuyên nên phân bổ vốn hợp lý và kiểm soát chặt chẽ vị thế và đòn bẩy dựa trên sự hiểu biết đầy đủ về logic chiến lược và rủi ro, theo khả năng chịu rủi ro của riêng mình. Nội dung của bài viết này chỉ mang tính chất tham khảo và không phải là lời khuyên đầu tư.