DATADATA গ্রিড কৌশল (II) সমর্থন করে: গ্রিডের সংখ্যা এবং রিটার্নের হারের মধ্যে সম্পর্ক

তৈরি: 2025-02-13 16:22:36, আপডেট করা হয়েছে: 2025-02-17 17:38:52
comments   0
hits   352

পূর্ববর্তী প্রবন্ধে, আমরা প্রশস্ততা এবং উত্থান-পতনের উপর ভিত্তি করে DATADATA প্ল্যাটফর্মে মুদ্রার একটি প্রাথমিক স্ক্রিনিং পরিচালনা করেছি। এরপর, আমরা গ্রিড ট্রেডিংয়ের একটি গুরুত্বপূর্ণ বিষয় অন্বেষণ করব - গ্রিডের সংখ্যা নির্ধারণ করা। গ্রিডের সংখ্যা লেনদেনের ফ্রিকোয়েন্সি এবং প্রতিটি লেনদেনের জন্য তহবিলের পরিমাণ নির্ধারণ করে, যা গ্রিড ট্রেডিংয়ের মোট রিটার্ন এবং ঝুঁকির স্তরকে প্রভাবিত করে। অতএব, সর্বোত্তম ব্যালেন্স পয়েন্ট অর্জনের জন্য গ্রিডের সংখ্যা কীভাবে যুক্তিসঙ্গতভাবে নির্ধারণ করা যায় তা একটি গুরুত্বপূর্ণ বিষয় যা প্রতিটি গ্রিড ব্যবসায়ীর বিবেচনা করা উচিত।

গ্রিডের সংখ্যা নির্ধারণের চ্যালেঞ্জগুলি

  • খুব কম গ্রিড: যদি গ্রিডের সংখ্যা খুব কম সেট করা হয়, তাহলে গ্রিডগুলির মধ্যে ব্যবধান বেশি হবে, যার অর্থ হল পরবর্তী গ্রিডে পৌঁছানোর জন্য দামকে আরও ওঠানামা করতে হবে। যদিও প্রতিটি গ্রিডের লেনদেনের পরিমাণ বেশি এবং বৃহত্তর ওঠানামা মুনাফা অর্জন করতে পারে, কম ট্রেডিং সুযোগের কারণে, ছোট ওঠানামার ফলে আনা কিছু মুনাফা হাতছাড়া হতে পারে। অতএব, সামগ্রিক লাভজনকতা প্রত্যাশার চেয়ে কম হতে পারে।

  • অনেক বেশি গ্রিড: যখন গ্রিডের সংখ্যা খুব বেশি সেট করা হয়, তখন প্রতিটি গ্রিডের মূল্য পরিসীমা কম হয়, ট্রেডিংয়ের সুযোগ বৃদ্ধি পায় এবং ক্রয়-বিক্রয় আরও ঘন ঘন করা যায়। তবে, প্রতিটি লেনদেনে অল্প পরিমাণ মূলধন জড়িত থাকার কারণে, এই ধরনের কৌশলগুলিতে প্রায়শই লাভ করার জন্য উচ্চ-ফ্রিকোয়েন্সি ট্রেডিংয়ের প্রয়োজন হয়। এর ফলে সহজেই লেনদেন ফি বেশি হতে পারে, এবং খুব বেশি ঘন ঘন ট্রেডিং করলে বাজারের ছোট ছোট ওঠানামা লাভের প্রধান উৎস হয়ে উঠতে পারে, যেখানে লাভের সর্বোচ্চ সীমা সীমিত থাকে।

  • যুক্তিসঙ্গত সংখ্যক গ্রিড: বাজারের অস্থিরতা, অ্যাকাউন্টের আকার এবং প্রত্যাশিত ট্রেডিং ফ্রিকোয়েন্সি বিবেচনা করে উপযুক্ত সংখ্যক গ্রিড নির্ধারণ করতে হবে। যখন বাজারের অস্থিরতা বেশি থাকে, তখন যথাযথভাবে গ্রিডের সংখ্যা বৃদ্ধি করলে ওঠানামা আরও ভালোভাবে ধরা যায়, অন্যদিকে যখন তহবিল বড় হয়, তখন কম সংখ্যক গ্রিড স্থাপন করলে একক লেনদেনের পরিমাণ বেশি হতে পারে এবং লেনদেন ফি চাপ কমতে পারে। গ্রিড স্পেসিং এবং ঘন ঘন ট্রেডিংয়ের খরচের ভারসাম্য বজায় রেখে, কৌশলটির রিটার্ন এবং ঝুঁকি নিয়ন্ত্রণ সর্বাধিক করা যেতে পারে।

গ্রিডের সংখ্যা নির্ধারণ করা হয় এর উপর ভিত্তি করে

1. গ্রিড ব্যবধান এবং তহবিল বরাদ্দ

গ্রিড ট্রেডিংয়ের একটি মূল বৈশিষ্ট্য হল একাধিক গ্রিড ব্যবধান সেট করে প্রতিটি ব্যবধানে তহবিল বরাদ্দ করা। গ্রিডের সংখ্যা নির্ধারণ করার সময়, আপনাকে প্রথমে প্রতিটি গ্রিডের মধ্যে ব্যবধান এবং প্রতিটি গ্রিডে তহবিলের পরিমাণ গণনা করতে হবে। গ্রিডের সংখ্যা নির্ধারণ কেবল প্রতিটি গ্রিডে তহবিলের পরিমাণকেই প্রভাবিত করে না, বরং প্রতিটি গ্রিডের ক্রয়-বিক্রয় মূল্যের পরিসরও নির্ধারণ করে।

  • গ্রিড ব্যবধান: যখন গ্রিড খুব ঘন থাকে, যদিও ট্রেডিংয়ের সুযোগ বেশি থাকে, প্রতিটি লেনদেনের জন্য তহবিলের পরিমাণ কম থাকে, যার ফলে মোট রিটার্নের উপরের সীমা কম হতে পারে; বিপরীতে, যখন গ্রিড খুব কম থাকে, যদিও প্রতিটি লেনদেনের জন্য তহবিলের পরিমাণ বেশি হয়, কম লেনদেনের ফ্রিকোয়েন্সির কারণে, লাভের সুযোগ হাতছাড়া হতে পারে।
  • তহবিল বরাদ্দ: গ্রিডের সংখ্যা নির্ধারণ করার সময়, আমাদের তহবিল বরাদ্দের ভারসাম্য বজায় রাখতে হবে যাতে প্রতিটি গ্রিডে অত্যধিক তহবিল ছড়িয়ে না পড়ে এবং কার্যকরভাবে মুনাফা অর্জনে ব্যর্থ না হয়।

2. অ্যাকাউন্ট তহবিল এবং ঝুঁকি ব্যবস্থাপনা

গ্রিডের সংখ্যা নির্ধারণে অ্যাকাউন্ট তহবিল একটি গুরুত্বপূর্ণ বিষয়। বৃহত্তর অ্যাকাউন্ট তহবিল আরও গ্রিড স্থাপনের সুযোগ করে দেয়, অন্যদিকে ছোট অ্যাকাউন্ট তহবিলের জন্য গ্রিডের সংখ্যার একটি সীমা প্রয়োজন যাতে তহবিলের অত্যধিক বিচ্ছুরিত বরাদ্দ এড়ানো যায়, যার ফলে প্রতিটি গ্রিডে খুব কম পরিমাণে তহবিল জমা হয় এবং কার্যকর মুনাফা অর্জনে অক্ষমতা দেখা দেয়।

এছাড়াও, গ্রিড ট্রেডিংয়ের ঝুঁকি ব্যবস্থাপনা কৌশলে গ্রিডের সংখ্যা নির্ধারণের বিষয়টিও বিবেচনায় নেওয়া প্রয়োজন। বিশেষ করে যখন বাজার তীব্রভাবে ওঠানামা করে, তখন অনেক বেশি গ্রিডের কারণে আরও বেশি ক্ষতি হতে পারে, তাই অতিরিক্ত লেনদেন এড়াতে গ্রিডের সংখ্যা যুক্তিসঙ্গতভাবে নিয়ন্ত্রণ করা উচিত।

গ্রিড ট্রেডিং কৌশল বাস্তবায়ন

গ্রিড ট্রেডিং কৌশলগুলির প্রকৃত প্রয়োগে, বিশেষ করে যখন গ্রিডের সংখ্যা এবং রিটার্নের হারের মধ্যে ভারসাম্য অপ্টিমাইজ করা হয়, তখন ডেটাডেটা প্ল্যাটফর্মের DQL (ডেটাডেটা কোয়েরি ল্যাঙ্গুয়েজ) দুর্দান্ত নমনীয়তা প্রদান করে। DQL কেবল দক্ষ ডেটা কোয়েরি, প্রক্রিয়াকরণ এবং বিশ্লেষণ সমর্থন করে না, বরং সবচেয়ে উপযুক্ত গ্রিড নম্বর এবং অন্যান্য প্যারামিটার কনফিগারেশন খুঁজে পেতে ব্যবসায়ীদের গ্রিড ট্রেডিং কৌশলগুলির কর্মক্ষমতা অনুকরণ এবং ব্যাকটেস্ট করতেও সহায়তা করে।

DQL এর মাধ্যমে, আমরা সহজেই একাধিক এক্সচেঞ্জ (যেমন Binance) থেকে ঐতিহাসিক K-লাইন ডেটা পেতে পারি এবং এই ডেটার উপর ভিত্তি করে গ্রিড ট্রেডিং কৌশলগুলি সামঞ্জস্য করতে পারি। এইভাবে, বিভিন্ন বাজার পরিবেশ এবং নির্দিষ্ট মুদ্রার অস্থিরতা অনুসারে সর্বোত্তম গ্রিড ট্রেডিং কৌশলটি সঠিকভাবে পরীক্ষা করা যেতে পারে।

১. তথ্য সংগ্রহ করুন

আমাদের গ্রিড ট্রেডিং কৌশলের ব্যাকটেস্টিং শুরু করার আগে, আমাদের প্রথমে লক্ষ্য মুদ্রার জন্য বাজারের তথ্য সংগ্রহ করতে হবে। ডাটাবেস থেকে নির্দিষ্ট মুদ্রার K-লাইন ডেটা অনুসন্ধানের জন্য কোডটি নিম্নরূপ:

# 获取目标币种的K线数据
data = query("select * from klines.spot_1d where Exchange = 'Binance' and Symbol = '???_usdt' order by Time")

ব্যাখ্যাঃ

  • ডাটাবেস অনুসন্ধান করে, আমরা একটি নির্দিষ্ট মুদ্রার মান পেতে পারি (যেমন।???_usdt) Binance ট্রেডিং প্ল্যাটফর্মে (সময়, খোলার মূল্য, সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য এবং সমাপনী মূল্য ইত্যাদি সহ)। এটি কৌশল বাস্তবায়নের জন্য মৌলিক তথ্য সরবরাহ করে।

2. গ্রিড কৌশল ফাংশন

গ্রিড ট্রেডিং কৌশলের মূল বিষয় হল একটি পূর্বনির্ধারিত গ্রিড পরিমাণ এবং মূল্য পরিসর ব্যবহার করে ট্রেড করা। নির্দিষ্ট পদক্ষেপগুলি নিম্নরূপ:

  1. গ্রিড ব্যবধান (ব্যবধান) এবং প্রতি গ্রিডে লেনদেনের পরিমাণ গণনা করুন (কল্পিত)

    • গ্রিড ব্যবধান (ব্যবধান): বাজারে সর্বোচ্চ এবং সর্বনিম্ন দামের অনুপাতের ভিত্তিতে গণনা করা হয়। সূত্রটি নিম্নরূপ: [ \text{gap} = \frac{\log(\text{max_p} / \text{min_p})}{\text{grid_num}} ] মধ্যেmax_pসর্বোচ্চ মূল্যে,min_pসর্বনিম্ন মূল্যে,grid_numহল গ্রিডের সংখ্যা।

    • প্রতি গ্রিডে লেনদেনের পরিমাণ (কল্পিত):প্রতিটি গ্রিডের লেনদেনের পরিমাণ মোট তহবিল এবং গ্রিডের সংখ্যা দ্বারা গণনা করা হয়। সূত্রটি হল: [ \text{notional} = \frac{\text{balance}}{\text{grid_num}} ]

  2. গ্রিডের শুরু এবং শেষের দাম

    • প্রতিটি গ্রিডের শুরু এবং শেষের দাম গ্রিড ব্যবধানের উপর ভিত্তি করে গতিশীলভাবে গণনা করা হয়। উদাহরণস্বরূপ, প্রথম গ্রিডের প্রারম্ভিক মূল্য হল সর্বনিম্ন মূল্য, এবং দ্বিতীয় গ্রিডের প্রারম্ভিক মূল্য হল সর্বনিম্ন মূল্যকে গুণ করলেexp(gap), ইত্যাদি।
  3. ট্রেডিং অপারেশনস

    • খোলার শর্তাবলী: যখন দাম একটি নির্দিষ্ট গ্রিডের প্রারম্ভিক মূল্যে নেমে আসে, তখন একটি ক্রয় কার্যক্রম কার্যকর করা হয়।
    • সমান্তরাল শর্ত: যখন দাম একটি নির্দিষ্ট গ্রিডের শেষ মূল্যে বৃদ্ধি পায়, তখন একটি বিক্রয় কার্যক্রম কার্যকর করা হয়।
  4. লেনদেন ফি: প্রতিটি লেনদেনের জন্য হ্যান্ডলিং ফি 0.0001 ধরে নিলে, আমাদের প্রতিটি লেনদেনের জন্য হ্যান্ডলিং ফি গণনা করতে হবে এবং জমা করতে হবে।

def grid_trading_strategy(
    raw,
    grid_num,              # 网格数量
    min_p,                # 最低价格
    max_p,                # 最高价格
):
    """
    执行网格交易策略的函数
    """
    # 初始化变量
    balance = 1000                # 初始资金
    raw = raw[['Time', 'Open', 'High', 'Low', 'Close']]  # 只选择相关列

    # 网格交易策略的设置
    gap = math.log(max_p / min_p) / grid_num   # 计算网格间隔
    notional = balance / grid_num            # 每个网格的交易额

    # 初始化网格
    net = []
    for i in range(grid_num):
        net.append({
            'start_p': min_p * math.exp(i * gap),   # 每个网格的起始价格
            'end_p': min_p * math.exp((i + 1) * gap),  # 每个网格的结束价格
            'amt': notional / (min_p * math.exp(i * gap)),  # 每个网格的购买量
            'status': 'idle'                     # 初始状态为闲置
        })

    # 记录状态
    state = {
        'stock': 0,           # 当前持仓
        'fee': 0,             # 交易费用
        'longTradeVol': 0,    # 长期交易量
        'shortTradeVol': 0,   # 短期交易量
        'profitTbl': [],      # 存储每个时刻的利润
        'feeTbl': [],         # 存储每个时刻的费用
        'netCnt': 0,          # 记录净交易次数
        'idx': 0              # 当前数据的索引
    }

    # 检查开盘交易
    def check_open_orders(state, net):
        for i in range(len(net)):
            if net[i]['status'] == 'idle' and raw['Low'][state['idx']] <= net[i]['start_p'] and raw['Open'][state['idx']] > net[i]['start_p']:
                net[i]['status'] = 'taken'  # 网格被占用
                tradeVol = net[i]['amt'] * net[i]['start_p']
                state['stock'] += net[i]['amt']
                state['longTradeVol'] += tradeVol
                state['fee'] += tradeVol * 0.0001  # 假设手续费为0.0001

    # 检查平仓交易
    def check_close_orders(state, net):
        for i in range(len(net)):
            if net[i]['status'] == 'taken' and raw['High'][state['idx']] >= net[i]['end_p'] and raw['Open'][state['idx']] < net[i]['end_p']:
                net[i]['status'] = 'idle'  # 网格状态恢复为空闲
                tradeVol = net[i]['amt'] * net[i]['end_p']
                state['stock'] -= net[i]['amt']
                state['shortTradeVol'] += tradeVol
                state['fee'] += tradeVol * 0.0001  # 假设手续费为0.0001
                state['netCnt'] += 1

    # 日志记录利润和费用
    def log(state):
        addVol = state['stock'] * raw['Close'][state['idx']]  # 当前仓位的总价值
        pl = state['shortTradeVol'] - state['longTradeVol'] + addVol  # 计算利润
        state['profitTbl'].append(pl)
        state['feeTbl'].append(state['fee'])

    # 主交易循环
    for i in range(len(raw)):
        state['idx'] = i
        if raw['Close'][state['idx']] >= raw['Open'][state['idx']]:
            check_open_orders(state, net)
            check_close_orders(state, net)
        else:
            check_close_orders(state, net)
            check_open_orders(state, net)
        log(state)

    # 将利润和费用数据整理为DataFrame
    pl = DataFrame({'pl' : state['profitTbl'],  'fee' : state['feeTbl']})
    pl['time'] = raw['Time']
    pl['pl-net'] = pl['pl'] - pl['fee']
    
    return pl

৩. ব্যাকটেস্ট চালান

লক্ষ্য মুদ্রার জন্য, আমরা ‘oax_usdt’ মুদ্রাটি বেছে নিই। পূর্ববর্তী নিবন্ধে কোডটি পরীক্ষা করার পর, এই মুদ্রাটি দীর্ঘ সময়ের জন্য একটি উচ্চ প্রশস্ততা বজায় রাখে, কোনও উল্লেখযোগ্য একতরফা প্রবণতা না দেখিয়ে। আমরা বিভিন্ন গ্রিড সংখ্যার প্রভাব দেখতে এবং তারপর একটি উপযুক্ত গ্রিড নম্বর খুঁজে পেতে সিমুলেটেড ব্যাকটেস্টিংয়ের জন্য বিভিন্ন গ্রিড সংখ্যা (উদাহরণস্বরূপ: 5, 10, 15, ইত্যাদি) ব্যবহার করার চেষ্টা করতে পারি। উদাহরণস্বরূপ, প্রতিটি গ্রিড নম্বরের জন্য নিট মুনাফা (pl-net) গণনা করে, আমরা মূল্যায়ন করতে পারি যে বর্তমান বাজার পরিবেশে কোন গ্রিড নম্বরগুলি সেরা রিটার্ন আনতে পারে। ব্যাকটেস্ট চালানোর কোডটি এখানে:

grid_nums = [5*i+5 for i in range(5)]
out = []
for g in grid_nums:
    pl = grid_trading_strategy(
        data,
        grid_num=g,
        min_p=min(data['Close']),
        max_p=max(data['Close'])
    )
    out.append({
        'num': g,
        'pl-net': pl['pl-net'][-1],
        'min_pl': min(pl['pl-net']),
        'max_pl': max(pl['pl-net'])
    })

return out

৪. পরীক্ষামূলক ফলাফল বিশ্লেষণ

বিভিন্ন গ্রিড নম্বর কনফিগারেশনের সাথে ব্যাকটেস্ট করার পর, আমরা নিম্নলিখিত ফলাফল পেয়েছি:

বিশ্লেষণঃ

  • গ্রিডের সংখ্যা বাড়ার সাথে সাথে, নিট সুবিধা প্রথমে বৃদ্ধি এবং পরে হ্রাসের প্রবণতা দেখায়। যখন গ্রিডের সংখ্যা ১৫টি হয়, তখন নিট মুনাফা সর্বোচ্চ মান পর্যন্ত পৌঁছায়। গ্রিডের সংখ্যা বৃদ্ধি পেতে থাকলে, নিট মুনাফা হ্রাস পায়।
  • সর্বনিম্ন এবং সর্বোচ্চ রিটার্নের ওঠানামা নেট রিটার্নের প্রবণতার অনুরূপ, যা ইঙ্গিত করে যে গ্রিড নম্বরের পছন্দ রিটার্নের উপর একটি গুরুত্বপূর্ণ প্রভাব ফেলে।

সারসংক্ষেপ

গ্রিড ট্রেডিং কৌশলে গ্রিডের সংখ্যা সঠিকভাবে নির্ধারণ করা একটি গুরুত্বপূর্ণ কাজ। গ্রিডের সংখ্যা অপ্টিমাইজ করার মাধ্যমে, গ্রিড ট্রেডিং কৌশলগুলির লাভের কার্যকারিতা কার্যকরভাবে উন্নত করা যেতে পারে এবং ঝুঁকিগুলি আরও ভালভাবে নিয়ন্ত্রণ করা যেতে পারে। এই নিবন্ধটি গ্রিড নম্বর সেটিংস বিশ্লেষণ করে এবং নির্দিষ্ট গণনা পদ্ধতি এবং নমুনা কোড প্রদান করে, আশা করি সকলকে গ্রিড ট্রেডিং কৌশলগুলি অপ্টিমাইজ করতে এবং কৌশলগুলির স্থিতিশীলতা এবং লাভজনকতা উন্নত করতে সহায়তা করবে।

নোটঃ এই প্রবন্ধের গ্রিড ব্যাকটেস্টিং কোডটি ঝিহু দা শেন থেকে গৃহীত। হ্যালসিয়ন, সোর্স কোড ব্যাখ্যার জন্য অনুগ্রহ করে নিবন্ধটি পড়ুন।অ্যালগরিদমিক ট্রেডিং প্র্যাকটিস ডায়েরি (XVIII) - গ্রিড ট্রেডিং-এর বিশদ বিবরণ: গ্রিড নম্বর এবং দীর্ঘমেয়াদী রিটার্নের মধ্যে সম্পর্ক