این تعهد متعلق به هیچ شعبه ای در این مخزن نیست و ممکن است متعلق به یک چنگال در خارج از مخزن باشد.
نام در حال استفاده
یک برچسب در حال حاضر با نام شاخه ارائه شده وجود دارد. بسیاری از دستورات GIT نام برچسب و شاخه را می پذیرند ، بنابراین ایجاد این شاخه ممکن است باعث رفتار غیر منتظره شود. آیا مطمئن هستید که می خواهید این شاخه را ایجاد کنید؟
با استفاده از URL وب از Git یا Checkout با SVN استفاده کنید.
با CLI رسمی ما سریع کار کنید. بیشتر بدانید.
ورود به سیستم لازم
لطفاً برای استفاده از برنامه های کد وارد سیستم شوید.
راه اندازی دسک تاپ GitHub
اگر هیچ اتفاقی نمی افتد ، GitHub Desktop را بارگیری کنید و دوباره امتحان کنید.
راه اندازی دسک تاپ GitHub
اگر هیچ اتفاقی نمی افتد ، GitHub Desktop را بارگیری کنید و دوباره امتحان کنید.
راه اندازی Xcode
اگر هیچ اتفاقی نمی افتد ، Xcode را بارگیری کنید و دوباره امتحان کنید.
راه اندازی کد ویژوال استودیو
فضای کد شما یک بار آماده خواهد شد.
مشکلی برای تهیه فضای کدگذاری شما وجود داشت ، لطفاً دوباره امتحان کنید.
آخرین تعهد
آمار git
فایل ها
بارگیری آخرین اطلاعات متعهد انجام نشد.
readme. md

بهینه سازی نظریه موج الیوت با استفاده از الگوریتم های ژنتیکی برای پیش بینی بازارهای مالی
نام من فیلیپ است. هدف از این پروژه الگوبرداری از تئوری موج الیوت برای پیش بینی بازارهای مالی است. هنگامی که ما مدل را داریم و پارامترها را می شناسیم ، آن را با استفاده از یک تکنیک یادگیری ماشین به نام الگوریتم ژنتیکی بهینه می کنیم. سپس ما آن را با استفاده از بهینه سازی Walk Forward آزمایش می کنیم. عملکرد تناسب اندام که برای بهینه سازی و آزمایش از آن استفاده می کنیم ، نسبت شارپ است.
این آزمایش به صورت ساعتی بر روی جفت ارز EUR/USD انجام شد. این دوره از 2015/10 تا 2020/04 (شامل 2 دوره آموزش و 2 دوره آزمایش) بود. دوره های تمرینی 18 ماه (از 2015-10 تا 2017 تا 2017-04-15 و از 2018-01-15 تا 2019-07-15) و دوره های آزمایش 9 ماه (از 2017-04-15 تا 2017 تا 2017 بود. 2018-01-15 و از 2019-07-15 تا 2020-04-15).
نسبت شارپ برای هر دوره آموزشی بالاتر از 3 بود (که عالی است). نتایج برای دوره های آموزشی مخلوط شد. نسبت شارپ برای اولین دوره آموزش 1. 63 بود (که واقعاً خوب است) و برای دوره دوم با 0 معاملات برنده (که واقعاً بد است) -13. 99 بود.
یکی از مسئله مدل در دوره های آزمایش این است که معاملات کمی ایجاد کرده است (11 برای دوره آزمایش اول و 10 برای دوره آزمایش دوم). این ممکن است به دلیل یک مدل بهینه شده بیش از حد باشد که باعث افزایش بیش از حد شده است. ما همچنین می توانیم همان مدل را بر روی دارایی های مختلف و بازه های زمانی مختلف آزمایش کنیم.
این کتابخانه به گونه ای ساخته شده است که با ایجاد ماژول ها در بسته های مختلف (شاخص ها ، بهینه سازی ، trading_rules) می توان استراتژی تجارت را اصلاح کرد. به عنوان مثال ، قانون فعلی برای تلاش برای ورود به بازار زمانی است که یک روند شناسایی می شود (R2 و Mann-Kendall). ما می توانیم یک ماژول جدید ایجاد کنیم که سعی می کند با استفاده از یک استراتژی معنادار متوسط مانند زمانی که بازار 2 انحراف استاندارد از قیمت متوسط 100 روز گذشته (در بسته Trading_rules) وارد بازار شود ، وارد بازار شود.
برای یافتن جزئیات بیشتر در مورد این پروژه ، به پایین بروید
ساختار پروژه:
برای دیدن لیست HyperParameters و پارامترها برای بهینه سازی ، به این پرونده بروید
هر پرونده . py دارای مدرک خود است ، بنابراین برای درک جزئیات آن حتماً آن را بررسی کنید.
برای کسب اطلاعات بیشتر در مورد من
برای س questions ال یا نظرات ، لطفاً در LinkedIn در صورت تمایل به آن دسترسی پیدا کنید
قسمت 1 - تعریف
---- تعریف مشکل ----
هدف از این پروژه الگوبرداری از تئوری موج الیوت برای پیش بینی بازارهای مالی است. هنگامی که ما مدل را داریم و پارامترها را می شناسیم ، آن را با استفاده از یک تکنیک یادگیری ماشین به نام الگوریتم ژنتیکی بهینه می کنیم و در یک دوره متفاوت آزمایش می کنیم (بهینه سازی به جلو). عملکرد تناسب اندام مورد استفاده برای بهینه سازی و آزمایش ، نسبت شارپ است.
در حال حاضر هیچ تکنیکی واقعی برای مدل سازی تئوری موج الیوت وجود ندارد زیرا مدل سازی دشوار است و مدل سازی بسیار ذهنی است. برای درک مفهوم نظریه موج الیوت ، به این پست مراجعه کنید.
از آنجا که فضای بهینه سازی یک استراتژی تجارت می تواند پیچیده باشد ، الگوریتم های ژنتیکی یک روش یادگیری ماشین کارآمد برای یافتن تقریب خوب از راه حل بهینه هستند. این روند بیولوژیکی تکامل را تقلید می کند.

قسمت 2 - کشف کنید
این آزمایش به صورت ساعتی بر روی جفت ارز EUR/USD انجام شد. این دوره از 2015/10 تا 2020/04 (شامل 2 دوره آموزش و 2 دوره آزمایش) بود. دوره های تمرینی 18 ماه (از 2015-10 تا 2017 تا 2017-04-15 و از 2018-01-15 تا 2019-07-15) و دوره های آزمایش 9 ماه (از 2017-04-15 تا 2017 تا 2017 بود. 2018-01-15 و از 2019-07-15 تا 2020-04-15).
منبع داده برای این آزمایش Dukascopy بود زیرا به داده های زیادی نیاز داشت. این برنامه داده ها را با فرمت CSV خوانده است. اگر می خواهید یک آزمایش را روی یک دارایی و/یا بازه زمانی متفاوت انجام دهید ، حتماً داده ها را در پوشه مورد نظر خود بارگذاری کرده و مسیر را با متغیر self. directory در Initialize. py تغییر دهید.
اگر داده های کمتری برای آزمایش لازم باشد یا اگر آزمایش بر روی داده های روزانه انجام شود ، ALPHA VANTATE API یک منبع عالی برای دریافت داده های رایگان و با کیفیت است (با محدودیت های خاص ، مانند حداکثر تماس API در دقیقه). این یک مقاله عالی در مورد Alpha Vantage API است.
ما می توانیم داده های خود را بررسی کنیم:
| # | تاریخ | باز کن | عالی | کم | adj نزدیک |
| 96 | 2015-10-15 00:00:00 | 1. 14809 | 1. 14859 | 1. 14785 | 1. 14801 |
| 97 | 2015-10-15 01:00:00 | 1. 14802 | 1. 14876 | 1. 14788 | 1. 14828 |
| 98 | 2015-10-15 02:00:00 | 1. 14831 | 1. 14950 | 1. 14768 | 1. 14803 |
| 99 | 2015-10-15 03:00:00 | 1. 14802 | 1. 14826 | 1. 14254 | 1. 14375 |
| 100 | 2015-10-15 04:00:00 | 1. 14372 | 1. 14596 | 1. 14335 | 1. 14417 |
و به انواع ارزش ، انواع ارزش مراجعه کنید و اگر مقادیر خالی وجود دارد (هیچ):
| # | ستون | شمارش غیر تهی | نوع |
| 0 | تاریخ | 28176 غیر تهی | DateTime64 [NS] |
| 1 | باز کن | 28176 غیر تهی | float64 |
| 2 | عالی | 28176 غیر تهی | float64 |
| 3 | کم | 28176 غیر تهی | float64 |
| 4 | adj نزدیک | 28176 غیر تهی | float64 |
در manip_data. py ، ما مقدار نان را رها می کنیم ، در صورت وجود هر (هیچ) و داده ها را هنگام بسته شدن بازار با series_. drop_duplicates حذف می کنیم (نگه دارید = نادرست ، زیر مجموعه = لیست (dup_col. keys ()))
این 172 داده را حذف کرد.
| # | ستون | شمارش غیر تهی | نوع |
| 0 | تاریخ | 28024 غیر تهی | DateTime64 [NS] |
| 1 | باز کن | 28024 غیر تهی | float64 |
| 2 | عالی | 28024 غیر تهی | float64 |
| 3 | کم | 28024 غیر تهی | float64 |
| 4 | adj نزدیک | 28024 غیر تهی | float64 |
---- کاوش در داده ها (EDA) ----
این دوره از 2015/10 تا 2020/04 (شامل 2 دوره آموزش و 2 دوره آزمایش) بود. دوره های تمرینی 18 ماه (از 2015-10 تا 2017 تا 2017-04-15 و از 2018-01-15 تا 2019-07-15) و دوره های آزمایش 9 ماه (از 2017-04-15 تا 2017 تا 2017 بود. 2018-01-15 و از 2019-07-15 تا 2020-04-15). تقسیم در نمودار زیر را مشاهده می کنیم.
آبی 2 دوره آموزشی را نشان می دهد و سبز 2 دوره آزمایش را نشان می دهد

اگر کسی دوست دارد تجزیه و تحلیل سری زمانی مانند Arima را انجام دهد (در اینجا نه) ، ما باید بررسی کنیم که آیا سری ثابت است یا خیر. تست افزودنی دیکی - مولف این کار را انجام می دهد.
اگر سری ثابت نباشد و فقط موضوع "روند" باشد ، اولین تفاوت به طور کلی خوب است که یک سریال زمانی مالی را ثابت کنید. فصلی وجود دارد ، دستکاری های دیگر لازم است

---- ایجاد یک پایه ----
برای ساده کردن آن و به عنوان نسخه اول ، این استراتژی به معنای تلاش برای ورود به بازار در هنگام یافتن روند است. توجه داشته باشید که ممکن است این فرض را نقض کنیم که هیچ همبستگی وجود ندارد و شرایط خطا باید از توزیع عادی پیروی کند ، اما به خاطر سادگی ، ما عدم وجود همبستگی سریال را فرض خواهیم کرد و شرایط خطا از توزیع عادی پیروی می کندوادهمچنین از آزمایشات آماری برای تعیین اینکه آیا روند وجود دارد ، نه پیش بینی بازار مالی استفاده می شود. راهی برای این کار این است که سری ثابت شود.
ابتدا با استفاده از آزمون Mann-Kendall (روش های غیر پارامتری) ، ما بررسی می کنیم که آیا روند در بازار وجود دارد یا خیر. این بهتر از رگرسیون خطی است زیرا نیازی به توزیع داده ها به طور عادی یا خطی نیست. در برنامه ، هنگامی که یک روند رو به بالا وجود دارد ، 1 را برمی گرداند ، -1 وقتی روند نزولی وجود دارد و 0 در صورت عدم وجود روند. توضیحات و جزئیات بیشتر در مورد کد در اینجا
سپس با استفاده از ضریب تعیین (R^2) ، ماجراست روند را ارزیابی می کنیم. به طور پیش فرض ، مقدار Thresold self. r_square_level در Initialize. py برای گفتن اینکه این روند قابل توجه است 0. 7 است. توضیحات و جزئیات بیشتر در مورد کد در اینجا
مثالی در زیر با نقاط موجود در نمودار وجود دارد که R^2 بالاتر از 0. 7 و Man n-Kendal l-1 یا 1 است

هر زمان که ما یک تأیید روند داشته باشیم ، این برنامه سعی می کند با استفاده از تئوری موج الیوت در ماژول enter_fibo وارد بازار شود. ابتدا ، این روش حداقل و حداکثر محلی را در روند فعلی با عملکرد خود پیدا می کند. local_extremum_ (). این بررسی می کند که آیا مقادیر تعدادی از نقاط از هر طرف (پنجره) بیشتر است یا کمتر است و سپس افراط و تفریط محلی را تعیین می کند. ارزیابی یک افراط و تفریط محلی در یک سری زمانی مالی می تواند مشکل باشد ، اما این روش نتایج رضایت بخش می دهد.

سپس با استفاده از self. largest_extension () ، بزرگترین بازپرداخت را تعیین می کند ، که این تفاوت بین حداکثر محلی و حداقل محلی قبلی برای یک روند رو به پایین و تفاوت بین حداکثر محلی و حداقل محلی بعدی برای یک روند صعودی است. در مثال فوق ، بزرگترین بازگرداندن در روند نزولی ، تفاوت بین مقدار در شاخص 148 (1. 11292) منهای شاخص در شاخص 139 (1. 10818) برای نتیجه 0. 0047 خواهد بود. این مقدار نقش مهمی برای ورود و سطح خروجی دارد.
هنگامی که بزرگترین بازپرداخت تنظیم شده است ، برنامه سعی خواهد کرد با عملکرد خود به بازار وارد بازار شود.
سپس اگر سیستم قادر به ورود به بازار باشد ، از ضرر توقف خارج می شود یا سطح سود با استفاده از دوباره منطق با بزرگترین بازگرداندن (و با استفاده از تئوری موج الیوت) حاصل می شود. لطفاً برای اطلاعات بیشتر به این ماژول مراجعه کنید.
در زیر نمونه ای از 2 ورودی (خرید به رنگ سبز) و 2 خروجی (به رنگ قرمز) آورده شده است. اولی سود دارد و دیگری از دست رفته است:

مقادیر متفاوتی وجود دارد که می تواند برای استراتژی تئوری موج الیوت استفاده شود. باز هم ، لطفاً برای دیدن تمام پارامترهای بهینه سازی شده به ماژول اولیه . py مراجعه کنید. ما از مقدار پیش فرض در این ماژول برای ارزیابی پیشگویی استراتژی تجارت استفاده کردیم.
متریک مورد استفاده برای ارزیابی پیش بینی استراتژی تجارت ، نسبت شارپ است. این متداول ترین متریک است که برای ارزیابی یک استراتژی تجارت استفاده می شود. معیارهای مفید دیگری برای ارزیابی عملکرد یک استراتژی معاملاتی در اینجا وجود دارد
Sa: نسبت شارپ E: مقدار مورد انتظار ra: بازگشت دارایی rb: بازده بدون ریسک σa: انحراف استاندارد بازده بیش از حد دارایی
در زیر می توانیم نتیجه 4 دوره مختلف را قبل از بهینه سازی مشاهده کنیم.
| محدوده تاریخ از | 2015-10-15 تا 2017-04-15 |
| بازگشت سالانه | -0. 028538168293147037 |
| نوسانات سالانه | 0. 00171442062259805 |
| نسبت شارپ | -16. 6457469584778 |
| حداکثر کاهش | -0. 00586379729741346 |
| ٪ پیروزی | 0. 13636363636363635 |
| nb_trade | 22 |
| محدوده تاریخ از | 2017-04-15 تا 2018-01-15 |
| بازگشت سالانه | -0. 01604273103367482 |
| نوسانات سالانه | 0. 002918486883811172 |
| نسبت شارپ | -5. 496253059481227 |
| حداکثر کاهش | -0. 0031105801006658536 |
| ٪ پیروزی | 0.1 |
| nb_trade | 10 |
| محدوده تاریخ از | 2018-01-15 تا 2019-07-15 |
| بازگشت سالانه | -0. 02083109080647605 |
| نوسانات سالانه | 0. 0021923888737862 |
| نسبت شارپ | -9. 501549225845725 |
| حداکثر کاهش | -0. 0042445599845946265 |
| ٪ پیروزی | 0. 20689655172413793 |
| nb_trade | 29 |
| محدوده تاریخ از | 2019-07-15 تا 2020-04-15 |
| بازگشت سالانه | 0. 009637932127751991 |
| نوسانات سالانه | 0. 004822189306914451 |
| نسبت شارپ | 1. 9986631619651127 |
| حداکثر کاهش | -0. 0047235958781114 |
| ٪ پیروزی | 0. 35714285714285715 |
| nb_trade | 14 |
تنها دوره ای که این استراتژی به خوبی انجام شد ، از 2019-07-15 تا 2020-04-15 با نسبت شارپ 1. 998 بود.
قسمت 3 - در حال توسعه
روش های مختلفی برای بهینه سازی یک استراتژی معاملاتی وجود دارد ، بیشتر در اینجا. یکی از الگوریتم های بی رحمانه است که همه نامزدهای ممکن را آزمایش می کند. نقطه ضعف اصلی زمانی است که چندین نامزد وجود دارد ، به حافظه و زمان پردازش زیادی نیاز دارد.
یک راه حل خوب الگوریتم ژنتیکی است که یک الگوریتم تکاملی کلاسیک مبتنی بر تصادفی مبتنی بر نظریه چارلز داروین در مورد تکامل طبیعی است. این فرآیند ساده است: (کد در module genetic_algorithm. py)
1- جمعیت اولیه را تولید کنید
یک جمعیت از کروموزومها یا افراد داخلی تشکیل شده است (هر فرد راه حلی برای مسئله ای است که می خواهیم حل کنیم) و هر کروموزوم با مجموعه ای از پارامترهایی که می خواهیم به عنوان ژن بهینه سازی کنیم ، مشخص می شود. به طور کلی ، هر ژن با یک مقدار باینری نشان داده می شود. در مورد ما ، هر ژن یک پارتوتر است که ما می خواهیم بهینه سازی کنیم و می توانیم مقدار احتمالی را که در iRalize. py تعریف می کنیم ، بگیرد.

به طور کلی ، ما می خواهیم اندازه جمعیت 1. 5 تا 2 برابر تعداد ژن ها باشد. در مورد ما ، ما 16 پارامتر برای بهینه سازی داریم و اندازه جمعیت 25 کروموزوم است.
2- تناسب اندام را محاسبه کنید
سپس عملکرد هر کروموزوم (فردی) را با استفاده از نسبت شارپ ارزیابی می کنیم. این یک امتیاز به هر فرد می دهد.
برای در نظر گرفتن نسل بعدی ، هر کروموزوم (فردی) باید حداقل 10 معاملات را در طول دوره آموزش ایجاد کند ، در غیر این صورت رد می شود. در چنین حالتی ، یک کروموزوم جدید ایجاد می شود.
ما بهترین نامزدها را انتخاب می کنیم تا آنها بتوانند ژن های خود را به نسل های بعدی (ایجاد فرزندان) منتقل کنند. دو جفت Indidivuals (والدین) بر اساس مقدار نسبت شارپ (نمره تناسب اندام) انتخاب می شوند. افراد با نسبت شارپ بالاتر شانس بیشتری برای انتخاب برای نسل های بعدی دارند. ما از انتخاب چرخ رولت برای انتخاب افراد بالقوه بالقوه برای نسل بعدی استفاده می کنیم. این روش احتمال انتخاب فردی متناسب با ارزش تناسب اندام خود را می دهد.

4- اپراتورهای ژنتیکی
سپس با استفاده از اپراتورهای ژنتیکی جمعیت جدیدی را ایجاد می کنیم. مورد اول کپی کروموزوم ها در نسل بعدی با احتمال 30 ٪ است.

دومین اپراتور ژنتیکی متقاطع است. این مهمترین اپراتور ژنتیکی است زیرا با تبادل ژن در بین بهترین والدین (نسل قبلی) فرزندان جدیدی ایجاد می کند. این احتمال 65 ٪ اتفاق می افتد.

آخرین مورد جهش است که ژن از بهترین والدین را می چرخاند (جهش می دهد). این یک اپراتور است که از اینکه خیلی زود در یک افراط محلی گیر بیفتد ، جلوگیری می کند. احتمال زیاد برای جلوگیری از خطر نزدیک شدن فرد به یک راه حل (از نسل قبلی) خیلی زیاد نیست. این احتمال 5 ٪ از اتفاقات دارد.

مرحله 2 تا 4 را برای 25 نسل تکرار می کنیم. این مهم است که اندازه مناسبی از نسل ها را تنظیم کنید، زیرا یک نسل بسیار کوچک پوشش خوبی از فضای جستجو ارائه نمی دهد و بیش از حد بزرگ زمان بر است.
امکان دیگر توقف چرخه زمانی است که نسبت شارپ برابر یا بیشتر از 3 باشد (یا زمانی که به مقدار تناسب رضایت بخشی می رسد). در این آزمایش، الگوریتم برای 25 نسل اجرا می شود.
این آزمایش بر روی جفت ارز EUR/USD به صورت ساعتی انجام شد. دوره از 2015/10 تا 2020/04 (شامل 2 دوره آموزشی و 2 دوره آزمایشی) بود. دوره های آموزشی هر کدام 18 ماه (از 1394/10/15 تا 1396/04/15 و از 1397/01/15 تا 1398/07/15) و دوره های آزمون هر کدام 9 ماه (از 1396/04/15) بوده است. تا 2018-01-15 و از 2019-07-15 تا 2020-04-15).
نسبت شارپ برای هر دوره آموزشی بالاتر از 3 بود (که عالی است). نتایج برای دوره های آموزشی مخلوط شد. نسبت شارپ برای اولین دوره آموزش 1. 63 بود (که واقعاً خوب است) و برای دوره دوم با 0 معاملات برنده (که واقعاً بد است) -13. 99 بود.
دوره آموزشی شماره 1
| محدوده تاریخ از | 2015-10-15 تا 2017-04-15 |
| بازگشت سالانه | 0. 03579816749483067 |
| نوسانات سالانه | 0. 00996732375915114 |
| نسبت شارپ | 3. 591552593238869 |
| حداکثر کاهش | -0. 00997144631486068 |
| ٪ پیروزی | 0. 36363636363636365 |
| nb_trade | 22 |
دوره آزمایشی شماره 1
| محدوده تاریخ از | 2017-04-15 تا 2018-01-15 |
| بازگشت سالانه | 0. 014095773085682 |
| نوسانات سالانه | 0. 008626558234907 |
| نسبت شارپ | 1. 63399732568252 |
| حداکثر کاهش | -0. 005521301258917 |
| ٪ پیروزی | 0. 363636363636364 |
| nb_trade | 11 |
دوره آموزشی شماره 2
| محدوده تاریخ از | 2018-01-15 تا 2019-07-15 |
| بازگشت سالانه | 0. 009447731588671 |
| نوسانات سالانه | 0. 00287683168216 |
| نسبت شارپ | 3. 28407520233458 |
| حداکثر کاهش | -0. 000809793667447 |
| ٪ پیروزی | 0. 074074074074074 |
| nb_trade | 27 |
دوره تست شماره 2
| محدوده تاریخ از | 2019-07-15 تا 2020-04-15 |
| بازگشت سالانه | -0. 006083679046796 |
| نوسانات سالانه | 0. 000434670065322 |
| نسبت شارپ | -13. 9960846907784 |
| حداکثر کاهش | -0. 001343642756988 |
| ٪ پیروزی | 0 |
| nb_trade | 10 |
یکی از مسئله مدل در دوره های آزمایش این است که معاملات کمی ایجاد کرده است (11 برای دوره آزمایش اول و 10 برای دوره آزمایش دوم). این ممکن است به دلیل یک مدل بهینه شده بیش از حد باشد که باعث افزایش بیش از حد شده است. ما همچنین می توانیم همان مدل را بر روی دارایی های مختلف و بازه های زمانی مختلف آزمایش کنیم.
همچنین، این یک مدل پایه از نظریه موج الیوت است. همچنین می توانیم با اصلاحات فیبوناچی وارد بازار شویم و با استفاده از پسوندهای فیبوناچی از بازار خارج شویم.
در باره
فارکس وکسب درامد...
ما را در سایت فارکس وکسب درامد دنبال می کنید
برچسب :
نویسنده : احمد قانع پور
بازدید : 50
تاريخ : يکشنبه
20 فروردين
1402 ساعت: :