اگر می خواهید با استفاده از پایتون یک استراتژی معاملاتی را پشت سر بگذارید ، می توانید 1) Backtests خود را با کتابخانه های از قبل موجود اجرا کنید ، 2) Backtest خود را بسازید ، یا 3) از یک بستر معاملاتی ابری استفاده کنید.
گزینه 1 انتخاب ما است. این کار سریع انجام می شود و همه چیز با خیال راحت در رایانه محلی شما ذخیره می شود.
(پس از تبدیل شدن به یک متخصص تجارت الگوریتمی ، می توانید گزینه 2 را در نظر بگیرید اگر راه حل های موجود در دسترس نیازهای شما را برآورده نمی کند.)
2 کتابخانه محبوب برای بازگشت به پشت وجود دارد. Backtrader یکی از آنهاست. دیگری Zipline است.
در این مقاله ، ما روی Backtrader تمرکز خواهیم کرد.
فهرست مطالب
Backtrader چیست؟
Backtrader یک کتابخانه پایتون است که به توسعه استراتژی و آزمایش برای معامله گران بازارهای مالی کمک می کند.
این یک چارچوب منبع باز است که امکان آزمایش استراتژی را بر روی داده های تاریخی فراهم می کند. علاوه بر این ، می توان از آن برای بهینه سازی استراتژی ها ، ایجاد توطئه های بصری استفاده کرد و حتی می تواند برای تجارت زنده نیز استفاده شود.
چرا باید Backtrader را یاد بگیرم؟
استفاده از Backtrader می تواند برای آزمایش استراتژی های بازار ، ساعتهای بی شماری از کد نوشتن را صرفه جویی کند.
با داشتن یک جامعه بزرگ و یک انجمن فعال ، می توانید به راحتی با هرگونه مسائلی که توسعه خود را مطرح می کند ، کمک کنید. علاوه بر این ، مستندات گسترده در وب سایت Backtrader حتی ممکن است منجر به کشف یک مؤلفه مهم برای استراتژی شما شود.
در اینجا برخی از مواردی که Backtrader در آن عالی است:
Backtesting - این ممکن است به نظر برسد که یک روش آشکار است اما Backtrader روند خسته کننده تمیز کردن داده های شما و تکرار از طریق آن را برای آزمایش استراتژی ها حذف می کند. این برنامه دارای الگوهای داخلی برای استفاده از منابع مختلف داده برای آسانتر کردن داده ها است.
بهینه سازی - تنظیم چند پارامتر گاهی اوقات می تواند تفاوت بین یک استراتژی سودآور و یک روش غیر سودآور باشد. پس از اجرای پشتی ، بهینه سازی با تغییر چند خط کد به راحتی انجام می شود.
ترسیم - اگر با چند کتابخانه نقشه برداری پایتون کار کرده اید ، می دانید که این موارد همیشه پیکربندی آسان نیست ، به خصوص اولین بار در اطراف. یک نمودار پیچیده را می توان با یک خط کد واحد ایجاد کرد.
شاخص ها - بیشتر شاخص های محبوب در حال حاضر در سکوی Backtrader برنامه ریزی شده اند. این امر به ویژه در صورتی که می خواهید یک شاخص را آزمایش کنید مفید است اما مطمئن نیستید که چقدر مؤثر خواهد بود. به جای اینکه سعی کنید ریاضی را در پشت نشانگر بفهمید ، و چگونه می توانید آن را کدگذاری کنید ، می توانید ابتدا آن را در Backtrader آزمایش کنید ، احتمالاً با یک خط کد.
پشتیبانی از استراتژی های پیچیده - آیا می خواهید از یک مجموعه داده سیگنال بگیرید و تجارت دیگری را انجام دهید؟آیا استراتژی شما شامل چندین بازه زمانی است؟یا نیاز به نمونه گیری داده ها دارید؟Backtrader روشهای مختلف نزدیک به بازرگانان به بازارها را به خود اختصاص داده و پشتیبانی گسترده ای دارد.
منبع باز-استفاده از نرم افزار منبع باز فایده زیادی دارد ، در اینجا چند مورد از آنها وجود دارد:
- شما به تمام مؤلفه های فردی دسترسی کامل دارید و در صورت تمایل می توانید بر روی آنها بنا کنید.
- نیازی به بارگذاری استراتژی خود در یک سرور شخص ثالث نیست که نگرانی های مربوط به محرمانه بودن را کاهش می دهد.
- شما موظف نیستید همانطور که ممکن است با نرم افزار یک شرکت از یک شرکت استفاده کنید ، با تغییرات ناخواسته به روز کنید. مثال خوب این زمانی است که چند سال پیش از تجارت زنده Quantopian کار خود را قطع کرد. این بسیاری از کاربران را وادار به مهاجرت به بستر دیگری کرد که می تواند دست و پا گیر باشد.
توسعه فعال - این ممکن است منطقه ای باشد که Backtrader به خصوص در آن برجسته است. این چارچوب در ابتدا در سال 2015 توسعه یافته است و از آن زمان پیشرفت های مداوم انجام شده است. فقط چند هفته پیش ، یک کتابخانه تجزیه و تحلیل فنی مبتنی بر پانداس برای پرداختن به موضوعات در چارچوب محبوب و متداول TA-Lib منتشر شد. علاوه بر این ، با یک پایگاه کاربر گسترده ، توسعه شخص ثالث نیز فعال است.
تجارت زنده - اگر از نتایج پشتی خود راضی هستید ، به راحتی می توانید به یک محیط زنده در Backtrader مهاجرت کنید. این امر به ویژه در صورتی که قصد استفاده از شاخص های داخلی ارائه شده توسط این سکو را داشته باشید ، مفید است.
»Backtrader برای پشتی و تجارت زنده استفاده نمی شود.
QuantCoect یک بستر مبتنی بر مرورگر است که هم به پشت و هم تجارت زنده امکان پذیر است.
- استراتژی هایی را بر اساس عوامل آلفا مانند احساسات ، رمزنگاری ، اقدامات شرکت ها و داده های کلان (داده های ارائه شده توسط QuantCoect) ایجاد کنید.
- Backtest و تجارت طیف گسترده ای از کلاس های دارایی و صنایع ETF (داده های ارائه شده توسط QuantCoect).
- استراتژی های مجوز صندوق پرچین (در حالی که IP را نگه دارید) از طریق جریان Alpha QuantCoect.
چرا نباید Backtrader را یاد بگیرم؟
یک منحنی یادگیری بالقوه شیب دار - کارهای زیادی وجود دارد که می توانید با Backtrader انجام دهید ، بسیار جامع است. اما عملکرد اضافی را می توان به عنوان شمشیر دو لبه دانست. برای درک نحو و منطق مورد استفاده مدتی طول خواهد کشید.
با درک کتابخانه - در مورد نکته قبلی ، ایده خوبی است که از طریق کد منبع هر کتابخانه جستجو کنید تا درک بهتری از چارچوب بدست آورید. هنگام رفع کد منبع ، 470 مورد استخراج شد. اعطا می شود ، برخی از این نمونه ها یا مجموعه داده ها هستند. همچنین چندین اسکریپت دیگر در حال استفاده نبودند. با این وجود ، چیزهای زیادی برای عبور از آن وجود دارد.
نیاز به تهیه داده ها - در یک مقطع ، ادغام با API مالی یاهو از این موضوع مراقبت کرد. API از آن زمان کاهش یافته است و اکنون شما نیاز به تهیه و تهیه داده ها دارید. روش هایی برای ارتباط با یک کارگزار وجود دارد که می تواند به این مسئله بپردازد ، هرچند که همه این موارد مستقیم نیست.
ایجاد چارچوب شخصی خود - برخی از افراد ترجیح می دهند درک کاملی از نرم افزار خود داشته باشند و ترجیح می دهند به خودی خود یک بستر پشتی ایجاد کنند. در بیشتر موارد ، این کار بسیار بیشتری خواهد بود ، اما فواید آشکار وجود دارد. اگر به دنبال این هستید که فقط یک ایده کلی در مورد یک استراتژی ساده بدست آورید ، ممکن است فقط سعی کنید از داده های تاریخی در مقابل یادگیری کتابخانه استفاده کنید.
مروری بر نحوه عملکرد Backtrader
Backtrader به شما نشان می دهد که چگونه ممکن است استراتژی شما در بازار با آزمایش آن در برابر داده های قیمت گذشته عمل کند.
ابتدایی ترین عملکرد کتابخانه ، تکرار از طریق داده های تاریخی و شبیه سازی اجرای معاملات بر اساس سیگنال های ارائه شده توسط استراتژی شما است.
این کار از بسیاری جهات گسترش می یابد. برای ارائه آمار مفید می توان "آنالایزر" Backtrader را اضافه کرد. ما نمونه ای از این را با استفاده از نسبت شارپ متداول در تست بهینه سازی بعداً در این آموزش نشان خواهیم داد.
در مورد موضوع بهینه سازی ، روشن است که فکر زیادی برای سرعت بخشیدن به آزمایش استراتژی ها با پارامترهای مختلف وجود دارد. ماژول بهینه سازی ساخته شده از چند پردازش ، به طور کامل با استفاده از هسته های CPU متعدد شما برای سرعت بخشیدن به روند استفاده می کند.
سرانجام ، Backtrader از کتابخانه مشهور Matplotlib برای ایجاد نمودارهایی در انتهای پشتی خود استفاده می کند ، در صورت تمایل.
نحوه نصب backtrader
ساده ترین راه برای نصب Backtrader توسط خط فرمان است. به سادگی در PIP نصب backtrader تایپ کنید.
اگر قصد استفاده از عملکرد نمودار را دارید ، باید Matplotlib را نصب کنید. حداقل نسخه نسخه برای Matplotlib 1. 4. 1 است.
می توانید تأیید کنید که با تایپ لیست PIP از خط فرمان ، روی سیستم خود نصب شده است تا بسته های نصب شده پایتون را نشان دهید.
در صورت نیاز به نصب آن ، می توانید این کار را از طریق PIP نصب Backtrader [نقشه برداری] یا PIP نصب Matplotlib انجام دهید.
انتخاب IDE برای استفاده با Backtrader
قبل از ورود به کد، اجازه دهید یک لحظه کوتاه به بحث در مورد IDE ها بپردازیم.
یک IDE یا محیط توسعه یکپارچه، به سادگی ویرایشگری برای نوشتن و رفع اشکال کد شماست. چندین IDE محبوب وجود دارد و انتخاب مناسب اغلب به ترجیحات شخصی بستگی دارد.
پایتون با یک IDE به نام IDLE همراه است. برخی از محبوب ترین IDE های شخص ثالث پایتون عبارتند از VS Code، Sublime Text، PyCharm و Spyder.
نکته دیگر این است که آیا باید از یک IDE تعاملی استفاده کرد یا خیر. یک انتخاب محبوب در مورد IDE های تعاملی Jupyter Notebook است.
IDE های تعاملی دارای قابلیت اضافی برای اجرای بلوک های انتخابی کد بدون اجرای کل اسکریپت شما هستند. این در هنگام آزمایش یک کتابخانه جدید بسیار مفید است زیرا می توانید عملکردهای مختلف را بدون نیاز به اظهار نظر یا حذف بلوک کد قبلی خود امتحان کنید.
در حالی که امکان استفاده از IDE های تعاملی برای برخی عملکردها در Backtrader وجود دارد، توصیه نمی شود. عملکردهای خاصی مانند بهینه سازی وجود دارد که به چند پردازش نیاز دارد که با IDE های تعاملی به خوبی کار نمی کند.
اگر تصمیم دارید از یک IDE تعاملی استفاده کنید، باید بتوانید تا قسمت بهینه سازی این آموزش دنبال کنید. فقط مطمئن شوید که به مسیر دقیقی که فایل داده CSV شما در قسمت بعدی ذخیره می شود اشاره کنید که شامل افزودن داده می شود.
نحوه پیکربندی تنظیمات اولیه Backtrader
دو جزء اصلی برای تنظیم اسکریپت Backtrader اصلی شما وجود دارد. کلاس استراتژی و موتور مغزی.
در مثال های بعدی با جزئیات بیشتر وارد کلاس استراتژی خواهیم شد. اینجاست که تمام منطق در تعیین و اجرای سیگنال های تجاری شما پیش می رود. همچنین جایی است که می توان نشانگرها را ایجاد یا فراخوانی کرد و می توانید تعیین کنید که چه چیزی در صفحه ثبت یا چاپ شده است.
موتور سربرو هسته اصلی Backtrader است. این کلاس اصلی است و قبل از فراخوانی دستور cerebro. run() داده ها و استراتژی های خود را به آن اضافه می کنیم.
نحوه دریافت داده و وارد کردن آن به Backtrader
چندین راه برای دریافت داده وجود دارد. اگر قبلاً در یک کارگزار ثبت نام کرده اید، ممکن است برای گرفتن داده های تاریخی به API دسترسی داشته باشید.
از طرف دیگر، بسیاری از API های شخص ثالث در دسترس هستند که به شما امکان می دهند داده های تاریخی را از داخل کنسول پایتون خود دانلود کنید.
به عنوان مثال، ما داده ها را در قالب CSV مستقیماً از وب سایت Yahoo Finance دانلود می کنیم.
به سادگی به وب سایت مالی یاهو بروید و برای داده های مورد نظر خود وارد نام تیک یا نام شرکت شوید. سپس بر روی برگه داده های تاریخی کلیک کنید ، دوره زمانی خود را انتخاب کرده و روی Apply کلیک کنید. یک لینک داده بارگیری وجود خواهد داشت که فایل CSV را در هارد دیسک شما ذخیره می کند.
این ایده خوبی است که پرونده CSV را در فهرست پروژه خود کپی کنید. در غیر این صورت ، هنگام افزودن داده های خود به Cerebro ، باید یک نام کامل را مشخص کنید.
ما می توانیم با استفاده از الگوی فید های داخلی به طور خاص برای مالی یاهو ، داده های خود را به Backtrader اضافه کنیم. این الگو از هر نوع قالب بندی مورد نیاز برای Backtrader برای خواندن صحیح داده ها مراقبت خواهد کرد.
در مثال بالا ، ما مجموعه داده CSV را به متغیر داده های نامگذاری شده اختصاص داده ایم. مرحله بعدی اضافه کردن این به Cerebro است.
اضافه کردن داده ها می تواند در هر نقطه ای بین فوری Cerebro و تماس با دستور cerebro. run () انجام شود. چندین پارامتر اضافی وجود دارد که می توانیم هنگام بارگیری داده های خود مشخص کنیم. ما در مثال بعدی این مورد را بیشتر خواهیم کرد.
نحوه چاپ یا ورود به سیستم با استفاده از کلاس استراتژی در Backtrader
برای آشنایی بیشتر با کلاس استراتژی در Backtrader ، ما یک اسکریپت ساده ایجاد خواهیم کرد که قیمت های پایانی را برای مجموعه داده های خود چاپ می کند. کلاس استراتژی جایی است که ما بیشتر وقت خود را در Backtrader می گذرانیم.
اولین کاری که ما انجام خواهیم داد ایجاد یک کلاس جدید به نام PrintClose است که کلاس استراتژی Backtrader را به ارث می برد.
در عملکرد __init__ در بالا ، ما متغیری به نام DataClose ایجاد کرده ایم تا بتوانید بعداً به قیمت بسته شدن مراجعه کنید. متوجه خواهید شد که قیمت بسته شدن در Data [0] ذخیره می شود. ما می توانیم با مراجعه به داده ها به راحتی به قیمت باز دسترسی پیدا کنیم [0]. OPEN. اگر از چندین فید داده استفاده می کنید ، می توانید با مراجعه به مجموعه داده ها به فید دوم خود دسترسی پیدا کنید [1] . close ، اما بعداً در مورد آن.
یکی از ویژگی های مهم Backtrader دسترسی به داده های تاریخی است که اکنون می توانیم از طریق متغیر دیتاکلوز انجام دهیم. همانطور که Backtrader از طریق داده های تاریخی تکرار می شود ، این متغیر با آخرین قیمت از DataClose [0] به روز می شود. ما همچنین می توانیم با دسترسی به شاخص منفی DataClose به نقاط داده قبلی نگاه کنیم. به عنوان مثال.
if dataclose[0]>DataClose [-1]: عبور # کاری انجام دهید
کد فوق بررسی می کند که آیا جدیدترین نزدیکتر از بسته قبلی بزرگتر است یا خیر. ما می توانیم با تغییر شاخص مانند این ، به راحتی به دومین قیمت آخر بسته شدن دسترسی پیدا کنیم: DataClose [-2]
مرحله بعدی ایجاد یک عملکرد ورود به سیستم است.
تابع log به ما امکان می دهد تا از طریق متغیر TXT که می خواهیم به صفحه منتقل کنیم ، داده ها را منتقل کنیم. در صورت وجود ، مقادیر DateTime را از جدیدترین نقطه داده گرفته و آن را به صفحه نمایش می دهد.
اکنون که عملکرد چاپ/ورود به سیستم ما تعریف شده است ، ما عملکرد بعدی را بازنویسی خواهیم کرد. این مهمترین بخش کلاس استراتژی است زیرا بیشتر کد ما در اینجا اجرا می شود. این قسمت هر بار که Backtrader در نقطه داده جدید بعدی تکرار می شود ، فراخوانی می شود.
تمام کاری که اکنون انجام خواهیم داد این است که قیمت بسته شدن را وارد کنیم.
این همان چیزی است که فیلمنامه کامل ما در این مرحله به نظر می رسد:
و این همان چیزی است که خروجی شما باید به نظر برسد:
از این نقطه به بعد ، ساختار فیلمنامه ما اکثراً یکسان خواهد بود و ما بخش عمده ای از استراتژی های خود را تحت عملکرد بعدی کلاس استراتژی خواهیم نوشت.
چگونه می توان با استفاده از Backtrader یک پشتی را اجرا کرد
ما Backtrader را نصب کرده ایم ، برخی از داده های تاریخی را بارگیری کرده ایم و اسکریپت اصلی خود را نوشتیم. قدم بعدی این است که یک استراتژی را پشت سر بگذارد.
ما یک استراتژی متقاطع متوسط متحرک را آزمایش خواهیم کرد. در اصل ، این شامل نظارت بر دو میانگین در حال حرکت و تجارت در هنگام عبور از دیگری است.
میانگین استراتژی متقاطع متحرک تجارت برنامه نویسی Hello World Script است. احتمالاً در دنیای واقعی مورد استفاده قرار نمی گیرد و بیشتر برای اهداف مصور استفاده می شود. به عبارت دیگر ، ما انتظار نداریم که این استراتژی سودآور باشد.
چند کار وجود دارد که ما قبل از غواصی در استراتژی انجام خواهیم داد. اول ، ما استراتژی خود را در پرونده خود جدا خواهیم کرد. در طول این آموزش ، ما چندین مثال را طی خواهیم کرد و جدا کردن استراتژی ها از اسکریپت اصلی ، کد را با فرمت تمیز و خوبی نگه می دارد.
فیلمنامه اصلی ، که همه چیز مربوط به Cerebro را خواهد داشت ، فقط در طول آموزش تغییرات جزئی خواهد داشت در حالی که بیشتر کارها در اسکریپت استراتژی ها انجام می شود.
اسکریپت استراتژی ها به طور مناسب با نام Strategies. py نامگذاری می شوند.
ما همچنین باید داده های خود را به دو بخش جدا کنیم. به این ترتیب ، ما می توانیم استراتژی خود را در قسمت اول آزمایش کنیم ، برخی از بهینه سازی ها را اجرا کنیم و سپس ببینیم که چگونه با پارامترهای بهینه شده ما در مجموعه دوم داده ها عملکرد می کند.
اگر اصطلاحات داده های نمونه یا داده های خارج از نمونه را شنیده اید ، این همان چیزی است که به آن اشاره می شود. داده های خارج از نمونه به سادگی داده ها برای آزمایش پس از بهینه سازی کنار گذاشته شده است.
برای آزمایش و بهینه سازی این روش فواید زیادی وجود دارد ، به بهینه سازی پیاده روی و نحوه اجرای آن چیست؟اگر می خواهید درک کاملی از روش شناسی کسب کنید.
برای تقسیم داده ها ، هنگام بارگیری داده های خود ، از تاریخ و تا به امروز تنظیم می کنیم. فراموش نکنید که ماژول DateTime را برای این قسمت وارد کنید.
در اینجا اسکریپت اصلی به روز شده ما که btmain. py نامیده می شود:
ما از Strategy Import * گنجانده شده ایم که هنگام ایجاد آنها ، استراتژی های جدید را از اسکریپت اصلی آسان تر می کند. همچنین در انتهای اسکریپت شامل جزئیات مربوط به مقادیر نمونه کارها و اندازه موقعیت پیش فرض ما است که روی 3 سهم تنظیم شده است.
فرمان cerebro. broker. getValue () به شما امکان می دهد تا در هر زمان ارزش نمونه کارها را بدست آورید. ما با فراخوانی آن قبل از اجرای Cerebro ، مقدار شروع را می گیریم و بعد از آن یک بار دیگر با آن تماس می گیریم تا مقدار نمونه کارها را به دست آوریم. ما می توانیم با کم کردن مقدار نهایی از مقدار شروع ، سود یا ضرر خود را ببینیم.
بیایید استراتژی خود را شروع کنیم!
در کد فوق ، ما یک کلاس جدید به نام Macrossover ایجاد کرده ایم که از کلاس استراتژی Backtrader به ارث می برد.
ما پارامترهایی را برای میانگین متحرک خود به جای کدگذاری سخت آنها تنظیم کرده ایم. این امر بهینه سازی استراتژی بعداً آسانتر می شود.
چند مورد جدید تحت عملکرد __init__ وجود دارد. ما یک متغیر سفارش ایجاد کرده ایم که جزئیات سفارش در حال انجام و وضعیت سفارش را ذخیره می کند. به این ترتیب ما می دانیم که آیا در حال حاضر در تجارت هستیم یا دستور در انتظار است.
نکته ای که باید در مورد Backtrader به آن توجه داشت این است که وقتی سیگنال خرید یا فروش را دریافت می کند ، می توانیم به آن دستور دهیم که سفارش ایجاد کند. با این حال ، این دستور تا زمان نامگذاری نوار بعدی با هر قیمتی که ممکن است اجرا شود ، اجرا نمی شود.
ما همچنین با استفاده از شاخص های ساخته شده در Backtrader ، دو میانگین متحرک ایجاد کرده ایم. فواید استفاده از شاخص های داخلی این است که Backtrader تا زمانی که این داده ها در دسترس نباشد ، به دنبال سفارشات شروع نمی کنند.
برای روشن شدن ، بزرگتر از دو میانگین متحرک به طور متوسط از 50 قیمت پایانی آخر استفاده می کند. این بدان معناست که 50 نقطه داده اول دارای مقدار متوسط در حال حرکت NAN خواهد بود. Backtrader می داند تا زمانی که ما داده های متوسط متحرک معتبر نداریم ، به دنبال سفارشات نباشید.
مورد بعدی که ما رونویسی خواهیم کرد ، عملکرد notify_order است. این جایی است که همه چیز مربوط به سفارشات تجاری پردازش می شود.
آنچه کد فوق انجام می دهد این است که هنگام اجرای یک سفارش و با چه قیمتی وارد سیستم شویم. در این بخش همچنین در صورت عدم انجام دستور ، اعلان را ارائه می دهد.
سرانجام ، ما عملکرد بعدی داریم که شامل تمام منطق تجارت ما است.
ما ابتدا یک سفارش فعال را بررسی می کنیم که در این صورت نمی خواهیم کاری انجام دهیم. برای این استراتژی ، ما فقط می خواهیم همزمان در یک موقعیت قرار بگیریم.
اگر در بازار نباشیم ، می توانیم به دنبال یک متقاطع متوسط در حال حرکت باشیم. نکته ای که باید در این استراتژی به آن توجه داشته باشیم این است که سیگنال ما از صلیب یک میانگین متحرک نسبت به دیگری ناشی می شود.
برای برآورده کردن این نیاز ، ما بررسی می کنیم که آیا میانگین متحرک زیر 50 میانگین در حال حرکت در آخرین شمع است اما در شمع فعلی بالاتر از آن است یا برعکس. این تأیید می کند که یک صلیب اتفاق افتاده است. در غیر این صورت ، ما دائماً سیگنال می گیریم.
سرانجام ، ما بیانیه دیگری داریم که اگر در حال حاضر در بازار هستیم اجرا می شود. برای استراتژی خروج ، ما پس از ورود به تجارت ، به سادگی از پنج میله خارج خواهیم شد.
در اجرای کد ، اسکریپت تمام معاملات ما را خروجی می کند و PNL نهایی را در پایان چاپ می کند. در این حالت ، ما 79 دلار سود داشتیم.
نکته ای که باید هنگام تست استراتژی ها در نظر داشته باشید این است که اسکریپت می تواند با تجارت باز در سیستم به پایان برسد. یکی از راه های بررسی اینکه آیا معاملات باز وجود دارد ، اطمینان از "بستن ایجاد" دومین خروجی خط آخر قبل از چاپ مقادیر نمونه کارها است. در غیر این صورت ، تجارت آزاد احتمالاً نتایج PNL شما را کاهش می دهد.
نحوه استفاده از نشانگر متقاطع داخلی
در مثال میانگین متحرک ما ، منطق را در تعیین اینکه آیا دو میانگین متحرک در حال عبور است ، کدگذاری کردیم. Backtrader شاخصی را ایجاد کرده است که می تواند این کار را تعیین کند که می تواند کارها را کمی ساده تر کند.
برای استفاده از نشانگر داخلی ، آن را در عملکرد __init__ به شرح زیر کنید: self. crossover = bt. indicators. crossover (self. fast_sma ، self. slow_sma)
سپس تنها کاری که باید انجام دهید اینست که نشانگر ارائه سیگنال به شرح زیر است
چگونه می توان بهینه سازی را در Backtrader اجرا کرد
مرحله بعدی ما تلاش و دیدن اینکه آیا می توانیم با تغییر برخی از پارامترهای متوسط در حال حرکت ، سود خود را افزایش دهیم.
در این استراتژی ، بیانیه چاپ را در عملکرد log بیان خواهیم کرد. بهینه سازی شامل چندین پشتی با پارامترهای مختلف است و ما نیازی به ورود به سیستم نداریم و هر تجارتی را که انجام می شود انجام دهیم.
در عوض ، ما عملکرد استراتژی را بر اساس نسبت شارپ قضاوت خواهیم کرد.
برای اجرای بهینه سازی تعدادی تغییر در پرونده اصلی اسکریپت وجود دارد. در اینجا کد اسکریپت اصلی به روز شده است:
بیایید برخی از تغییرات اساسی را اجرا کنیم. هنگام فوری Cerebro ، پارامتر Optretu = False اضافه شد. Cerebro برخی از داده ها را هنگام اجرای بهینه سازی برای بهبود سرعت حذف می کند. با این حال ، ما به این داده ها نیاز داریم ، از این رو پارامتر اضافی.
cerebro. addstrategy برداشته شد و با cerebro. optstrategy جایگزین شد. ما همچنین پارامترهای اضافی اضافه کرده ایم که طیف وسیعی از مقادیر را برای بهینه سازی میانگین های متحرک برای آن مشخص می کند. علاوه بر این ، یک آنالایزر اضافه شد که نسبت شارپ را برای نتایج ما محاسبه می کند.
شاید متوجه شده باشید که ما یک __name__ == '__main__' اضافه کردیم: بلوک. در آزمایش خود ، بدون آن به خطایی رسیدیم.
نتایج بهینه شده در متغیر بهینه سازی شده_Runs در قالب لیستی از لیست ها ذخیره می شوند. بخش پایین کد از طریق لیست ها تکرار می شود تا مقادیر مورد نیاز خود را بدست آوریم و آن را به یک لیست تازه ایجاد شده اضافه کنید.
سه خط آخر کد لیست را مرتب کرده و پنج مقدار برتر را چاپ می کند. این همان چیزی است که نتایج ما به نظر می رسد:
به نظر می رسد که ما یک برنده واضح داریم. یک دوره 7 برای میانگین حرکت سریع و یک دوره 92 برای میانگین حرکت آهسته نتیجه قابل توجهی بالاتر برای نسبت شارپ ایجاد می کند.
اکنون زمان آن رسیده است که برخی از پشتی ها را روی داده های خارج از نمونه اجرا کنیم. تنها چیزی که طول می کشد یک تغییر ساده در پارامترهای داده است.
پشتی ما با همان تنظیماتی که در آزمون اصلی خود استفاده کردیم ، از دست دادن 63. 42 دلار نشان می دهد ، اما در داده های خارج از نمونه. در اینجا نتیجه پس از تغییر تنظیمات میانگین متحرک به پارامترهای بهینه شده است.
ضرر 170. 22 دلار ، حتی بیشتر از تنظیمات اصلی ما اگرچه انتظار می رفت که چند مورد بر چهره های ما تأثیر بگذارد.
اول ، میانگین متقاطع در حال حرکت یک استراتژی ناخوشایند است که انتظار می رود ضرر ایجاد کند. تنها تعجب در اینجا این بود که در اولین اجرای ما سود کسب کرد.
دوم ، این یک نمونه عالی از بیش از حد است. اگر با بیش از حد آشنا نیستید ، قطعاً بررسی کنید که چه چیزی در تجارت بیش از حد وجود دارد؟- این یک عنصر مهم توسعه استراتژی است.
نحوه ساخت یک صفحه نمایش سهام در Backtrader
از صفحه نمایش ها معمولاً برای فیلتر کردن سهام بر اساس پارامترهای خاص استفاده می شود. روش های آسان زیادی برای نگاه کردن به یک تاریخ مشخص وجود ندارد و می بینید که یک صفحه نمایش سهام ممکن است از چه نتیجه ای استفاده کند. خوشبختانه ، Backtrader دقیقاً این را ارائه می دهد.
ما این قابلیت را با ساختن یک صفحه نمایش که از سهام خود که در حال تجارت دو انحراف استاندارد در زیر قیمت متوسط در طی 20 روز گذشته هستند ، آزمایش می کنیم.
ما با ایجاد یک زیر کلاس از کلاس Analyzer Backtrader شروع خواهیم کرد که مؤلفه "نمایشگر" استراتژی ما را تشکیل می دهد.
تحت عملکرد شروع ، متوجه خواهید شد که ما از باند های بولینگر برای تعیین مقدار دو انحراف استاندارد استفاده می کنیم. نحو کمی متفاوت از مثالهای قبلی است زیرا چندین مجموعه داده در یک صفحه نمایش استفاده می شود.
عملکرد توقف جایی است که بخش عمده ای از کد ما سقوط می کند. ما برای همه مجموعه داده های خود از طریق موارد باند بولینگر تکرار می کنیم تا مواردی را که در زیر باند پایین تجارت می کنند فیلتر کنیم.
سهام هایی که واجد شرایط هستند سپس به یک لیست اضافه می شوند. کلاس آنالایزر دارای یک فرهنگ لغت داخلی با RETS نام متغیر است. ما از این فرهنگ لغت برای ذخیره لیست های خود استفاده خواهیم کرد.
در اسکریپت اصلی ما کد زیادی لازم نیست ، اما با نمونه های قبلی کاملاً متفاوت است. از آنجا که ما در حال اضافه کردن چندین مجموعه داده هستیم ، لیستی از تمام تیکت هایی را که می خواهیم اسکن کنیم ایجاد کرده ایم. سپس از طریق لیست تکرار می کنیم تا پرونده های CSV مربوطه را به Cerebro اضافه کنیم.
در مرحله بعد ، ما کلاس صفحه نمایش تازه ایجاد شده خود را به Cerebro به عنوان آنالایزر اضافه می کنیم.
سرانجام ، ما با چند پارامتر اضافی دستور cerebro. run را صدا می کنیم. نویسنده = پارامتر واقعی ، عملکرد نویسنده داخلی را برای نمایش OPUT فراخوانی می کند. stdstats = false برخی از خروجی های استاندارد را حذف می کند (بیشتر در مورد این بعداً). و در آخر ، RUNONCE = FALSE تضمین می کند که داده ها همزمان می شوند.
در اینجا نتایج ما وجود دارد:
ما می توانیم ببینیم که TSLA و GE حداقل در طی 20 روز قبل در تاریخ 30 اکتبر 2017 حداقل دو انحراف استاندارد زیر متوسط قیمت نزدیک خود معامله کردند.
نحوه کدگذاری یک شاخص در Backtrader
سه روش برای کدگذاری یک شاخص در Backtrader وجود دارد. می توانید یکی را از ابتدا کدگذاری کنید ، از یک نشانگر داخلی استفاده کنید یا از یک کتابخانه شخص ثالث استفاده کنید.
اگر قصد استفاده از عملکرد زنده Backtrader را ندارید ، ممکن است خودتان بخواهید نشانگر خود را کدگذاری کنید.
در اینجا نمونه ای از شاخصی که ما ایجاد کردیم آورده شده است:
کد فوق میانگین دامنه واقعی (ATR) را محاسبه می کند. هدف آن این است که تخمین زده شود که یک ابزار به طور معمول در یک دوره معین تغییر می کند.
این کار را با تکرار از طریق 14 نقطه داده آخر انجام می دهد که می تواند با استفاده از یک شاخص منفی در Backtrader انجام شود. ما بالا را می گیریم و برای هر دوره کم کم می کنیم و سپس آن را متوسط می کنیم.
سپس کد را می توان در عملکرد بعدی کلاس استراتژی ما قرار داد. ما همچنین می توانیم یک تابع ورود به سیستم ساده برای ورود به سیستم به صفحه نمایش اضافه کنیم:
در اینجا کد استراتژی کامل وجود دارد:
در اینجا به نظر می رسد که خروجی وقتی همه را کنار هم قرار می دهیم ، به نظر می رسد.
برای یادگیری ریاضیات و کد در پشت شاخص های مختلف فنی می توانید ChartSchool را بررسی کنید.
نحوه ترسیم در Backtrader
ترسیم یک نمودار در Backtrader فوق العاده ساده است. تمام کاری که شما باید انجام دهید این است که پس از تماس با cerebro. run () ، اضافه کردن cerebro. plot () را به کد خود اضافه کنید.
در اینجا نمونه ای از نمودار با داده های TSLA که در مثالهای ما از آن استفاده کرده ایم آورده شده است.
به طور پیش فرض ، نمودار سعی در نشان دادن موارد زیر دارد
- نوسانات در تعادل شما
- سود یا از دست دادن هرگونه معاملات انجام شده در طول پس آزمون
- جایی که معاملات خرید و فروش نسبت به قیمت انجام شده است.
اگر علاقه ای به دیدن همه این جزئیات اضافی ندارید ، به سادگی از پارامتر زیر عبور کنید - stdstats = false. می توانید آن را از طریق آن عبور کنید ، یا هنگامی که Cerebro را فوری می کنید ، یا وقتی با Cerebro. run تماس می گیرید. هر دو نتیجه یکسان را تولید می کنند.
به یاد بیاورید که ما از این پارامتر در Screener Stock خود استفاده کردیم؟
اگر با دو سهام مختلف کار می کنید ، می توانید به راحتی هر دو را در یک نمودار نشان دهید. اگر می خواهید همبستگی بین دو دارایی را تجسم کنید ، این می تواند مفید باشد.
کد فوق نمودار با داده های قیمت TSLA و AAPL که در بالای یکدیگر پوشانده شده است ، ایجاد می کند. این چیزی است که نمودار به نظر می رسد:
سرانجام ، هر شاخصی که ممکن است اضافه کنید به طور خودکار به نمودار اضافه می شود. در اینجا یک مثال کد وجود دارد که داده های قیمت TSLA را با میانگین حرکت 20 روزه نشان می دهد.
توجه داشته باشید که ما از یک مقدار برای plotname عبور کردیم. این امکان را به ما می دهد تا مقدار صفحه نمایش را برای میانگین متحرک در افسانه تغییر دهیم. این چیزی است که نمودار به نظر می رسد:
نحوه استفاده از داده های جایگزین در Backtrader
در این استراتژی ، ما می خواهیم بر اساس داده های جستجوی Google ، احساسات را امتحان کنیم و بر اساس هرگونه تغییر قابل توجه در حجم جستجو ، معاملات را اجرا کنیم.
ما داده های جستجوی هفتگی تاریخی را از Google Trends for Bitcoin بارگیری کرده ایم و داده های قیمت را از Finance Yahoo بدست آورده ایم.
دارایی داده های جایگزین
از آنجا که در اواخر سال 2017 نوسانات زیادی وجود داشت ، ما این استراتژی را از سال 2018 به بعد آزمایش خواهیم کرد. نتایج جستجو داده ها و قیمت ها هر دو بعد از آن نقطه کاملاً تثبیت شدند.
داده های Google Trends که ما بارگیری کرده ایم به عنوان داده های مالی یاهو ما از همان قالب باز ، بالا ، پایین و نزدیک پیروی نمی کنند. بنابراین ، ما از الگوی CSV عمومی ارائه شده توسط Backtrader برای اضافه کردن داده های خود استفاده خواهیم کرد. در اینجا کد است:
ما مجبور شدیم تعریف کنیم که کدام ستون ها حضور داشتند و کدام یک نبودند. این کار با اختصاص مقادی ر-1 برای ستون هایی که در داده های ما موجود نیستند و تعیین مقدار عدد صحیح افزایش یافته برای ستون هایی که در دسترس بودند انجام شد.
گذشته از آن ، اسکریپت کد اصلی ما تقریباً از مثال متقاطع متحرک در حال تغییر بود.
در اینجا کلاس استراتژی ما است:
ما بار دیگر از گروههای بولینگر استفاده می کنیم. اسکریپت فوق به دنبال افزایش بیشتر از یک انحراف استاندارد در حجم جستجو برای ورود به یک موقعیت طولانی و برعکس برای ورود کوتاه است.
اگر داده های جستجو در 1 انحراف استاندارد از میانگین 10 نقطه داده گذشته عقب نشینی کنند ، ما موقعیت خود را می بندیم.
در عملکرد __init__ ، ما نام های متغیر را به دو مجموعه داده مختلف اختصاص دادیم تا بتوانیم در طول استراتژی خود به آنها راحت تر مراجعه کنیم. گذشته از این ، نحو بسیار شبیه به نمونه های قبلی است.
پس از اجرای پشتی ، نتایج ما در اینجا آمده است:
این استراتژی 5859 دلار با قیمت 10،000 دلار شروع کرد. این تقریباً 60 ٪ بازده است! و این بدون تلاش برای بهینه سازی است.
نحوه اضافه کردن آمار بصری به پشتی
Backtrader دارای چند آنالایزر است که جزئیات عمیق از پشتی را ارائه می دهد. اما به جای برنامه نویسی چندین آنالایزر ، می توانیم از یک کتابخانه شخص ثالث استفاده کنیم که آمار کاملی از پشتی و سایر تجسم ها را نشان می دهد.
یک کتابخانه محبوب برای این امر Pyfolio است که می تواند یک صفحه اشک آور با انواع اطلاعات ایجاد کند. این کار از طریق نوت بوک های Jupyter انجام می شود.
گزینه خوب دیگر استفاده از کتابخانه Quantstats است. فایده این کتابخانه این است که یک پرونده HTML از آمار را ذخیره می کند و مرحله اضافی اجرای نوت بوک را که Pyfolio به آن نیاز دارد ، از بین می برد.
ساده ترین راه برای نصب Quantstats توسط PIP از طریق خط فرمان است.
هر دو Quantstats و Pyfolio برای محاسبه آمار نیاز به داده های بازگشت دارند. برای به دست آوردن این داده ها می توانیم از آنالایزر Backtrader استفاده کنیم.
ما بر اساس مثال داده های جایگزین قبلی خود ساخته خواهیم شد و از استراتژی احساسات BTC ما یک صفحه اشکی در آمار ایجاد خواهیم کرد. اولین قدم اضافه کردن آنالایزر است که داده های بازگشت به ما می دهد. ما باید خط کد زیر را اضافه کنیم:
خط کد فوق را می توان در هر نقطه از اسکریپت اضافه کرد تا زمانی که قبل از دستور cerebro. run و بعد از شروع کلاس Cerebro باشد.
همانطور که ممکن است از این نام حدس زده باشید ، این آنالایزر برای فعال کردن ادغام Pyfolio ایجاد شده است. اما دقیقاً با کتابخانه Quantstats کار می کند.
ما باید نتایج را از پشتی خود ذخیره کنیم ، مشابه آنچه در مثال نسبت شارپ انجام دادیم.
در پایان اسکریپت ما ، پس از اتمام پشتی ما ، می توانیم برای استخراج داده های بازده از آنالایزر ، مقداری کد اضافه کنیم.
کد بالا تمام داده های بدست آمده توسط تحلیلگر PyFolio را دریافت می کند. سپس داده های برگشتی را تقسیم می کنیم تا فقط مقادیر بازگشتی را استخراج کنیم.
همانطور که ممکن است از نام آن حدس زده باشید، این تحلیلگر به گونه ای ساخته شده است که متغیر بازگشتی در واقع یک Pandas DataFrame است. برای اینکه آن را با quantstats سازگار کنیم، آگاهی منطقه زمانی را با استفاده از تابع tz_convert داخلی از Pandas حذف کردیم.
از آنجایی که ما از Pandas استفاده می کنیم، باید آن را در اسکریپت خود وارد کنیم. همچنین می توانیم کتابخانه quantstat را همزمان وارد کنیم. برای انجام این کار موارد زیر را در بالای اسکریپت خود اضافه می کنیم.
بیایید به پایین اسکریپت برگردیم و عملکرد را برای ایجاد یک جدول آماری اضافه کنیم.
پس از اجرای مجدد بک تست، یک فایل stats.html در پوشه پروژه های ما ایجاد می شود. به نظر می رسد این است:
برگه کامل اشک در اینجا قابل مشاهده است
چگونه داده های بک تست را در یک فایل CSV ذخیره کنیم
در مثال های اینجا، معاملات باز و بسته را در کنسول چاپ کرده ایم. اما اگر چندین آزمایش را اجرا می کنید و بعداً می خواهید آنها را با هم مقایسه کنید، نوشتن داده های بک تست خود در یک فایل CSV ممکن است مفید باشد.
یک روش داخلی در backtrader وجود دارد که یک فایل CSV برای شما ایجاد می کند. این شامل داده هایی از فیدهای داده، استراتژی ها، شاخص ها و تحلیلگرها می شود.
برای استفاده از آن، به سادگی خط زیر را به اسکریپت خود اضافه کنید. تا زمانی که قبل از cerebro. run و بعد از نمونه سازی کلاس cerebro باشد، می توان آن را در هر جایی از اسکریپت اضافه کرد.
برای پارامتر out، log. csv را مشخص کرده ایم. شما می توانید نام فایل را هر چیزی که می خواهید بگذارید. پس از اجرای بک آست، باید یک فایل CSV در فهرست پروژه های شما با تمام داده های ذکر شده قبلی وجود داشته باشد.
اگر می خواهید رویکرد سفارشی تری داشته باشید، گزینه های دیگری نیز وجود دارد. در کلاس استراتژی، می توانیم تابع stop() را بازنویسی کنیم تا هر متغیری در کلاس ذخیره شود. به عنوان مثال.
در تابع __init__، متغیری به نام log_pnl را به عنوان یک لیست مقداردهی اولیه کرده ایم.
سپس در تابع log، خروجی (آنچه معمولاً در کنسول چاپ می شود) را به لیست log_pnl خود اضافه می کنیم.
در نهایت، می توانیم پس از پایان اجرای بک آست، لیست را در یک فایل ذخیره کنیم. برای این کار از تابع stop() استفاده می کنیم که یک بار پس از اتمام بک تست اجرا می شود. در اینجا کد ذخیره log_pnl در فایل است.
شما می توانید از این روش برای ذخیره داده های سفارشی از backtrader در یک فایل استفاده کنید.
در مثال قبلی، از تحلیلگر PyFolio backtrader برای تولید بازده و سایر داده هایی که به شکل Pandas DataFrame هستند، استفاده کردیم. با استفاده از متد داخلی ()to_csv از Pandas می توانیم داده های برگردانده یا هر فایل دیگری را ذخیره کنیم.
جایگزین های Backtrader
وقتی صحبت از نرم افزار بک تست به میان می آید، گزینه های زیادی وجود دارد، اگرچه سه نام وجود داشت که اغلب در تحقیقات ما ظاهر می شد - Zipline، PyAlgoTrade، و Backtrader.
جالب اینجاست که نویسنده Backtrader پس از بازی با PyAlgoTrade و دریافت که فاقد عملکردی است که به دنبال آن بود، تصمیم به ایجاد آن گرفت.
و به نظر می رسد که او چند پلتفرم بک تست دیگر را نیز آزمایش کرده است. اگر به دنبال لیست بزرگتری از گزینه های جایگزین هستید، صفحه Backtrader GitHub را که دارای لیستی از 20 گزینه است، بررسی کنید.
نظرات نهایی در مورد Backtrader
واضح است که کارهای زیادی برای Backtrader انجام شده است و بیش از آنچه کاربر معمولی به دنبال آن است ارائه می دهد. این می توانست به راحتی به یک راه حل تجاری تبدیل شود و ما نویسنده را به خاطر منبع باز نگه داشتن آن تحسین می کنیم.
پس از گذراندن این آموزش، باید در موقعیت خوبی باشید تا اولین استراتژی خود را در Backtrader امتحان کنید. چند نکته اضافی وجود دارد که به شما پیشنهاد می کنیم آنها را بررسی کنید و سعی کنید آنها را در بک تست خود بگنجانید.
کمیسیون - کارمزدهای معاملاتی و کمیسیون ها جمع می شوند و نباید آنها را نادیده گرفت. Backtrader در ابتدا فقط به کاربران اجازه می داد که یک کمیسیون بر اساس درصد را برای سهام تعیین کنند، اما از آن زمان این کار برای تطبیق با قیمت گذاری ثابت تکامل یافته است.
مدیریت ریسک مثال های ما از نظر مدیریت ریسک، چیز زیادی را شامل نمی شوند. هدف در اینجا برجسته کردن پتانسیل Backtrader و ارائه یک پایه محکم برای استفاده از پلتفرم بود.
نتایج بک تست شما بسته به نوع مدیریت ریسکی که اجرا می کنید احتمالاً بسیار متفاوت خواهد بود. هدف این است که استراتژی خود را بهینه سازی کنید تا به بهترین نحو با تحمل ریسک خود هماهنگ شوید، نه تلاش برای به حداکثر رساندن سود به قیمت ریسک های بزرگ.
در نهایت، زمانی که صحبت از توسعه استراتژی به میان می آید، باید روی ایجاد یک پایه خوب و سپس استفاده از بهینه سازی برای تغییرات جزئی تمرکز شود. گاهی اوقات معامله گران در دام نزدیک شدن برعکس به آن می افتند که به ندرت منجر به یک استراتژی سودآور می شود.
سیگنال های تجاری...
ما را در سایت سیگنال های تجاری دنبال می کنید
برچسب :
نویسنده : عبدالله بوتیمار
بازدید : <-PostHit->
تاريخ : سه
شنبه
23 خرداد
1402 ساعت: 21:32