توجه: این مقاله فقط برای اهداف سرگرمی و آموزشی ارائه شده است و به عنوان مشاوره مالی در نظر گرفته نشده است.
من به عنوان سابق CTO از مبادله رمزنگاری ، من سهم عادلانه ای از آشفتگی خود را با چندین API های مبادله اصلی داشتم. در این مقاله ، من شما را از طریق فرآیند ایجاد یک اسکریپت پایتون قابل اعتماد برای استخراج داده های تجارت تاریخی از Binance راهنمایی می کنم.
هنگام پشت سر گذاشتن یک استراتژی معاملاتی ، یعنی برای اجرای استراتژی ما با داده های گذشته و تجزیه و تحلیل بازده و سایر عوامل مهم ، باید اطمینان حاصل کنیم که ما نوع مناسبی از داده ها را برای کار با آن داریم. این روند همیشه خیلی ساده نیست ، با توجه به اینکه برخی از استراتژی ها به داده های سطح کتاب نیاز دارند ، برخی دیگر ممکن است با شمع های یک ساعته خوب عمل کنند و عناصری مانند زیرساخت ها ، در دسترس بودن و اتصال بسته به نوع داده هایی که می توانند بسیار متفاوت باشندتو نیاز داری.
دیگر نیازی به نگرانی نیست اگر کوچکترین سرنخ در مورد این که این شمع های یک ساعته به معنی این داده ها به معنی است ، نداشته باشید ، زیرا ما در این مقاله به مواردی نخواهیم رسید.
داده های مورد نیاز عمدتا با فرکانس استراتژی تجارت تعریف می شود. دسته بندی استراتژی های تجارت موضوعی برای یک موضوع دیگر است که من در سری Algotrading خود می نویسم ، اما می توانید اطلاعات قابل اعتماد را در Investopedia پیدا کنید.
خوب ، اما چرا این مقاله فقط در مورد واکشی داده های "تجارت" است و چرا ما از API Binance استفاده می کنیم؟شما ، خواننده ، باید کمی در مورد محتوای مقاله من گیج شوید.
به گفته من ، نقاط پایانی داده های تجاری عمدتاً در دسترس است ، 99. 99 ٪ از صرافی ها. این ماده بسیار دانه ای است ، و جزئیات کافی (در برخی موارد خاص) را برای تست پشت زمینه های تجارت با فرکانس بالا (HFT) ارائه می دهد ، و همچنین به عنوان بلوک های ساختمانی شمع های OHLC (1 تا 24 ساعت یا بیشتر ، در صورتی که این چیزی است که می خواهید) ارائه می دهد.
داده های تجارت همه کاره است و امکان آزمایش زیادی در مورد استراتژی های فرکانس های مختلف را فراهم می کند.
چرا BINANCE؟این فقط به این دلیل است که به دلیل حجم آن ، یکی از مبادله هایی است که من تمایل به پشتی دارم. به هیچ وجه من به Binance وابسته نیستم. ما در سری Algotrading من مبادلات دیگر را بررسی خواهیم کرد.
"صحبت ارزان است. کد را به من نشان دهید. "- لینوس توروالدز
ما قصد داریم یک اسکریپت پایتون ایجاد کنیم که به عنوان آرگومان خط فرمان ، نماد جفت ، تاریخ شروع و تاریخ پایان دریافت می کند. این پرونده به یک فایل CSV که حاوی تمام معاملات است ، خروجی می کند. این مراحل را می توان با مراحل زیر شرح داد:
ما از کتابخانه های پاندا ، درخواست ها ، زمان ، سیستم و DateTime استفاده خواهیم کرد. در قطعه های کد ، هیچ گونه تأیید خطایی نشان داده نمی شود زیرا هیچ مقداری به توضیحات اضافه نمی کند. البته می توانید کد کامل را در GitHub بررسی کنید.
اسکریپت از آرگومان های زیر استفاده می کند:
برای به دست آوردن استدلال ها ، ما از سیستم های داخلی استفاده خواهیم کرد (هیچ چیز خیلی فانتزی در اینجا) و برای تجزیه تاریخ ، از کتابخانه DateTime استفاده خواهیم کرد.
نماد = sys. argv [1]start_date = dateTime. strptime (sys. argv [2] ، '٪ m/٪ d/٪ y')ending_date = dateTime. strptime (sys. argv [3] ، '٪ m/٪ d/٪ y') + timedelta (روز = 1) - timedelta (میکرو ثانیه = 1)ما یک روز اضافه می کنیم و یک میکرو ثانیه را کم می کنیم تا بخش زمان پایان ending_date همیشه در 23: 59: 59. 999 باشد ، و این باعث می شود که فواصل یک روزه عملی شود.
با استفاده از API Binance و استفاده از نقطه پایانی Agtrades ، می توانیم حداکثر 1000 معاملات را در یک درخواست انجام دهیم و اگر از پارامترهای شروع و پایان استفاده کنیم ، آنها حداکثر یک ساعت از هم فاصله دارند. پس از برخی از شکست ها ، با واکشی با استفاده از فواصل زمانی (در مقطعی یا نقطه دیگر ، نقدینگی دیوانه می شود و من برخی از معاملات گرانبها را از دست می دهم) ، تصمیم گرفتم استراتژی FRO_ID را امتحان کنم.
نقطه پایانی Agtrades به دلیل بازگرداندن معاملات فشرده شده انتخاب می شود. به این ترتیب ، ما هیچ اطلاعات گرانبهایی را از دست نخواهیم داد.
معاملات فشرده شده و کل را دریافت کنید. معاملات که در همان زمان پر می شوند ، از همان ترتیب ، با همان قیمت ، مقدار جمع می شوند.
استراتژی FROM_ID به این صورت پیش می رود: ما می خواهیم با ارسال فواصل تاریخ به نقطه پایانی ، اولین تجارت Start_Date را بدست آوریم. پس از آن ، ما با شروع اولین شناسه تجارت ، 1000 معاملات را بدست می آوریم. سپس ، ما بررسی خواهیم کرد که آیا آخرین تجارت پس از پایان دادن به ما اتفاق افتاده است یا خیر. اگر چنین است ، ما تمام دوره های زمانی را پشت سر گذاشته ایم و می توانیم نتایج را در پرونده ذخیره کنیم. در غیر این صورت ، متغیر FROM_ID خود را به روز می کنیم تا آخرین شناسه تجارت را بدست آوریم و دوباره حلقه را شروع کنیم.
اوه ، صحبت کردن به اندازه کافی ، بگذارید کد کنیم.
ابتدا ، ما یک new_end_date ایجاد می کنیم. به این دلیل است که ما با عبور از یک شروع کار و یک پارامتر EndTime از Agtrades استفاده می کنیم. در حال حاضر ، ما فقط باید شناسه تجارت اول دوره را بدانیم ، بنابراین 60 ثانیه به دوره اضافه می کنیم. در جفت نقدینگی کم ، این پارامتر قابل تغییر است زیرا هیچ تضمینی وجود ندارد که تجارت در دقیقه اول روز درخواست شده رخ دهد.
سپس تاریخ را با استفاده از تابع یاور ما تجزیه کنید تا با استفاده از عملکرد Calendar. TimeGM ، آن را به یک نمایندگی unix millisecond تبدیل کنید. عملکرد TimeGM ترجیح داده می شود زیرا تاریخ را در UTC نگه می دارد.
def get_unix_ms_from_date (تاریخ):بازگشت int (calendar. timegm (date. timetuple ()) * 1000 + date. microsecond/1000)پاسخ درخواست لیستی از اشیاء تجاری است که براساس تاریخ مرتب شده اند ، با فرمت زیر:
بنابراین ، همانطور که به اولین شناسه تجارت نیاز داریم ، ارزش پاسخ [0] ["A"] را برمی گردانیم.
اکنون که اولین شناسه تجارت را داریم ، می توانیم به طور همزمان 1000 معاملات را بدست آوریم ، تا اینکه به پایان خود برسیم. کد زیر در داخل حلقه اصلی ما خوانده می شود. این درخواست ما را با استفاده از پارامتر FROM_ID انجام می دهد و پارامترهای StartDate و Enddate را خراب می کند.
و اکنون ، این حلقه اصلی ما است که درخواست ها را انجام می دهد و DataFrame ما را ایجاد می کند.
ما بررسی می کنیم که آیا زمان فعلی که حاوی تاریخ آخرین تجارت است ، بیشتر از to_date ما است ، و اگر چنین است ، ما:
پس از مونتاژ DataFrame ، ما باید یک تمیز کردن داده ساده را انجام دهیم. ما کپی ها را حذف خواهیم کرد و معاملات خود را که بعد از to_date ما اتفاق افتاده است ، برطرف خواهیم کرد (ما این مشکل را داریم زیرا ما در تکه های 1000 معاملات در حال واگذاری هستیم ، بنابراین انتظار می رود که ما پس از تاریخ پایان هدف خود برخی از معاملات را اجرا کنیم).
ما می توانیم عملکرد تر و تمیز خود را محاصره کنیم:
def trim (df ، to_date):بازگشت df [df ['t']و تمیز کردن داده های ما را انجام دهید:
df. drop_duplicates (زیر مجموعه = 'a' ، inplace = true)df = تریم (df ، to_date)اکنون می توانیم با استفاده از روش to_csv ، آن را برای پرونده ذخیره کنیم:
نام پرونده = f'binance ____ trades__ از __ما همچنین می توانیم از مکانیسم های ذخیره داده های دیگر مانند قطب شمال استفاده کنیم.
مهم است که بتوانیم هنگام کار با استراتژی های معاملاتی به داده های خود اعتماد کنیم. ما به راحتی می توانیم با استفاده از موارد زیر برای تأیید ، این کار را با داده های تجاری واکشی انجام دهیم:
در قطعه قطعه ، ما DataFrame خود را به یک آرایه Numpy تبدیل می کنیم و ردیف را به صورت ردیف تکرار می کنیم و بررسی می کنیم که آیا شناسه تجارت توسط 1 هر سطر افزایش یافته است یا خیر.
شناسه های تجاری Binance به صورت تدریجی شماره گذاری می شوند و برای هر نماد ایجاد می شوند ، بنابراین تأیید صحت داده های شما بسیار آسان است.
اولین قدم برای ایجاد یک استراتژی تجاری موفق ، داشتن داده های مناسب است.
سری Algotrading من یک کار در حال انجام است ، بنابراین من از هرگونه بازخورد یا پیشنهادی که شما را در بخش نظرات ترک می کنید استقبال می کنم. می توانید کد کامل این آموزش کوچک را در مخزن GitHub من بررسی کنید.
امیدوارم از خواندن این پست لذت برده باشید.
ممنون بخاطر وقتی که گذاشتید. مراقب باشید و کدگذاری را ادامه دهید!
پلتفرم های تجاری...
برچسب :
نویسنده : مریم کاویانی
بازدید : <-PostHit->