设置动态的spread

  1. 基于波动率的动态spread:根据市场波动率的变化动态调整spread。可以使用统计方法,比如历史波动率、实时波动率等,也可以使用模型,比如GARCH模型等。

  2. 基于订单簿的动态spread:根据当前订单簿的情况动态调整spread。例如,当买入订单数量增加时,可以适当提高卖价的spread,以此来平衡市场需求和供给。

  3. 基于交易量的动态spread:根据当前市场交易量的情况动态调整spread。例如,当市场交易量较低时,可以适当降低spread,以吸引更多的交易。

 

       

import numpy as np
import pandas as pd
import datetime

# 计算历史波动率
def calculate_volatility(data, window=252):
    log_return = np.log(data / data.shift(1))
    vol = log_return.rolling(window=window).std() * np.sqrt(window)
    return vol

# 获取当前市场深度
def get_order_book():
    order_book = pd.DataFrame({
        'bid_price': [10, 9, 8, 7],
        'bid_quantity': [100, 200, 300, 400],
        'ask_price': [11, 12, 13, 14],
        'ask_quantity': [400, 300, 200, 100]
    })
    return order_book

# 根据历史波动率计算spread
def set_dynamic_spread():
    # 获取历史价格数据
    start_date = datetime.datetime(2022, 1, 1)
    end_date = datetime.datetime(2022, 3, 30)
    data = get_price_data('AAPL', start_date, end_date)

    # 计算历史波动率
    volatility = calculate_volatility(data)

    # 根据波动率计算spread
    last_price = data.iloc[-1]
    dynamic_spread = last_price * volatility / 100

    return dynamic_spread

# 根据动态spread下单
def send_order():
    order_book = get_order_book()
    dynamic_spread = set_dynamic_spread()

    # 根据spread计算报价
    bid_price = order_book['bid_price'][0] - dynamic_spread
    ask_price = order_book['ask_price'][0] + dynamic_spread

    # 下单
    sendLongOrder(price=ask_price, quantity=1)
    sendShortOrder(price=bid_price, quantity=1)

 

使用基于波动率动态设置spread:

import random

class OrderBook:
    def __init__(self):
        self.bids = []
        self.asks = []
    
    def add_bid(self, price, quantity):
        self.bids.append((price, quantity))
    
    def add_ask(self, price, quantity):
        self.asks.append((price, quantity))
    
    def remove_bid(self, price, quantity):
        for i in range(len(self.bids)):
            if self.bids[i][0] == price:
                self.bids[i] = (price, self.bids[i][1] - quantity)
                if self.bids[i][1] == 0:
                    del self.bids[i]
                break
    
    def remove_ask(self, price, quantity):
        for i in range(len(self.asks)):
            if self.asks[i][0] == price:
                self.asks[i] = (price, self.asks[i][1] - quantity)
                if self.asks[i][1] == 0:
                    del self.asks[i]
                break
    
    def get_bid_price(self, quantity):
        bid_price = 0
        for bid in self.bids:
            if bid[1] >= quantity:
                bid_price = bid[0]
                break
            quantity -= bid[1]
        return bid_price
    
    def get_ask_price(self, quantity):
        ask_price = 0
        for ask in self.asks:
            if ask[1] >= quantity:
                ask_price = ask[0]
                break
            quantity -= ask[1]
        return ask_price
    
    def get_spread(self, quantity):
        bid_price = self.get_bid_price(quantity)
        ask_price = self.get_ask_price(quantity)
        return ask_price - bid_price


class MarketMaker:
    def __init__(self, symbol, bid_spread, ask_spread):
        self.symbol = symbol
        self.bid_spread = bid_spread
        self.ask_spread = ask_spread
        self.order_book = OrderBook()
    
    def update_order_book(self, bids, asks):
        # Remove old bids and asks
        for bid in bids:
            self.order_book.remove_bid(bid['price'], bid['quantity'])
        for ask in asks:
            self.order_book.remove_ask(ask['price'], ask['quantity'])
        
        # Add new bids and asks
        for bid in bids:
            self.order_book.add_bid(bid['price'], bid['quantity'])
        for ask in asks:
            self.order_book.add_ask(ask['price'], ask['quantity'])
    
    def generate_bid_order(self, quantity):
        bid_price = self.order_book.get_bid_price(quantity)
        if bid_price == 0:
            return None        
        bid_price -= self.bid_spread
        bid_quantity = random.randint(1, 10) * 10
        return {'symbol': self.symbol, 'side': 'buy', 'price': bid_price, 'quantity': bid_quantity}
    
    def generate_ask_order(self, quantity):
        ask_price = self.order_book.get_ask_price(quantity)
        if ask_price == 0:
            return None
        
        ask_price += self.ask_spread
        ask_quantity = random.randint(1, 10) * 10
        return {'symbol': self.symbol, 'side': 'sell', 'price': ask_price, 'quantity': ask_quantity}
    
    def run(self):
        while True:
            # Generate bid and ask orders
            bid_order = self.generate_bid_order(quantity=100)
            ask_order = self.generate_ask_order(quantity=100)
           # Place orders if they exist
           if bid_order:
              print(f"Placing bid order: {bid_order}")
              # Place bid order
              # ...
        
            if ask_order:
               print(f"Placing ask order: {ask_order}")
                # Place ask order
                # ...
        
            # Wait for some time before generating new orders
            time.sleep(1)


     

 基于交易量的spread:

import random

class OrderBook:
    def __init__(self):
        self.bids = []
        self.asks = []
    
    def add_bid(self, price, quantity):
        self.bids.append((price, quantity))
    
    def add_ask(self, price, quantity):
        self.asks.append((price, quantity))
    
    def remove_bid(self, price, quantity):
        for i in range(len(self.bids)):
            if self.bids[i][0] == price:
                self.bids[i] = (price, self.bids[i][1] - quantity)
                if self.bids[i][1] == 0:
                    del self.bids[i]
                break
    
    def remove_ask(self, price, quantity):
        for i in range(len(self.asks)):
            if self.asks[i][0] == price:
                self.asks[i] = (price, self.asks[i][1] - quantity)
                if self.asks[i][1] == 0:
                    del self.asks[i]
                break
    
    def get_bid_price(self, quantity):
        bid_price = 0
        for bid in self.bids:
            if bid[1] >= quantity:
                bid_price = bid[0]
                break
            quantity -= bid[1]
        return bid_price
    
    def get_ask_price(self, quantity):
        ask_price = 0
        for ask in self.asks:
            if ask[1] >= quantity:
                ask_price = ask[0]
                break
            quantity -= ask[1]
        return ask_price
    
    def get_spread(self, quantity):
        bid_price = self.get_bid_price(quantity)
        ask_price = self.get_ask_price(quantity)
        return ask_price - bid_price


class MarketMaker:
    def __init__(self, symbol, min_spread, max_spread):
        self.symbol = symbol
        self.min_spread = min_spread
        self.max_spread = max_spread
        self.order_book = OrderBook()
    
    def update_order_book(self, bids, asks):
        # Remove old bids and asks
        for bid in bids:
            self.order_book.remove_bid(bid['price'], bid['quantity'])
        for ask in asks:
            self.order_book.remove_ask(ask['price'], ask['quantity'])
        
        # Add new bids and asks
        for bid in bids:
            self.order_book.add_bid(bid['price'], bid['quantity'])
        for ask in asks:
            self.order_book.add_ask(ask['price'], ask['quantity'])
    
    def calculate_spread(self, quantity):
        # Calculate current spread
        spread = self.order_book.get_spread(quantity)
        
        # Calculate adjusted spread based on trading volume
        volume = self.get_trading_volume()
        spread_range = self.max_spread - self.min_spread
        adjusted_spread = self.min_spread + (volume / 100) * spread_range
        
        # Return the maximum of the current spread and the adjusted spread
        return max(spread, adjusted_spread)
    
    def generate_bid_order(self, quantity):
        spread = self.calculate_spread(quantity)
        bid_price = self.order_book.get_bid_price(quantity)
        if bid_price == 0:
            return None
        
        bid_price -= spread
        bid_quantity = random.randint(1, 10) * 10
        return {'symbol': self.symbol, 'side': 'buy', 'price': bid_price,
    'quantity': bid_quantity}

def generate_ask_order(self, quantity):
    spread = self.calculate_spread(quantity)
    ask_price = self.order_book.get_ask_price(quantity)
    if ask_price == 0:
        return None
    
    ask_price += spread
    ask_quantity = random.randint(1, 10) * 10
    return {'symbol': self.symbol, 'side': 'sell', 'price': ask_price,
            'quantity': ask_quantity}

def get_trading_volume(self):
    # TODO: Implement trading volume calculation
    return 0

def run(self):
    while True:
        # Generate new orders
        bid_order = self.generate_bid_order(quantity=100)
        ask_order = self.generate_ask_order(quantity=100)
        
        # Place orders if they exist
        if bid_order:
            print(f"Placing bid order: {bid_order}")
            # Place bid order
            # ...
        
        if ask_order:
            print(f"Placing ask order: {ask_order}")
            # Place ask order
            # ...
        
        # Wait for some time before generating new orders
        time.sleep(1)

 

posted on 2023-03-30 16:05  金凯旋  阅读(52)  评论(0编辑  收藏  举报

导航