تجارت الگوریتمی با شاخص قدرت نسبی در پایتون

ساخت وبلاگ

یاد بگیرید که با محبوب ترین نشانگر تجارت در پایتون معاملات بهتری انجام دهید

در حالی که نوسان سازهای شرکتی دیگری مانند نوسان ساز تصادفی و نوسان ساز عالی نیز وجود دارند ، موردی که امروز در مورد آن صحبت خواهیم کرد ، محبوب ترین در بین معامله گران و یک مورد عالی برای معامله گران مبتدی است. این کسی نیست جز شاخص قدرت نسبی ، که به زودی به عنوان RSI شناخته می شود. در این مقاله ، ما برخی از شهودهای اساسی در مورد RSI و محاسبه آن ایجاد خواهیم کرد ، بنابراین ، ما این شاخص را از ابتدا ایجاد خواهیم کرد و یک استراتژی تجاری را بر اساس آن در پایتون می سازیم. بدون آزار و اذیت بیشتر ، اجازه دهید وارد مقاله شویم.

قبل از ادامه کار ، اگر می خواهید استراتژی های معاملاتی خود را بدون هیچ گونه برنامه نویسی پشت سر بگذارید ، راه حلی برای آن وجود دارد. این backtestzone است. این یک بستر برای پشتوانه هر تعداد استراتژی معاملاتی در انواع مختلف دارایی های قابل تجارت به صورت رایگان و بدون برنامه نویسی است. می توانید بلافاصله با استفاده از پیوند در اینجا از ابزار استفاده کنید: https://www. backtestzone. com/

شاخص قدرت نسبی (RSI)

قبل از حرکت ، ابتدا می توانیم درک کنیم که یک نوسان ساز در فضای تجارت سهام چیست. نوسان ساز ابزاری فنی است که یک نشانگر مبتنی بر روند را ایجاد می کند که مقادیر آن بین یک باند بالا و پایین محدود است. معامله گران از این گروهها به همراه نشانگر مبتنی بر روند ساخته شده برای شناسایی وضعیت بازار و ایجاد معاملات بالقوه خرید و فروش استفاده می کنند. همچنین ، نوسان سازها به طور گسترده ای برای اهداف تجاری کوتاه مدت مورد استفاده قرار می گیرند اما هیچ محدودیتی در استفاده از آنها برای سرمایه گذاری های بلند مدت وجود ندارد.

در سال 1978 توسط J. Welles Wilder تأسیس و توسعه یافته است ، شاخص قدرت نسبی یک نوسان ساز حرکت است که توسط بازرگانان برای شناسایی اینکه آیا بازار در وضعیت بیش از حد یا بیش از حد قرار دارد ، استفاده می شود. قبل از ادامه کار ، بیایید بررسی کنیم که بیش از حد و بیش از حد است. هنگامی که یک دارایی دائماً توسط معامله گران خریداری می شود و آن را به یک روند بسیار صعودی منتقل می کند و به ادغام می پردازد ، بازار در حالت بیش از حد در نظر گرفته می شود. به همین ترتیب ، هنگامی که یک دارایی دائماً توسط معامله گران حرکت می کند که آن را به یک روند نزولی منتقل می کنند و تمایل به عقب نشینی دارند ، یک بازار در وضعیت فراوان در نظر گرفته می شود.

به عنوان یک نوسان ساز ، مقادیر RSI بین 0 تا 100 محدود می شود. روش سنتی برای ارزیابی وضعیت بازار با استفاده از شاخص قدرت نسبی این است که یک خواندن RSI از 70 یا بالاتر ، وضعیت بیش از حد و به طور مشابه ، خواندن RSI 30 را نشان می دهدیا در زیر نشان می دهد که بازار در حالت Oversold قرار دارد. این بیش از حد و بیش از حد می تواند در مورد اینکه کدام سهام یا دارایی را انتخاب می کنید نیز تنظیم شود. به عنوان مثال ، برخی از دارایی ها ممکن است خوانش RSI ثابت از 80 و 20 داشته باشند. بنابراین در این حالت ، می توانید سطح بیش از حد و بیش از حد را به ترتیب 80 و 20 تنظیم کنید. تنظیم استاندارد RSI 14 به عنوان دوره بازگشت است.

RSI ممکن است از نظر تفسیر ارزش شبیه به نوسان ساز تصادفی باشد اما نحوه محاسبه آن کاملاً متفاوت است. سه مرحله در محاسبه RSI وجود دارد.

  • محاسبه میانگین متحرک نمایی (EMA) از افزایش و از دست دادن دارایی: یک کلمه در میانگین متحرک نمایی. EMA نوعی میانگین در حال حرکت (MA) است که به طور خودکار وزن بیشتری را (چیزی جز اهمیت) به جدیدترین نقطه داده و وزن کمتری به نقاط داده در گذشته های دور اختصاص می دهد. در این مرحله ، ابتدا بازده دارایی را محاسبه می کنیم و سود را از ضررها جدا می کنیم. با استفاده از این مقادیر جدا شده ، دو EMA برای تعداد مشخصی از دوره ها محاسبه می شوند.
  • محاسبه استحکام نسبی یک دارایی: قدرت نسبی یک دارایی با تقسیم میانگین متحرک نمایی سود یک دارایی از میانگین متحرک نمایی از دست دادن یک دارایی برای تعداد مشخصی از دوره ها تعیین می شود. این می تواند از نظر ریاضی به شرح زیر باشد:
RS = کسب EMA / Loss EMAجایی که،RS = قدرت نسبیبه دست بیاورید ema = میانگین متحرک نمایی سودضرر ema = میانگین متحرک نمایی ضرر
  • محاسبه مقادیر RSI: در این مرحله ، ما خود RSI را با استفاده از مقادیر مقاومت نسبی که در مرحله قبل محاسبه کردیم محاسبه خواهیم کرد. برای محاسبه مقادیر RSI یک دارایی معین برای تعداد مشخصی از دوره ها ، یک فرمول وجود دارد که باید از آنها پیروی کنیم:
RSI = 100. 0 - (100. 0 / (1. 0 + RS))جایی که،RSI = شاخص قدرت نسبیRS = قدرت نسبی

اکنون که ما درک اساسی از شاخص قدرت نسبی و چگونگی محاسبه آن داریم. بیایید برخی از شهودها را در مورد استراتژی تجارت RSI خود بسازیم.

درباره استراتژی معاملاتی RSI ما: در این مقاله ، ما قصد داریم یک استراتژی متقاطع ساده را با تنظیم سنتی 30 و 70 به ترتیب به عنوان سطح بیش از حد و بیش از حد و با 14 به عنوان دوره بازپرداخت اجرا کنیم. استراتژی ما هر زمان که مقدار RSI قبلی بالاتر از سطح Oversold باشد ، یک سیگنال خرید را نشان می دهد و مقدار RSI فعلی از زیر سطح بیش از حد عبور می کند. به همین ترتیب ، این استراتژی هر زمان که مقدار RSI قبلی زیر سطح Oversold باشد ، یک سیگنال فروش را نشان می دهد و مقدار RSI فعلی از سطح بیش از حد عبور می کند. استراتژی معاملاتی ما را می توان به شرح زیر نشان داد:

اگرPREVIOUS RSI>30 وRSI فعلی<30 ==> سیگنال بخریداگرRSI قبلی<70 AND CURRENT RSI> 70 ==> فروش سیگنال

این نتیجه تئوری ما در مورد شاخص قدرت نسبی و استراتژی تجارت ما است. بیایید اکنون استراتژی معاملاتی خود را در پایتون کد کنیم تا نتایج مهیج را ببینیم. قبل از حرکت ، یادداشتی در مورد سلب مسئولیت: تنها هدف این مقاله آموزش مردم است و باید به عنوان یک قطعه اطلاعاتی در نظر گرفته شود اما نه به عنوان مشاوره سرمایه گذاری یا همینطور.

اجرای در پایتون

قسمت برنامه نویسی به شرح زیر به مراحل مختلف طبقه بندی می شود:

1. واردات بسته ها2. استخراج داده ها از Alpha Vantage3. محاسبه RSI4. طرح RSI5- ایجاد استراتژی تجارت6. ترسیم لیست های معاملاتی7. ایجاد موقعیت ما8. پشتی

ما سفارش ذکر شده در لیست بالا را دنبال خواهیم کرد و کمربندهای صندلی خود را جمع می کنیم تا هر قسمت برنامه نویسی آینده را دنبال کنید.

مرحله 1: وارد کردن بسته ها

وارد کردن بسته های مورد نیاز به محیط پایتون یک گام غیر قابل قبول است. بسته های اصلی قرار است پاندا برای کار با داده ها ، Numpy برای کار با آرایه ها و برای توابع پیچیده ، Matplotlib برای ترسیم اهداف و درخواست هایی برای برقراری تماس API باشد. بسته های ثانویه برای کارکردهای ریاضی و Termcolor برای سفارشی سازی قلم (اختیاری) ریاضی خواهند بود.

اجرای پایتون:

واردات پاندا به عنوان PDوارد کردن matplotlib. pyplot به عنوان pltدرخواست های وارداتوارد کردن numpy به عنوان npاز طبقه واردات ریاضیاز Termcolor وارد شده به عنوان clplt. style. use ('fivethirtyeight')plt. rcparams ['figure. figsize'] = (20 ، 10)

اکنون که همه بسته های اساسی را به محیط پایتون وارد کرده ایم. بیایید با کشیدن داده های تاریخی IBM با API قدرتمند Alpha Vantage استفاده کنیم.

مرحله 2: استخراج داده ها از Alpha Vantage

در این مرحله ، ما قصد داریم داده های تاریخی IBM را با استفاده از نقطه پایانی API تهیه شده توسط Alpha Vantage بکشیم. قبل از آن ، یادداشتی در مورد Alpha Vantage: Alpha Vantage API های سهام رایگان را ارائه می دهد که از طریق آن کاربران می توانند به طیف گسترده ای از داده ها مانند به روزرسانی های زمان واقعی و داده های تاریخی در مورد سهام ، ارزها و ارزهای رمزنگاری دسترسی پیدا کنند. اطمینان حاصل کنید که یک حساب کاربری در مورد Alpha Vantage دارید ، فقط در این صورت ، می توانید به کلید API مخفی خود دسترسی پیدا کنید (یک عنصر مهم برای کشیدن داده ها با استفاده از API).

اجرای پایتون:

def get_historical_data (نماد ، start_date = هیچ):api_key = باز (r'api_key. txt ')api_url = f'https: //www. alphavantage. co/query؟ function = time_series_daily_adusted & symbol = & apikey = & outputSize = کامل 'raw_df = درخواست. get (api_url) . json ()df = pd. dataframe (raw_df [سری f'Time (روزانه) ']). tdf = df. rename (ستون =)برای من در df. columns:df [i] = df [i] . astype (شناور)df. index = pd. to_datetime (df. index)df = df. iloc [::-1] . drop (['7. مقدار سود سهام' ، '8. ضریب تقسیم'] ، محور = 1)اگر start_date:df = df[df.index>= start_date]بازگشت DFIBM = get_historical_data ('IBM' ، '2020-01-01')IBM

خروجی:

توضیح کد: اولین کاری که ما انجام دادیم تعریف تابعی به نام "get_historical_data" است که نماد سهام ("نماد") را به عنوان یک پارامتر مورد نیاز و تاریخ شروع داده های تاریخی ("start_date") به عنوان یک پارامتر اختیاری می برد. در داخل عملکرد ، ما کلید API و URL را تعریف می کنیم و آنها را در متغیر مربوطه ذخیره می کنیم. در مرحله بعد ، ما داده های تاریخی را در قالب JSON با استفاده از عملکرد "دریافت" استخراج می کنیم و آن را در متغیر "RAW_DF" ذخیره می کنیم. پس از انجام برخی فرآیندها برای تمیز کردن و قالب بندی داده های RAW JSON ، ما آن را به صورت یک DataFrame Clean Pandas Dataframe باز می گردانیم. سرانجام ، ما در حال استفاده از عملکرد ایجاد شده برای کشیدن داده های تاریخی IBM از شروع سال 2020 هستیم و آن را در متغیر "IBM" ذخیره کردیم.

مرحله 3: محاسبه RSI

در این مرحله ، ما می خواهیم مقادیر RSI را با 14 به عنوان دوره بازگشت با استفاده از فرمول RSI که قبلاً در مورد آن بحث کردیم محاسبه کنیم.

اجرای پایتون:

def get_rsi (نزدیک ، جستجو):ret = close. diff ()بالا = []پایین = []برای من در محدوده (LEN (RET)):اگر ret [i]<0:up. append (0)down. append (ret [i])دیگری:up. append (ret [i])down. append (0)up_series = pd. series (UP)down_series = pd. series (پایین) . ABS ()up_ewm = up_series. ewm (com = lookback - 1 ، تنظیم = false) . mean ()down_ewm = down_series. ewm (com = lookback - 1 ، تنظیم = false) . mean ()rs = up_ewm/down_ewmRSI = 100 - (100 / (1 + RS))rsi_df = pd. dataframe (rsi) . rename (ستون ها =) . set_index (close. index)rsi_df = rsi_df. dropna ()RSI_DF را برگردانید [3:]IBM ['rsi_14'] = get_rsi (ibm ['close'] ، 14)IBM = ibm. dropna ()IBM

خروجی:

توضیح کد: اولا ، ما تابعی به نام "get_rsi" را تعریف می کنیم که قیمت بسته شدن سهام ("نزدیک") و دوره بازگشت ("بازگشت به عقب") را به عنوان پارامترها می گیرد. در داخل تابع ، ما ابتدا بازده سهام را با استفاده از عملکرد "تفاوت" ارائه شده توسط بسته Pandas محاسبه می کنیم و آن را در متغیر "RET" ذخیره می کنیم. این عملکرد اساساً مقدار فعلی را از مقدار قبلی کم می کند. در مرحله بعد ، ما در حال عبور از متغیر "RET" هستیم تا سود حاصل از ضررها را تشخیص دهیم و آن مقادیر را به متغیر مربوطه ("بالا" یا "پایین") اضافه کنیم.

سپس ، ما با استفاده از عملکرد "EWM" ارائه شده توسط بسته Pandas ، میانگین های متحرک نمایی را برای "بالا" و "پایین" محاسبه می کنیم و آنها را به ترتیب در متغیر "up_ewm" و "down_ewm" ذخیره می کنیم. با استفاده از این EMA های محاسبه شده ، ما با پیروی از فرمولی که قبلاً در مورد آن بحث کردیم ، قدرت نسبی را تعیین می کنیم و آن را در متغیر "RS" ذخیره می کنیم.

با استفاده از مقادیر مقاومت نسبی محاسبه شده ، ما با پیروی از فرمول آن ، مقادیر RSI را محاسبه می کنیم. پس از انجام برخی از پردازش ها و دستکاری داده ها ، ما مقادیر شاخص قدرت نسبی محاسبه شده را به شکل یک DataFrame Pandas باز می گردانیم. سرانجام ، ما برای ذخیره مقادیر RSI IBM با 14 به عنوان دوره بازگشت ، از عملکرد ایجاد شده استفاده می کنیم.

مرحله 4: طرح RSI

در این مرحله ، ما می خواهیم مقادیر شاخص قدرت نسبی محاسبه شده IBM را ترسیم کنیم تا بیشتر از آن حس کنیم. هدف اصلی این قسمت در بخش برنامه نویسی نیست بلکه در عوض مشاهده طرح برای به دست آوردن درک محکم از RSI است.

اجرای پایتون:

ax1 = plt. subplot2grid ((10،1) ، (0،0) ، ردیف = 4 ، colspan = 1)ax2 = plt. subplot2grid ((10،1) ، (5،0) ، ردیف = 4 ، colspan = 1)ax1. plot (ibm ['close'] ، linewidth = 2. 5)ax1. set_title ('IBM نزدیک قیمت')ax2. plot (ibm ['rsi_14'] ، رنگ = 'نارنجی' ، خط عرض = 2. 5)ax2. axhline (30 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')ax2. axhline (70 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')ax2. set_title ("شاخص قدرت نسبی IBM")plt. show ()

خروجی:

نمودار فوق به دو صفحه تقسیم می شود: پانل فوق با قیمت بسته شدن IBM و پانل پایین با مقادیر RSI 14 محاسبه شده از IBM. در حالی که تجزیه و تحلیل پانل ترسیم شده با مقادیر RSI ، می توان دریافت که روند و حرکت مقادیر محاسبه شده همان قیمت بسته شدن IBM را دنبال می کند. بنابراین ، می توانیم در نظر بگیریم که RSI یک شاخص جهت دار است. برخی از شاخص ها به این معنی هستند که حرکت آنها به طور معکوس با حرکت واقعی سهام متناسب خواهد بود و این گاهی اوقات می تواند معامله گران را گیج کند و درک آن نیز سخت باشد.

در حالی که نمودار RSI را مشاهده می کنیم ، می توانیم ببینیم که نقشه RSI حتی قبل از بازار ، واژگونی روند را نشان می دهد. به عبارت ساده ، RSI قبل از انجام بازار واقعی ، روند نزولی یا صعودی را نشان می دهد. این نشان می دهد که RSI یک شاخص اصلی است. یک شاخص پیشرو چیزی نیست جز شاخصی که مقدار فعلی یک سری داده را برای پیش بینی حرکات آینده در نظر می گیرد. RSI که یک شاخص اصلی است ، به هشدار دادن به معامله گران در مورد برگشت احتمالی روند قبل از زمان کمک می کند. برعکس شاخص های پیشرو ، شاخص های تاخیر نامیده می شود. شاخص های تاخیر شاخص هایی هستند که با در نظر گرفتن مقادیر تاریخی یک سری داده ، ارزش فعلی را نشان می دهند.

مرحله 5: ایجاد استراتژی تجارت

در این مرحله ، ما قصد داریم استراتژی تجارت شاخص قدرت نسبی مورد بحث را در پایتون اجرا کنیم.

اجرای پایتون:

def defical_rsi_strategy (قیمت ، RSI):buy_price = []sell_price = []rsi_signal = []سیگنال = 0 برای من در محدوده (LEN (RSI)):if rsi[i-1]>30 و RSI [i]<30:اگر سیگنال! = 1:buy_price. append (قیمت [i])sell_price. append (np. nan)سیگنال = 1rsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)rsi_signal. append (0)الیف RSI [I-1]<70 and rsi[i]>70:اگر سیگنال! = -1:buy_price. append (np. nan)sell_price. append (قیمت [i])سیگنال = -1rsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)rsi_signal. append (0)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)rsi_signal. append (0) بازگشت buy_price ، sell_price ، rsi_signalbuy_price ، sell_price ، rsi_signal = اجرای_rsi_strategy (ibm ['close'] ، ibm ['rsi_14'])

توضیح کد: اول ، ما تابعی به نام "پیاده سازی_RSI_Strategy" را تعریف می کنیم که قیمت سهام ("قیمت") و مقادیر RSI ("RSI") را به عنوان پارامترها می گیرد.

در داخل عملکرد ، ما در حال ایجاد سه لیست خالی (buy_price ، sell_price و rsi_signal) هستیم که در آن مقادیر هنگام ایجاد استراتژی تجارت ضمیمه می شوند.

پس از آن ، ما استراتژی تجارت را از طریق یک حلقه برای اجرای آن اجرا می کنیم. در داخل حلقه ، ما شرایط خاصی را پشت سر می گذاریم و اگر شرایط راضی باشد ، مقادیر مربوطه به لیست های خالی اضافه می شود. اگر شرط خرید سهام برآورده شود ، قیمت خرید به لیست "buy_price" اضافه می شود و ارزش سیگنال به عنوان 1 نماینده برای خرید سهام ضمیمه می شود. به همین ترتیب ، اگر شرط فروش سهام برآورده شود ، قیمت فروش به لیست "sell_price" اضافه می شود و ارزش سیگنال به عنوا ن-1 نماینده برای فروش سهام ضمیمه می شود.

سرانجام ، ما لیست های ضمیمه شده با مقادیر را برمی گردانیم. سپس ، ما در حال استفاده از عملکرد ایجاد شده و مقادیر را در متغیرهای مربوطه آنها ذخیره می کنیم. این لیست معنی ندارد مگر اینکه مقادیر را ترسیم کنیم. بنابراین ، بیایید مقادیر لیست های تجاری ایجاد شده را ترسیم کنیم.

مرحله 6: ترسیم سیگنال های معاملاتی

در این مرحله ، ما می خواهیم لیست های تجاری ایجاد شده را ترسیم کنیم تا از آنها معنا پیدا کنیم.

اجرای پایتون:

ax1 = plt. subplot2grid ((10،1) ، (0،0) ، ردیف = 4 ، colspan = 1)ax2 = plt. subplot2grid ((10،1) ، (5،0) ، ردیف = 4 ، colspan = 1)ax1. plot (ibm ['close'] ، linewidth = 2. 5 ، color = 'skyblue' ، label = 'ibm')ax1. plot (ibm. index ، buy_price ، marker = '^' ، markersize = 10 ، color = 'green' ، label = 'buy signal')ax1. plot (ibm. index ، sell_price ، marker = 'v' ، markersize = 10 ، color = 'r' ، label = 'فروش سیگنال')ax1. set_title ('سیگنال های تجارت IBM RSI')ax2. plot (ibm ['rsi_14'] ، رنگ = 'نارنجی' ، خط عرض = 2. 5)ax2. axhline (30 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')ax2. axhline (70 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')plt. show ()

خروجی:

توضیح کد: ما در حال ترسیم مقادیر نسبی شاخص نسبی به همراه سیگنال های خرید و فروش تولید شده توسط استراتژی تجارت هستیم. ما می توانیم مشاهده کنیم که هر زمان که خط RSI از بالا به پایین باند پایین یا سطح Oversold عبور کند ، یک سیگنال خرید به رنگ سبز در نمودار ترسیم می شود. به طور مشابه ، خط RSI از پایین به بالای باند فوقانی یا سطح بیش از حد عبور می کند ، یک سیگنال فروش با رنگ قرمز در نمودار ترسیم می شود.

مرحله 7: ایجاد موقعیت ما

در این مرحله ، ما قصد داریم لیستی را ایجاد کنیم که اگر سهام را در اختیار نداریم یا سهام خود را نگه نداریم ، 1 را نشان می دهد.

اجرای پایتون:

موقعیت = []برای من در محدوده (len (rsi_signal)):if rsi_signal[i]>1:Position. Append (0)دیگری:Position. Append (1)برای من در محدوده (len (ibm ['close'])):اگر rsi_signal [i] == 1:موقعیت [i] = 1elif rsi_signal [i] == -1:موقعیت [i] = 0دیگری:موقعیت [i] = موقعیت [i-1]RSI = IBM ['RSI_14']close_price = ibm ['close']rsi_signal = pd. dataframe (rsi_signal)موقعیت = pd. dataframe (موقعیت)قاب = [close_price ، rsi ، rsi_signal ، موقعیت]استراتژی = pd. concat (فریم ، پیوستن به = 'درونی' ، محور = 1)استراتژی.

خروجی:

توضیح کد: اول ، ما یک لیست خالی به نام "موقعیت" ایجاد می کنیم. ما در حال عبور از دو حلقه برای ما هستیم ، یکی این است که مقادیر لیست "موقعیت" را تولید کنیم تا فقط با طول لیست "سیگنال" مطابقت داشته باشد. حلقه دیگر موردی است که ما برای تولید مقادیر موقعیت واقعی از آن استفاده می کنیم. در داخل حلقه دوم ، ما در مورد مقادیر لیست "سیگنال" تکرار می شویم و مقادیر لیست "موقعیت" در مورد اینکه چه شرایط راضی می شود ، ضمیمه می شوند. اگر سهام خود را نگه داریم یا اگر سهام خود را نداشته باشیم یا سهام خود را نداریم ، مقدار موقعیت 1 باقی مانده است. سرانجام ، ما در حال انجام برخی از دستکاری های داده برای ترکیب همه لیست های ایجاد شده در یک DataFrame هستیم.

از خروجی که نشان داده می شود ، می بینیم که در ردیف اول موقعیت ما در سهام 1 باقی مانده است (از آنجا که هیچ تغییری در سیگنال RSI وجود ندارد) اما موقعیت ما به طور ناگهانی به 0 تبدیل شد زیرا ما وقتی سهام را فروختیم ، سهام را فروختیمسیگنال معاملات شاخص قدرت نشان دهنده یک سیگنال فروش (-1) است. موقعیت ما تا زمانی که برخی از تغییرات در سیگنال معاملاتی رخ دهد ، 0 باقی خواهد ماند. اکنون زمان آن رسیده است که برخی از مراحل پشتی را اجرا کنیم!

مرحله 8: پشتی

قبل از حرکت ، ضروری است بدانید که پشتی چیست. Backtesting فرایندی است که می بینیم استراتژی معاملاتی ما در داده های سهام داده شده چگونه انجام داده است. در مورد ما ، ما قصد داریم یک فرآیند پشتی برای استراتژی تجارت شاخص قدرت نسبی خود را بر روی داده های سهام IBM اجرا کنیم.

اجرای پایتون:

ibm_ret = pd. dataframe (np. diff (ibm ['close']). تغییر نام (ستون ها =)rsi_strategy_ret = []برای من در محدوده (len (ibm_ret)):بازگشت = ibm_ret ['بازگشت]] [i]*استراتژی [' rsi_position '] [i]rsi_strategy_ret. append (بازگشت)rsi_strategy_ret_df = pd. dataframe (rsi_strategy_ret) . rename (ستون ها =)Investment_value = 100000number_of_stocks = طبقه (سرمایه گذاری_ value/ibm ['Close'] [-1])rsi_investment_ret = []برای من در محدوده (len (rsi_strategy_ret_df ['rsi_retus']))):بازگشت = number_of_stocks*rsi_strategy_ret_df ['rsi_retus'] [i]rsi_investment_ret. append (بازده)rsi_investment_ret_df = pd. dataframe (rsi_investment_ret) . rename (ستون ها =)total_investment_ret = دور (جمع (rsi_investment_ret_df ['investion_retus']) ، 2)profit_percentage = طبقه ((total_investment_ret/investment_value)*100)چاپ (CL ("سود حاصل از استراتژی RSI با سرمایه گذاری 100K دلار در IBM:<>'چاپ (CL ("درصد سود استراتژی RSI:<>٪ '. قالب (profit_percentage) ، attrs = [' bold ']))

خروجی:

سود حاصل از استراتژی RSI با سرمایه گذاری 100K دلار در IBM: 21132. 23درصد سود استراتژی RSI: 21 ٪

توضیح کد: اول ، ما بازده سهام IBM را با استفاده از عملکرد "Diff" ارائه شده توسط بسته NUMPY محاسبه می کنیم و ما آن را به عنوان یک DataFrame در متغیر "IBM_RET" ذخیره کرده ایم. در مرحله بعد ، ما برای محاسبه بازده هایی که از استراتژی تجارت شاخص قدرت نسبی خود بدست آوردیم ، یک حلقه را برای تکرار در مقادیر متغیر "IBM_RET" می گذرانیم و این مقادیر بازده به لیست "RSI_STRATEGETY_RET" اضافه می شود. در مرحله بعد ، ما لیست "rsi_strategy_ret" را به یک dataframe تبدیل می کنیم و آن را در متغیر "rsi_strategy_ret_df" ذخیره می کنیم.

مرحله بعدی روند پشتی می آید. ما می خواهیم با سرمایه گذاری صد هزار دلار در استراتژی تجارت خود ، استراتژی خود را پشت سر بگذاریم. بنابراین ابتدا ، ما میزان سرمایه گذاری را در متغیر "سرمایه گذاری_ ولت" ذخیره می کنیم. پس از آن ، ما تعداد سهام IBM را که می توانیم با استفاده از مبلغ سرمایه گذاری خریداری کنیم ، محاسبه می کنیم. می توانید توجه داشته باشید که من از عملکرد "کف" ارائه شده توسط بسته ریاضی استفاده کرده ام ، زیرا ، ضمن تقسیم مبلغ سرمایه گذاری با قیمت بسته شدن سهام IBM ، با تعداد اعشاری خروجی را می دهد. تعداد سهام باید یک عدد صحیح باشد اما تعداد اعشاری نیست. با استفاده از عملکرد "کف" ، می توانیم اعشار را برش دهیم. به یاد داشته باشید که عملکرد "کف" پیچیده تر از عملکرد "دور" است. سپس ، ما برای یافتن بازده سرمایه گذاری و به دنبال آن برخی از وظایف دستکاری داده ها ، یک حلقه را می گذرانیم.

سرانجام ، ما در حال چاپ کل بازدهی هستیم که با سرمایه گذاری یک صد هزار نفر در استراتژی تجارت خود دریافت کرده ایم و مشخص می شود که ما سود تقریبی بیست و یک هزار دلار با درصد سود بیست و یک درصد در یک سال کسب کرده ایم. عالیه!

افکار نهایی!

پس از راه طولانی برای خرد کردن هر دو نظریه و پیاده سازی های عملی ، ما با موفقیت آموخته ایم که RSI چیست و چگونه می توان یک استراتژی تجاری مبتنی بر RSI را در پایتون اجرا و پشتوانه کرد. حتی اگر RSI یکی از محبوب ترین شاخص های تجاری باشد ، مستعد آشکار کردن سیگنال های کاذب است. پیروی از سیگنال های دروغین و انجام معاملات بر اساس آن ، منجر به تخلیه سرمایه می شود. خوشبختانه ، دو راه برای دور نگه داشتن خود از سیگنال های دروغین وجود دارد:

  • شاخص اضافی: برخی از سهام ممکن است نوسان زیادی داشته باشد و به طور مکرر سطح بیش از حد و سطح بیش از حد را لمس می کند. در این حالت ، شما نباید کورکورانه از سطح RSI پیروی کنید تا معاملات خود را انجام دهید ، اما باید یک شاخص فنی دیگر برای تأیید سیگنال در نظر بگیرید که آیا این یک معتبر است یا خیر.
  • بداهه نوازی استراتژی: استراتژی ما در این مقاله یکی از اساسی ترین استراتژی ها است اما کارهای زیادی وجود دارد که می توان با کمک RSI انجام داد. بنابراین ، بسیار توصیه می شود که قبل از غواصی مستقیم در بازار واقعی ، به برخی از استراتژی های تجاری دیگر که مبتنی بر شاخص قدرت نسبی هستند ، نگاهی بیندازید.

در این مقاله ، ما هر دو مرحله را پوشش ندادیم زیرا هدف اصلی این مقاله فقط آموزش افراد در مورد درک یکی از مهمترین شاخص های معاملاتی اما کسب سود یا همینطور نیست. یک نکته دیگر وجود دارد که باید هنگام استفاده از RSI به یاد داشته باشید. شاخص قدرت نسبی تمایل به عملکرد ضعیف در بازارهای مختلف دارد. بازارهای مختلفی بازارهایی هستند که نشان دهنده حرکت کم یا بدون آن هستند. بنابراین ، بسیار توصیه می شود ضمن استفاده از شاخص قدرت نسبی ، از بازارها دور شوید.

با این گفته ، شما به پایان مقاله رسیده اید. اگر فراموش کردید که از هر یک از قطعات برنامه نویسی پیروی کنید ، نگران نباشید. من منبع کامل را در پایان مقاله ارائه داده ام. امیدوارم چیز جدیدی و مفید یاد گرفته باشید.

کد کامل:

واردات پاندا به عنوان PDوارد کردن matplotlib. pyplot به عنوان pltدرخواست های وارداتوارد کردن numpy به عنوان npاز طبقه واردات ریاضیاز Termcolor وارد شده به عنوان clplt. style. use ('fivethirtyeight')plt. rcparams ['figure. figsize'] = (20 ، 10)def get_historical_data (نماد ، start_date = هیچ):api_key = باز (r'api_key. txt ')api_url = f'https: //www. alphavantage. co/query؟ function = time_series_daily_adusted & symbol = & apikey = & outputSize = کامل 'raw_df = درخواست. get (api_url) . json ()df = pd. dataframe (raw_df [سری f'Time (روزانه) ']). tdf = df. rename (ستون =)برای من در df. columns:df [i] = df [i] . astype (شناور)df. index = pd. to_datetime (df. index)df = df. iloc [::-1] . drop (['7. مقدار سود سهام' ، '8. ضریب تقسیم'] ، محور = 1)اگر start_date:df = df[df.index>= start_date]بازگشت DFIBM = get_historical_data ('IBM' ، '2020-01-01')چاپ (IBM)def get_rsi (نزدیک ، جستجو):ret = close. diff ()بالا = []پایین = []برای من در محدوده (LEN (RET)):اگر ret [i]<0:up. append (0)down. append (ret [i])دیگری:up. append (ret [i])down. append (0)up_series = pd. series (UP)down_series = pd. series (پایین) . ABS ()up_ewm = up_series. ewm (com = lookback - 1 ، تنظیم = false) . mean ()down_ewm = down_series. ewm (com = lookback - 1 ، تنظیم = false) . mean ()rs = up_ewm/down_ewmRSI = 100 - (100 / (1 + RS))rsi_df = pd. dataframe (rsi) . rename (ستون ها =) . set_index (close. index)rsi_df = rsi_df. dropna ()RSI_DF را برگردانید [3:]IBM ['rsi_14'] = get_rsi (ibm ['close'] ، 14)IBM = ibm. dropna ()چاپ (IBM)ax1 = plt. subplot2grid ((10،1) ، (0،0) ، ردیف = 4 ، colspan = 1)ax2 = plt. subplot2grid ((10،1) ، (5،0) ، ردیف = 4 ، colspan = 1)ax1. plot (ibm ['close'] ، linewidth = 2. 5)ax1. set_title ('IBM نزدیک قیمت')ax2. plot (ibm ['rsi_14'] ، رنگ = 'نارنجی' ، خط عرض = 2. 5)ax2. axhline (30 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')ax2. axhline (70 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')ax2. set_title ("شاخص قدرت نسبی IBM")plt. show ()def defical_rsi_strategy (قیمت ، RSI):buy_price = []sell_price = []rsi_signal = []سیگنال = 0 برای من در محدوده (LEN (RSI)):if rsi[i-1]>30 و RSI [i]<30:اگر سیگنال! = 1:buy_price. append (قیمت [i])sell_price. append (np. nan)سیگنال = 1rsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)rsi_signal. append (0)الیف RSI [I-1]<70 and rsi[i]>70:اگر سیگنال! = -1:buy_price. append (np. nan)sell_price. append (قیمت [i])سیگنال = -1rsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)rsi_signal. append (0)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)rsi_signal. append (0) بازگشت buy_price ، sell_price ، rsi_signalbuy_price ، sell_price ، rsi_signal = اجرای_rsi_strategy (ibm ['close'] ، ibm ['rsi_14'])ax1 = plt. subplot2grid ((10،1) ، (0،0) ، ردیف = 4 ، colspan = 1)ax2 = plt. subplot2grid ((10،1) ، (5،0) ، ردیف = 4 ، colspan = 1)ax1. plot (ibm ['close'] ، linewidth = 2. 5 ، color = 'skyblue' ، label = 'ibm')ax1. plot (ibm. index ، buy_price ، marker = '^' ، markersize = 10 ، color = 'green' ، label = 'buy signal')ax1. plot (ibm. index ، sell_price ، marker = 'v' ، markersize = 10 ، color = 'r' ، label = 'فروش سیگنال')ax1. set_title ('سیگنال های تجارت IBM RSI')ax2. plot (ibm ['rsi_14'] ، رنگ = 'نارنجی' ، خط عرض = 2. 5)ax2. axhline (30 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')ax2. axhline (70 ، linestyle = '-' ، linewidth = 1. 5 ، color = 'grey')plt. show ()موقعیت = []برای من در محدوده (len (rsi_signal)):if rsi_signal[i]>1:Position. Append (0)دیگری:Position. Append (1)برای من در محدوده (len (ibm ['close'])):اگر rsi_signal [i] == 1:موقعیت [i] = 1elif rsi_signal [i] == -1:موقعیت [i] = 0دیگری:موقعیت [i] = موقعیت [i-1]RSI = IBM ['RSI_14']close_price = ibm ['close']rsi_signal = pd. dataframe (rsi_signal)موقعیت = pd. dataframe (موقعیت)قاب = [close_price ، rsi ، rsi_signal ، موقعیت]استراتژی = pd. concat (فریم ، پیوستن به = 'درونی' ، محور = 1)print(strategy. head())ibm_ret = pd. dataframe (np. diff (ibm ['close']). تغییر نام (ستون ها =)rsi_strategy_ret = []برای من در محدوده (len (ibm_ret)):بازگشت = ibm_ret ['بازگشت]] [i]*استراتژی [' rsi_position '] [i]rsi_strategy_ret. append (بازگشت)rsi_strategy_ret_df = pd. dataframe (rsi_strategy_ret) . rename (ستون ها =)Investment_value = 100000number_of_stocks = طبقه (سرمایه گذاری_ value/ibm ['Close'] [-1])rsi_investment_ret = []برای من در محدوده (len (rsi_strategy_ret_df ['rsi_retus']))):بازگشت = number_of_stocks*rsi_strategy_ret_df ['rsi_retus'] [i]rsi_investment_ret. append (بازده)rsi_investment_ret_df = pd. dataframe (rsi_investment_ret) . rename (ستون ها =)total_investment_ret = دور (جمع (rsi_investment_ret_df ['investion_retus']) ، 2)profit_percentage = طبقه ((total_investment_ret/investment_value)*100)چاپ (CL ("سود حاصل از استراتژی RSI با سرمایه گذاری 100K دلار در IBM:<>'چاپ (CL ("درصد سود استراتژی RSI:<>٪ '. قالب (profit_percentage) ، attrs = [' bold ']))
آموزش تحلیل گری...
ما را در سایت آموزش تحلیل گری دنبال می کنید

برچسب : نویسنده : ملیکا زارعی بازدید : 35 تاريخ : سه شنبه 3 مرداد 1402 ساعت: 19:14