بعضی اوقات ، ممکن است ایده های دیوانه وار داشته باشید و می خواهید استراتژی تجارت خود را آزمایش کنید. با استفاده از داده های بازار تاریخی برای پشتکار ، می توانید ریسک ، سود و اندازه گیری عملکرد را ارزیابی کنید تا اعتماد به نفس برای استفاده از استراتژی تجارت در آینده کسب کنید. البته اگر یک برنامه نویس ماهر باشید ، مشکلی ندارید. با این حال ، شما باید یک برنامه پیچیده و سنگین را بنویسید تا پس از بازیابی داده ها ، تجزیه و تحلیل داده ها را انجام دهید. با توجه به قابلیت های قدرتمند Elasticsearch در جستجوی ، تجزیه و تحلیل داده ها و یادگیری ماشین ، ارزش دارد یک سری مقاله را در مورد Backtestearch Elasticsearch برای مراجعه به مرجع خود بنویسید.
در مقاله قبلی من ، RSI BB یا RSI & BB؟آسان ، بیایید آن را با Elasticsearch آزمایش کنیم ، ما نحوه استفاده از Elasticsearch را برای اجرای شاخص شاخص قدرت نسبی (RSI) معرفی کرده ایم. در این مقاله به یک ابزار ساده برای حمایت از استراتژی تجارت RSI در Elasticsearch ادامه خواهد یافت. از آنجا که بیشتر کارها در خوشه Elasticsearch انجام می شود ، مشتری بار کاری سنگین نخواهد داشت. Elasticsearch سیگنال های خرید یا فروش را ارائه می دهد و سپس آنها را با یک برنامه ساده پایتون برای تجزیه و تحلیل بیشتر سیگنال ها و تولید گزارش ادغام می کند. به خوانندگان توصیه می شود تا برای درک RSI و جزئیات اجرای استفاده از Elasticsearch ، به مقاله قبلی من نگاهی بیندازند.
RSI یک نشانگر حرکت است که اطلاعاتی در مورد تغییرات قیمت در فرصت های پشتیبانی برای خرید و فروش دارایی ارائه می دهد. تغییرات قیمت به دو نوع داده تبدیل می شود ، کل دستاوردهای اخیر و کل خسارات اخیر ، معمولاً با یک دوره 14. معادله RSI را می توان به شرح زیر نوشت ، جایی که SMA سود ، N ، 1 و SMA ، N ، n، 1 کل میانگین متحرک اخیر دستاوردها و کل میانگین متحرک اخیر تلفات است. مطابق با عملکرد SMA Elasticsearch با پنجره N ، باید 1 داده را به سمت راست تغییر دهد تا داده های فعلی را درج کند.
در اینجا ، ما یک استراتژی متقاطع RSI ساده را ارائه می دهیم و از Elasticsearch برای نشان دادن جزئیات اجرای استفاده می کنیم.
◆ Assuming that it is restricted to buy and hold 1 share at a time, no transaction will occur until the held share is sold. ◆ Buy 1 share when RSI value ◆ Sell 1 share when RSI value>= 70. ◆ در پایان دوره آزمایش ، یک سهم نگهدارنده با قیمت فعلی پول می گیرد.
4 نقطه آبی و 10 نقطه قرمز وجود دارد ، اما فقط دو معاملات خرید و دو فروش بر اساس استراتژی مجاز است. بیایید اجرای را با استفاده از Elasticsearch شرح دهیم. فرض کنید یک شاخص Elasticsearch وجود دارد که دارای داده ها است ، و نقشه برداری داده های آن همان چیزی است که در مقاله قبلی شرح داده شده است. مراحل زیر کد بدنه درخواست API REST را نشان می دهد.
کلیه اسناد مربوطه را از طریق عملیات جستجو جمع آوری کنید
برای جمع آوری اسناد با نماد FDEV و تاریخ بین 2021-01-15 و 2021-05-31 از یک پرس و جو "BOOL" با یک بند "باید" استفاده کنید. با توجه به محاسبه میانگین در حال حرکت 14 روز تجارت ، داده های اضافی برای 1 ماه تنظیم می شود (از 12-12-12 تا 2020 تا 2021-14-14).
"پرس و جو": "bool": "باید": [[>>, > ] > >,
ارزش نزدیک صندوق را استخراج کنید
از یک جمع "date_histogram" ، به نام backtest_rsi ، با پارامتر "فیلد" به عنوان "تاریخ" و پارامتر "فاصله" به عنوان "1D" استفاده کنید تا قیمت صندوق را هر روز استخراج کنید. پس از آن ، یک جمع "متوسط" ، به نام روزانه ، برای بازیابی قیمت بسته شدن از آنجا که تجمع خط لوله بعدی نمی تواند به طور مستقیم از زمینه های سند استفاده کند.
"Aggs": "backtest_rsi": "date_histogram": "فیلد": "تاریخ" ،"فاصله": "1d" ،"قالب": "yyyy-mm-dd">, "Aggs": "Daily": "AVG":>,
تاریخ سطل را استخراج کنید
به دلیل داده های اضافی ، عملیات بعدی باید بعداً قسمت خارج از حد را فیلتر کنند. تجمع "حداقل" به نام "Datest" به دست آوردن تاریخ سطل است. در سرور Elasticsearch ، قسمت Date در زمان EPOCH ذخیره می شود. واحد زمانی میلی ثانیه است و منطقه زمانی UTC است.
"Datest": "min":>,
سطل ها را با بیش از 1 سند انتخاب کنید
برای فیلتر کردن سطل های خالی (روزهای غیر تدارک) ، یک جمع "سطل_ لیست" ، به نام SD Daily ، برای انتخاب سطل با تعداد اسناد آن بیشتر از 0 استفاده می شود.
"sdaily": "bucket_selector": "buckets_path": ،"script": "params.count>0> >,
از یک جمع "مشتق" ، به نام Price_Diff استفاده کنید و از پارامتر "Buckets_Path" استفاده کنید تا مقدار بسته شدن روزانه را برای محاسبه تفاوت از مقدار قبلی مشخص کنید.
"Price_diff": "مشتق": "Buckets_Path": "روزانه"> >,
تعیین مقدار روزانه یک سود یا ضرر نسبت به داده های قبلی است
از دو جمع "bucket_script" استفاده کنید ، به نام افزایش و از دست دادن ، و از پارامتر "buckets_path" برای تعیین نتیجه تجمع متفاوت برای تعیین مقدار استفاده کنید. هر دو مقدار مثبت هستند.
"به دست آوردن": "bucket_script": "سطل_پات": ،"script": "(params.Price_Diff>0)؟params. price_diff: 0 "> >, "ضرر": "bucket_script": "Buckets_Path": ،"اسکریپت": "(params. price_diff<0) ? -params.Price_Diff : 0"> >,
میانگین حرکت ساده روزانه از کل سود و از دست دادن کل را محاسبه کنید
از دو تجمع "Moving_FN" ، به نام Gainsma و Lisssma استفاده کنید ، با پنجره پارامتر به عنوان 14 و پارامتر "Buckets_Path" به ترتیب افزایش و ضرر. پارامتر "Shift" روی 1 تنظیم شده است تا داده ها را برای روز جاری و 13 روز معاملات گذشته درج کند. SMA با استفاده از عملکرد متوسط بدون وزنی (movefunctions. unweightedavg) محاسبه می شود.
"Gainsma": "Moveing_fn": "Script": "MoveFunctions. Unweightedavg (مقادیر)" ، "پنجره": 14 ، "Buckets_Path": "Gain" ، "Shift": 1> >, "Losssma": "Moveing_fn": "Script": "MovingFunctions. UnweightEdavg (مقادیر)" ، "پنجره": 14 ، "Buckets_Path": "Loss" ، "Shift": 1> >,
برای مشخص کردن نتایج حاصل از Gainsma و Lissma ، از یک جمع "Bucket_script" به نام RSI استفاده کنید. سپس شاخص RSI با توجه به معادله در فیلمنامه محاسبه می شود.
"RSI": "Bucket_script": "Buckets_Path": ،"اسکریپت": "100 - 100/(1+params. gainsma/params. losssma)"> >,
نوع مقدار RSI را مشخص کنید
Use a “bucket_script” aggregation named, RSI_Type, with the parameter “buckets_path” to specify the RSI value to determine the type. Set the type to 2 if RSI value>= 70. اگر مقدار RSI نوع را روی 1 تنظیم کنید
"RSI_Type": "bucket_script": "buckets_path": , "script": "params.RSI>= 70 ? 2 : params.RSI> >,
اسناد اضافی را برای خروجی فیلتر کنید
Use a “bucket_selector” aggregation, named Buy_Sell_Signal, with the parameter “buckets_path” to specify “DateStr” and “RSI_Type” to select the correct buckets. The selection criteria are those buckets having the date on or after 2021 01 15 (the epoch time 1612137600000 in milliseconds) and RSI_Type = 1 (RSI>= 70) یا rsi_type = 2 (RSI
"buy_sell_signal": "bucket_selector": "uckets_path": ،"script": "params.DateStr>= 1610697600000l && (params. rsi_type == 1 || params. rsi_type == 2) "> >
پس از جمع آوری نتایج ، می توانیم ارقام را همانطور که قبلاً نشان داده شده است ترسیم کنیم.
نتیجه اجرای ، سیگنال های خرید یا فروش را منتشر می کند. با این حال ، این سیگنال ها فقط موارد دوم و سوم استراتژی تجارت RSI ما را برآورده می کنند. برای موارد اول و چهارم ، برای کدگذاری برنامه باید از زبان برنامه نویسی پایتون استفاده کنیم. این برنامه شامل چهار بخش است.
◆ دو پارامتر خط فرمان را بخوانید. یکی برای نماد انتخاب شده انتخاب شده است ، و دیگری برای نام پرونده حاوی استراتژی معاملاتی نوشته شده در Elasticsearch REST API Body Body با استفاده از فرمت JSON.◆ داده ها را از سرور Elasticsearch دریافت کنید.◆ داده های پاسخ را تجزیه کنید و سیگنال خرید و فروش را اصلاح کنید.◆ آمار Backtest را گزارش دهید.
عملکرد اصلی به شرح زیر نشان داده شده است:
def main (argv):inputfile ، نماد = get_opt (argv)resp = get_data (inputfile ، نماد)معاملات = parse_data (resp)گزارش (معاملات)
در این مقاله ، فقط بخش کد برای پالایش سیگنال خرید و فروش نشان داده شده است. خوانندگان می توانند بیشتر به پروژه منبع باز در GitHub (backtest_rsi) مراجعه کنند. برای اطمینان از اینکه یک سهم در یک زمان خریداری و نگهداری می شود و قبل از فروش سهام نگهدارنده هیچ معامله ای رخ نمی دهد ، ما از متغیر Boolean "Hold" استفاده می کنیم تا اطمینان حاصل شود که معامله شرایط زیر را برآورده می کند.
◆ هنگامی که پرچم نگهدارنده کاذب است ، از سیگنال خرید تقدیر می شود ◆ سیگنال فروش در هنگام صحیح بودن پرچم مورد تقدیر قرار می گیرد
تابع parse_data () در زیر نشان داده شده است. سرانجام ، آرایه معامله حاوی سیگنال معتبر خواهد بود.
# داده های پاسخ را تجزیه کنید و سیگنال خرید/فروش را اصلاح کنیدdef parse_data (resp):نتیجه = json. loads (resp)تجمع = نتیجه ['جمع بندی]]اگر تجمع و "backtest_rsi" در جمع:backtest_rsi = تجمع ['backtest_rsi'] معاملات = []Hold = Falseاگر backtest_rsi و "سطل" در backtest_rsi:برای سطل در backtest_rsi ['سطل']:معامله =<> معامله ['تاریخ'] = سطل ['key_as_string']معامله ['Daily'] = سطل ['Daily'] ['Value']# سیگنال افتخار خرید اگر هیچ سهم وجود ندارداگر سطل ['rsi_type'] ['مقدار'] == 1 و نگه ندارید:معامله ['buy_or_sell'] = 'خرید'نگه داشتن = درست# سیگنال فروش افتخار در صورت وجود سهم سهامسطل elif ['rsi_type'] ['مقدار'] == 2 و نگه دارید:معامله ['buy_or_sell'] = 'فروش'Hold = False# برای سایر شرایط ، فقط عمل را انجام دهیددیگری:معامله ['buy_or_sell'] = 'Hold'معاملات. برنامه (معامله) معاملات بازگشت
برنامه پایتون آماری در مورد استراتژی معاملاتی از جمله "پیروزی" و "از دست دادن" کل معامله خرید و فروش به شرح زیر ارائه می دهد:
تعداد خرید: 2تعداد فروش: 2تعداد برد: 2تعداد باخت: 0سود کل: 2. 02سود/معامله: 1. 01حداکثر قیمت خرید: 27. 20درصد سود: 7. 42 ٪
در جدول زیر تمام داده های آماری 11 ETF به طور تصادفی انتخاب شده با استفاده از استراتژی معاملات متقاطع RSI از 2021-01-15 تا 2021-05-31 جمع آوری شده است. نتایج نشان می دهد که این دوره یک دوره خوب برای تجارت است زیرا تمام نمادهای منتخب می توانند سود داشته باشند. با این حال ، براساس توصیه های اکثر معامله گران از یک شاخص واحد برای تجارت استفاده نکنید.
اظهارات: I. با تشکر از IEX (مبادله سرمایه گذاران) ارائه داده های ETF و GitHub که ذخیره پروژه منبع باز را فراهم می کند. ii. این مقاله مبتنی بر یک فکر فنی است و هیچ مشاوره سرمایه گذاری را تشکیل نمی دهد. خوانندگان باید هنگام استفاده از آن مسئولیت های خود را بر عهده بگیرند. iiiهنوز ممکن است در مقاله خطایی داشته باشد و من از خوانندگان می خواهم که مرا اصلاح کنند. IVآن دسته از خوانندگانی که احساس علاقه می کنند می توانند به کتاب نویسنده نویسنده برای مهارت های اساسی Elasticsearch مراجعه کنند."پیشرفته Elasticsearch 7. 0" ، آگوست 2019 ، PACKT ، ISBN: 9781789957754.
سیگنال های تجاری...
ما را در سایت سیگنال های تجاری دنبال می کنید
برچسب :
نویسنده : عبدالله بوتیمار
بازدید : <-PostHit->
تاريخ : دوشنبه
9 مرداد
1402 ساعت: 13:18