وسائل لوڈ ہو رہے ہیں... لوڈنگ...

بے ترتیب مارکیٹ جنریٹر پر مبنی حکمت عملی ٹیسٹنگ کے طریقوں کا جائزہ

مصنف:ایجاد کاروں کی مقدار - خواب, تخلیق: 2024-11-29 16:35:44, تازہ کاری: 2024-12-02 09:12:43

[TOC]

img

پیش گوئی

ایجاد کنندہ کے مقداری تجارت کے پلیٹ فارم کا ریٹیسٹنگ سسٹم ایک ایسا ریٹیسٹنگ سسٹم ہے جو مسلسل بار بار اپ گریڈ ہوتا رہتا ہے ، جس میں بنیادی ریٹیسٹنگ کی اصل خصوصیات سے ، آہستہ آہستہ خصوصیات میں اضافہ ہوتا ہے ، کارکردگی کو بہتر بناتا ہے۔ جیسا کہ پلیٹ فارم کی ترقی ریٹیسٹنگ سسٹم کو مستقل طور پر بہتر بناتی ہے۔ آج ہم ریٹیسٹنگ سسٹم پر مبنی ایک موضوع پر تبادلہ خیال کریں گے: "بے ترتیب مارکیٹ پر مبنی اسٹریٹجک ٹیسٹنگ"۔

ضرورت

مقداری تجارت کے شعبے میں ، حکمت عملی کی ترقی اور اصلاح کو حقیقی مارکیٹ کے اعداد و شمار سے الگ نہیں کیا جاسکتا ہے۔ تاہم ، عملی ایپلی کیشنز میں ، مارکیٹ کے پیچیدہ ماحول کی وجہ سے ، تاریخی اعداد و شمار پر انحصار کرنے کے لئے ریورسنگ ناکافی ہوسکتی ہے ، جیسے انتہائی منڈیوں یا خصوصی منظرناموں کی کوریج کی کمی۔ لہذا ، ایک موثر بے ترتیب کرنسی جنریٹر ڈیزائن کرنا مقداری حکمت عملی کے ڈویلپرز کے لئے ایک موثر ٹول بن جاتا ہے۔

جب ہمیں کسی تبادلے ، کسی کرنسی کے بارے میں تاریخی اعداد و شمار کی ضرورت ہوتی ہے تو ، ہم ایف ایم زیڈ پلیٹ فارم کے سرکاری اعداد و شمار کے ذریعہ دوبارہ جانچ پڑتال کرسکتے ہیں۔ بعض اوقات ہم یہ دیکھنا چاہتے ہیں کہ اگر کوئی حکمت عملی مکمل طور پر اجنبی مارکیٹ میں کام کرتی ہے تو ، اس وقت ہم کچھ اعداد و شمار تیار کرسکتے ہیں تاکہ حکمت عملی کی جانچ کی جاسکے۔

اس کا مطلب یہ ہے کہ:

    1. حکمت عملیوں کی بے وقوفی کا جائزہ ایک بے ترتیب مارکیٹ جنریٹر مختلف ممکنہ مارکیٹ کے منظرنامے تخلیق کرسکتا ہے ، بشمول انتہائی اتار چڑھاؤ ، کم اتار چڑھاؤ ، رجحان مارکیٹ اور ہلچل والی مارکیٹ وغیرہ۔ ان تخروپن کے ماحول میں حکمت عملی کی جانچ کرنا اس بات کا اندازہ لگانے میں مدد کرسکتا ہے کہ آیا یہ مختلف مارکیٹ کے حالات میں مستحکم کارکردگی کا مظاہرہ کرتا ہے۔ مثال کے طور پر:

    کیا حکمت عملی رجحانات اور ہلچل کی تبدیلیوں کے مطابق ہے؟ کیا یہ حکمت عملی انتہائی مارکیٹوں میں بڑے نقصانات کا سبب بنے گی؟

    1. حکمت عملی کی ممکنہ کمزوریوں کی نشاندہی کچھ غیر معمولی مارکیٹ کے حالات (جیسے ایک فرض شدہ بلیک سوان واقعہ) کی نقالی کرکے حکمت عملی کی ممکنہ کمزوریوں کا پتہ لگایا جاسکتا ہے اور ان میں بہتری لائی جاسکتی ہے۔ مثال کے طور پر:

    کیا حکمت عملی کسی مارکیٹ کی ساخت پر زیادہ انحصار کرتی ہے؟ کیا پیرامیٹرز کو زیادہ فٹ ہونے کا خطرہ ہے؟

    1. حکمت عملی کے پیرامیٹرز کو بہتر بنائیں بے ترتیب طور پر تیار کردہ اعداد و شمار حکمت عملی کے پیرامیٹرز کو بہتر بنانے کے لئے زیادہ متنوع ٹیسٹنگ ماحول فراہم کرتے ہیں ، جو مکمل طور پر تاریخی اعداد و شمار پر انحصار نہیں کرتے ہیں۔ اس طرح حکمت عملی کے پیرامیٹرز کی ایک وسیع رینج مل سکتی ہے ، اور تاریخی اعداد و شمار میں مخصوص مارکیٹ کے نمونوں تک محدود نہیں ہوتی ہے۔
    1. تاریخی اعداد و شمار کی کمی کچھ مارکیٹوں میں (جیسے ابھرتے ہوئے مارکیٹوں یا چھوٹی کرنسیوں کی تجارت کی مارکیٹوں میں) ، تاریخی اعداد و شمار تمام ممکنہ مارکیٹ کے حالات کو پورا کرنے کے لئے ناکافی ہوسکتے ہیں۔ بے ترتیب مارکیٹ جنریٹر بہت سارے اضافی اعداد و شمار فراہم کرسکتے ہیں جو زیادہ جامع جانچ میں مدد کرسکتے ہیں۔
    1. تیز رفتار تکرار بے ترتیب اعداد و شمار کا استعمال کرتے ہوئے تیز رفتار ٹیسٹنگ کے لئے، حکمت عملی کی ترقی کے لئے رفتار کو تیز کرنے کے لئے، حقیقی وقت مارکیٹ کی مارکیٹ یا وقت کی کھپت کے اعداد و شمار کی صفائی اور صفائی پر انحصار کرنے کی ضرورت نہیں.

لیکن اس کے ساتھ ساتھ ایک عقلی تشخیصی حکمت عملی کی بھی ضرورت ہے ، جو کہ مارکیٹ کے اعداد و شمار کے لئے بے ترتیب طور پر تیار کی گئی ہے:

  • 1، اگرچہ ایک بے ترتیب بازار جنریٹر مفید ہے، لیکن اس کی اہمیت پیدا ہونے والے اعداد و شمار کی کیفیت اور ہدف منظر نامے کے ڈیزائن پر منحصر ہے:
  • 2، پیداوار کی منطق کو حقیقی مارکیٹ کے قریب ہونا چاہئے: اگر کسی بے ترتیب پیدا کردہ مارکیٹ کو حقیقت سے مکمل طور پر دور کیا جاتا ہے تو ، ٹیسٹ کے نتائج میں حوالہ کی قدر کی کمی ہوسکتی ہے۔ مثال کے طور پر ، ایک جنریٹر کو حقیقی مارکیٹ کی شماریاتی خصوصیات (جیسے اتار چڑھاؤ کی تقسیم ، رجحان کی شرح) کے ساتھ مل کر ڈیزائن کیا جاسکتا ہے۔
  • 3 ، حقیقی اعداد و شمار کی جانچ کا مکمل متبادل نہیں ہے: بے ترتیب اعداد و شمار صرف حکمت عملی کی ترقی اور اصلاح کے لئے اضافی ہیں ، اور حتمی حکمت عملی کو ابھی بھی حقیقی مارکیٹ کے اعداد و شمار میں اس کی تاثیر کی تصدیق کرنے کی ضرورت ہے۔

اس کے علاوہ ، ہم کس طرح ڈیٹا کو آسانی سے تشکیل دے سکتے ہیں؟ ہم کس طرح ڈیٹا کو آسانی سے ، جلدی اور آسانی سے تشکیل دے سکتے ہیں تاکہ ریٹیسٹنگ سسٹم استعمال کرسکیں؟

ڈیزائن کے خیالات

اس مضمون کا مقصد یہ ہے کہ ایک سادہ سی بے ترتیب مارکیٹ پیدا کرنے والے حساب کتاب کو پیش کیا جائے۔ حقیقت میں ، بہت ساری مختلف قسم کے تجزیاتی الگورتھم ، ڈیٹا ماڈلنگ اور دیگر تکنیکوں کا استعمال کیا جاسکتا ہے ، کیونکہ اس بحث کی گنجائش محدود ہے ، خاص طور پر پیچیدہ ڈیٹا تجزیہ کے طریقوں کا استعمال نہیں کیا جاسکتا ہے۔

ہم نے اس پروگرام کو پائیٹن زبان میں لکھا ہے، جس میں پلیٹ فارم ریورس سسٹم کی اپنی مرضی کے مطابق ڈیٹا ماخذ کی خصوصیات شامل ہیں۔

  • 1، CSV فائل میں مستقل ریکارڈ لکھنے کے لئے K لائن ڈیٹا کا ایک بے ترتیب مجموعہ تیار کریں تاکہ پیدا کردہ ڈیٹا کو ریکارڈ میں محفوظ کیا جاسکے۔
  • 2، پھر ایک سروس تخلیق کریں جس میں ڈیٹا ماخذ کی حمایت کرنے کے لئے ریورس سسٹم فراہم کی جائے گی۔
  • 3، پیدا کردہ K لائن ڈیٹا کو چارٹ میں دکھایا جائے گا۔

K لائن کے اعداد و شمار ، فائل اسٹوریج وغیرہ کے لئے کچھ جنریشن معیارات کے لئے ، مندرجہ ذیل پیرامیٹر کنٹرول کی وضاحت کی جاسکتی ہے۔

img

  • اعداد و شمار کی بے ترتیب تخلیق کا نمونہ K لائن کے اعداد و شمار کی نقل و حرکت کی قسم کے لئے، صرف ایک سادہ ڈیزائن کا استعمال کرتے ہوئے ایک مثبت منفی امکانات کے لئے ایک مختلف بے ترتیب تعداد ہے، جب پیدا اعداد و شمار کی ایک چھوٹی سی تعداد میں ضروری طرز عمل کی عکاسی نہیں کر سکتے ہیں. اگر ایک بہتر طریقہ ہے، اس کوڈ کے اس حصے کو تبدیل کر سکتے ہیں. اس سادہ ڈیزائن کی بنیاد پر ، کوڈ میں بے ترتیب تعداد کی تخلیق کے دائرے اور کچھ عوامل کو ایڈجسٹ کرنا پیدا کردہ ڈیٹا کے اثرات کو متاثر کرسکتا ہے۔

  • ڈیٹا چیک پیدا کردہ K لائن کے اعداد و شمار کے لئے بھی معقولیت کی جانچ پڑتال کی ضرورت ہے ، چیک کریں کہ آیا اعلی اور کم قیمتوں کا تعین کی تعریف کے خلاف ہے ، چیک کریں کہ K لائن کے اعداد و شمار کی تسلسل وغیرہ۔

ریٹیسٹ سسٹم کے لئے بے ترتیب کرنسی جنریٹر

import _thread
import json
import math
import csv
import random
import os
import datetime as dt
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse

arrTrendType = ["down", "slow_up", "sharp_down", "sharp_up", "narrow_range", "wide_range", "neutral_random"]

def url2Dict(url):
    query = urlparse(url).query  
    params = parse_qs(query)  
    result = {key: params[key][0] for key in params}  
    return result

class Provider(BaseHTTPRequestHandler):
    def do_GET(self):
        global filePathForCSV, pround, vround, ct
        try:
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.end_headers()

            dictParam = url2Dict(self.path)
            Log("自定义数据源服务接收到请求,self.path:", self.path, "query 参数:", dictParam)            
            
            eid = dictParam["eid"]
            symbol = dictParam["symbol"]
            arrCurrency = symbol.split(".")[0].split("_")
            baseCurrency = arrCurrency[0]
            quoteCurrency = arrCurrency[1]
            fromTS = int(dictParam["from"]) * int(1000)
            toTS = int(dictParam["to"]) * int(1000)
            priceRatio = math.pow(10, int(pround))
            amountRatio = math.pow(10, int(vround))

            data = {
                "detail": {
                    "eid": eid,
                    "symbol": symbol,
                    "alias": symbol,
                    "baseCurrency": baseCurrency,
                    "quoteCurrency": quoteCurrency,
                    "marginCurrency": quoteCurrency,
                    "basePrecision": vround,
                    "quotePrecision": pround,
                    "minQty": 0.00001,
                    "maxQty": 9000,
                    "minNotional": 5,
                    "maxNotional": 9000000,
                    "priceTick": 10 ** -pround,
                    "volumeTick": 10 ** -vround,
                    "marginLevel": 10,
                    "contractType": ct
                },
                "schema" : ["time", "open", "high", "low", "close", "vol"],
                "data" : []
            }
            
            listDataSequence = []
            with open(filePathForCSV, "r") as f:
                reader = csv.reader(f)
                header = next(reader)
                headerIsNoneCount = 0
                if len(header) != len(data["schema"]):
                    Log("CSV文件格式有误,列数不同,请检查!", "#FF0000")
                    return 
                for ele in header:
                    for i in range(len(data["schema"])):
                        if data["schema"][i] == ele or ele == "":
                            if ele == "":
                                headerIsNoneCount += 1
                            if headerIsNoneCount > 1:
                                Log("CSV文件格式有误,请检查!", "#FF0000")
                                return 
                            listDataSequence.append(i)
                            break
                
                while True:
                    record = next(reader, -1)
                    if record == -1:
                        break
                    index = 0
                    arr = [0, 0, 0, 0, 0, 0]
                    for ele in record:
                        arr[listDataSequence[index]] = int(ele) if listDataSequence[index] == 0 else (int(float(ele) * amountRatio) if listDataSequence[index] == 5 else int(float(ele) * priceRatio))
                        index += 1
                    data["data"].append(arr)            
            Log("数据data.detail:", data["detail"], "响应回测系统请求。")
            self.wfile.write(json.dumps(data).encode())
        except BaseException as e:
            Log("Provider do_GET error, e:", e)
        return 

def createServer(host):
    try:
        server = HTTPServer(host, Provider)
        Log("Starting server, listen at: %s:%s" % host)
        server.serve_forever()
    except BaseException as e:
        Log("createServer error, e:", e)
        raise Exception("stop")

class KlineGenerator:
    def __init__(self, start_time, end_time, interval):
        self.start_time = dt.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
        self.end_time = dt.datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S")
        self.interval = self._parse_interval(interval)
        self.timestamps = self._generate_time_series()

    def _parse_interval(self, interval):
        unit = interval[-1]
        value = int(interval[:-1])

        if unit == "m":
            return value * 60
        elif unit == "h":
            return value * 3600
        elif unit == "d":
            return value * 86400
        else:
            raise ValueError("不支持的K线周期,请使用 'm', 'h', 或 'd'.")

    def _generate_time_series(self):
        timestamps = []
        current_time = self.start_time
        while current_time <= self.end_time:
            timestamps.append(int(current_time.timestamp() * 1000))
            current_time += dt.timedelta(seconds=self.interval)
        return timestamps

    def generate(self, initPrice, trend_type="neutral", volatility=1):
        data = []
        current_price = initPrice
        angle = 0
        for timestamp in self.timestamps:
            angle_radians = math.radians(angle % 360)
            cos_value = math.cos(angle_radians)

            if trend_type == "down":
                upFactor = random.uniform(0, 0.5)
                change = random.uniform(-0.5, 0.5 * upFactor) * volatility * random.uniform(1, 3)
            elif trend_type == "slow_up":
                downFactor = random.uniform(0, 0.5)
                change = random.uniform(-0.5 * downFactor, 0.5) * volatility * random.uniform(1, 3)
            elif trend_type == "sharp_down":
                upFactor = random.uniform(0, 0.5)
                change = random.uniform(-10, 0.5 * upFactor) * volatility * random.uniform(1, 3)
            elif trend_type == "sharp_up":
                downFactor = random.uniform(0, 0.5)
                change = random.uniform(-0.5 * downFactor, 10) * volatility * random.uniform(1, 3)
            elif trend_type == "narrow_range":
                change = random.uniform(-0.2, 0.2) * volatility * random.uniform(1, 3)
            elif trend_type == "wide_range":
                change = random.uniform(-3, 3) * volatility * random.uniform(1, 3)
            else:
                change = random.uniform(-0.5, 0.5) * volatility * random.uniform(1, 3)

            change = change + cos_value * random.uniform(-0.2, 0.2) * volatility
            open_price = current_price
            high_price = open_price + random.uniform(0, abs(change))
            low_price = max(open_price - random.uniform(0, abs(change)), random.uniform(0, open_price))
            close_price = open_price + change if open_price + change < high_price and open_price + change > low_price else random.uniform(low_price, high_price)

            if (high_price >= open_price and open_price >= close_price and close_price >= low_price) or (high_price >= close_price and close_price >= open_price and open_price >= low_price):
                pass
            else:
                Log("异常数据:", high_price, open_price, low_price, close_price, "#FF0000")

            high_price = max(high_price, open_price, close_price)
            low_price = min(low_price, open_price, close_price)

            base_volume = random.uniform(1000, 5000)
            volume = base_volume * (1 + abs(change) * 0.2)

            kline = {
                "Time": timestamp,
                "Open": round(open_price, 2),
                "High": round(high_price, 2),
                "Low": round(low_price, 2),
                "Close": round(close_price, 2),
                "Volume": round(volume, 2),
            }
            data.append(kline)
            current_price = close_price
            angle += 1
        return data

    def save_to_csv(self, filename, data):
        with open(filename, mode="w", newline="") as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(["", "open", "high", "low", "close", "vol"])
            for idx, kline in enumerate(data):
                writer.writerow(
                    [kline["Time"], kline["Open"], kline["High"], kline["Low"], kline["Close"], kline["Volume"]]
                )
        
        Log("当前路径:", os.getcwd())
        with open("data.csv", "r") as file:
            lines = file.readlines()
            if len(lines) > 1:
                Log("文件写入成功,以下是文件内容的一部分:")
                Log("".join(lines[:5]))
            else:
                Log("文件写入失败,文件为空!")

def main():
    Chart({})
    LogReset(1)
    
    try:
        # _thread.start_new_thread(createServer, (("localhost", 9090), ))
        _thread.start_new_thread(createServer, (("0.0.0.0", 9090), ))
        Log("开启自定义数据源服务线程,数据由CSV文件提供。", ", 地址/端口:0.0.0.0:9090", "#FF0000")
    except BaseException as e:
        Log("启动自定义数据源服务失败!")
        Log("错误信息:", e)
        raise Exception("stop")
    
    while True:
        cmd = GetCommand()
        if cmd:
            if cmd == "createRecords":
                Log("生成器参数:", "起始时间:", startTime, "结束时间:", endTime, "K线周期:", KLinePeriod, "初始价格:", firstPrice, "波动类型:", arrTrendType[trendType], "波动性系数:", ratio)
                generator = KlineGenerator(
                    start_time=startTime,
                    end_time=endTime,
                    interval=KLinePeriod,
                )
                kline_data = generator.generate(firstPrice, trend_type=arrTrendType[trendType], volatility=ratio)
                generator.save_to_csv("data.csv", kline_data)
                ext.PlotRecords(kline_data, "%s_%s" % ("records", KLinePeriod))
        LogStatus(_D())
        Sleep(2000)

ٹیسٹنگ سسٹم میں مشقیں

1، مندرجہ بالا پالیسی مثالیں تخلیق کریں، پیرامیٹرز کو ترتیب دیں، چلائیں۔ 2، اصلی ڈسک (پالیسی مثال) سرور پر تعینات میزبان پر چلانے کی ضرورت ہے، کیونکہ ڈیٹا حاصل کرنے کے لئے عوامی نیٹ ورک آئی پی کی ضرورت ہوتی ہے، جس میں دوبارہ جانچ کے نظام تک رسائی حاصل ہوتی ہے. 3، انٹرایکٹو بٹن پر کلک کریں، حکمت عملی خود بخود بے ترتیب مارکیٹنگ کے اعداد و شمار پیدا کرنے کے لئے شروع ہو جائے گا.

img img

4、生成好的数据会显示在图表上,方便观察,同时数据会记录在本地的data.csv文件

img

5، اس وقت ہم اس بے ترتیب اعداد و شمار کو استعمال کر سکتے ہیں، اور ایک حکمت عملی کا استعمال کرتے ہوئے کسی بھی وقت دوبارہ جانچ پڑتال کر سکتے ہیں

img

/*backtest
start: 2024-10-01 08:00:00
end: 2024-10-31 08:55:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","feeder":"http://xxx.xxx.xxx.xxx:9090"}]
args: [["ContractType","quarter",358374]]
*/

اس کے علاوہ ، یہ بھی کہا جاتا ہے کہ یہ ایک بہت بڑا مسئلہ ہے۔http://xxx.xxx.xxx.xxx:9090یہ سرور کا آئی پی ایڈریس اور بندرگاہ ہے جس میں بے ترتیب طور پر پالیسی تخلیق کی گئی ہے۔ یہ اپنی مرضی کے مطابق اعداد و شمار کا ذریعہ ہے ، جس کے بارے میں آپ پلیٹ فارم API دستاویزات میں اپنی مرضی کے مطابق اعداد و شمار کے ذرائع کے سیکشن سے پوچھ سکتے ہیں۔

6، ریگولیٹری سسٹم کو صحیح ڈیٹا ماخذ کے ساتھ ترتیب دیں تاکہ آپ کو بے ترتیب مارکیٹنگ کے اعداد و شمار کی جانچ پڑتال کر سکیں۔

img

img

اس وقت ریٹرو ٹیسٹنگ سسٹم کا استعمال ہمارے ایپل کی طرف سے تیار کردہ ایپل کے تجزیاتی اعداد و شمار کے ساتھ کیا جاتا ہے۔ ریٹرو ٹیسٹ کے وقت مارکیٹ کے چارٹ میں موجود اعداد و شمار کے مطابق ، اس کا موازنہ ریئل ڈسک میں بے ترتیب مارکیٹ کے ذریعہ تیار کردہ اعداد و شمار سے کیا جاتا ہے ، وقت: 16 اکتوبر ، 2024 کو 17 بجے مکمل ، اعداد و شمار ایک جیسے ہیں۔

7، اوہ ہاں، تقریبا بھول گیا! یہ بے ترتیب عمل جنریٹر کے لئے ایک پائیتھون پروگرام کی وجہ سے ایک حقیقی ڈسک پیدا کرنے کے لئے آسان مظاہرے، آپریشن، پیدا کی K لائن ڈیٹا کو ظاہر کرنے کے لئے ہے.

اسٹریٹجی کا ماخذ:ریٹیسٹ سسٹم کے لئے بے ترتیب کرنسی جنریٹر

آپ کی حمایت اور پڑھنے کا شکریہ۔


مزید