2 راه برای معامله RSI تصادفی در پایتون

ساخت وبلاگ

RSI تصادفی (StochRSI) به طور منظم برای شناسایی مناطقی استفاده می شود که قیمت اوراق بهادار به این صورت یا آن طرف خیلی زیاد شده است. این باعث می شود که آن را برای استفاده در یک استراتژی بازگشت متوسط آماده کنید که در آن شما کم می خرید و اگر خیلی بالا بود، آن را بالا می فروشید یا آن را کوتاه می کنید، با این امید که قیمت کاهش یابد.

مانند RSI - که از آن مشتق شده است - می توان از آن برای شناسایی روندهای حرکت استفاده کرد. اندیکاتور یک نوسان ساز است که از 0 تا 100 حرکت می کند و 50 خط مرکزی است. با توجه به این تفسیر، می توانیم از حرکت های بالای 50 برای مشاهده حرکت رو به بالا و حرکت های زیر 50 برای معامله سمت کوتاه استفاده کنیم.

ما هر دوی این رویکردها را با بک آست ها در پایتون بررسی می کنیم تا بتوانید خودتان آن را تکرار کنید. اگر با StochRSI آشنایی ندارید، می توانید تمام جزئیات محاسبه شاخص را با توضیحات واضح، مثال های ریاضی و کد در اینجا بیابید.

آزمایش یک استراتژی RSI تصادفی برگردان میانگین

رایج ترین استراتژی StochRSI مبتنی بر بازگشت میانگین است. مانند RSI، StochRSI معمولاً از 80 برای نشان دادن سطوح بیش از حد خرید به صورت کوتاه و از 20 برای نشان دادن سطح فروش بیش از حد برای خرید استفاده می کند. علاوه بر این، یک دوره 14 روزه نگاه به عقب و هموارسازی معمول است. برای اهداف ما در اینجا، ما به این مقادیر استاندارد پایبند خواهیم بود.

حالا با رسیدن به کد، چند بسته استاندارد را در پایتون وارد می کنیم.

وارد کردن numpy به عنوان np واردات پانداها به عنوان pd import matplotlib. pyplot به عنوان plt واردات yfinance به عنوان yf

در مرحله بعد، ما قصد داریم یک تابع برای محاسبه شاخص خود بسازیم (از بحث رد می شویم، می توانید تمام جزئیات را در اینجا بیابید). ما آن را calcStochRSI() می نامیم و برای محاسبه RSI و نوسانگر تصادفی برای بدست آوردن نشانگر انتخابی ما به چند تابع متکی است.

def calcRSI(data, P=14): # Calculate gains and losses data['diff_close'] = data['Close'] - data['Close'].shift(1) data['gain'] = np.where(data['diff_close']>0، داده['diff_close']، 0) داده['loss'] = np. where(داده['diff_close'] P avg_gain = np. zeros(len(داده)) avg_loss = np. zeros(len(داده)) برای i، _row در enumerate(data. iterrows()): row = _row[1] if i

 

با این توابع ما فقط باید منطق استراتژی های خود را بسازیم و آماده هستیم. همچنین توجه داشته باشید که ما یک تابع کمکی به نام calcRetus داریم که می توانیم به سرعت آن را در نتیجه بک آست خود اعمال کنیم تا همه مقادیر بازگشتی خود را از آن دریافت کنیم.

زمانی که StochRSI به بالای 80 برسد، این مدل برگشت متوسط کوتاه یا فروخته می شود (بسته به ترجیح شما) و زمانی که زیر 20 است خرید می کند.

def StochRSIReversionStrategy(data, P=14, N=14, short_level=80, buy_level=20, shorts=True): ''' Buys when the StochRSI is oversold and sells when it's overbought ''' df = calcStochRSI(data, P, N) df['position'] = np.nan df['position'] = np.where(df['StochRSI']short_level, -1, df['position']) else: df['position'] = np.where(df['StochRSI']>short_level، 0، df['position']) df['position'] = df['position']. ffill(). fillna(0) retu calcRetus(df)

برای اجرای مدل خود به مقداری داده نیاز داریم. ما به لیست شرکت های موجود در S& P 500 می رویم، به طور تصادفی یکی از آنها را نمونه گیری می کنیم، داده هایمان را با استفاده از کتابخانه yfinance دریافت می کنیم، سپس آن را از طریق مدل خود اجرا می کنیم.

table = pd. read_html( 'https://en. wikipedia. org/wiki/List_of_S%26P_500_companies') df = table[0] syms = df['Symbol'] # نمونه نمادها ticker = np. random. choice(symsمقادیر, end=end) data. drop(['Open', 'High', 'Low', 'Volume', 'Dividends', 'Stock Splits'], inplace=True, axis=1) # اجرای تست df_rev = StochRSIReversionStrategy(data. copy()) # Plot results color = plt. rcParams['axes. prop_cycle']. by_key()['color'] fig, ax = plt. subplots(2, figsize=(12, 8)) ax[0]. plot(df_rev['strat_cum_retus']*100, label='Mean Reversion') ax[0]. plot(df_rev['cum_retus']*100, label='Buy and Hold') ax[0]. set_ylabel('بازگشت (%)') ax[0]. set_title('بازده تجمعی برای بازگشت میانگین و' + f' استراتژی های خرید و نگهداری برای ') ax[0]. legend(bbox_to_anchor=[1, 0. 6])ax[1]. plot(df_rev['StochRSI'], label='StochRSI', linewidth=0. 5) ax[1]. plot(df_rev['RSI'], label='RSI', linewidth=1) ax[1]. axhline(80، label='بیش از خرید، color=colors[1], linestyle=':') ax[1]. axhline(20, label='Over Bought', color=colors[2], linestyle=':') ax[1]. axhline(50, label='Centerline', color='k', linestyle=':') ax[1]. set_ylabel('Stochastic RSI') ax[1]. set_xlabel('Date') ax[1]. set_title(f'Stochastic RSI for ') ax[1]. legend(bbox_to_anchor=[1, 0. 75]) plt. tight_layout() plt. show()

bsx-stochrsi-mean-reversion-plot1.png

استراتژی برگشت متوسط، استراتژی خرید و نگه داشتن Boston Scientific را با بازدهی 28 برابری در مقابل 2 برابری در دوره 21 ساله ای که مورد بررسی قرار دادیم، از بین می برد.

در نمودار دوم، StochRSI و سطوح کلیدی خود را نشان می دهیم. من همچنین RSI را برای مقایسه با StochRSI اضافه کردم که بسیار فرار است. این منجر به معاملات مکرر می شود که اگر حساب کوچکی با هزینه های تراکنش نسبتاً بالا داشته باشید، می تواند بر بازده واقعی شما تأثیر بگذارد. ما فقط این را روی یک ابزار اجرا می کنیم، بنابراین با 443 معامله پایان می دهیم، یا هر 12 روز یک بار معامله می کنیم، که چندان زیاد به نظر نمی رسد. با این حال، اگر بخواهیم سبد مناسبی از ابزارها را با این اندیکاتور مدیریت کنیم و به طور مکرر این معامله را انجام دهیم، می توانیم روزانه چندین معامله را وارد و خارج کنیم و هزینه های تراکنش قابل توجه باشد.

البته، همه اینها به سیستم واقعی و کارگزار شما بستگی دارد، بنابراین ممکن است در مورد خاص شما نگرانی عمده ای نباشد.

# get trades diff = df_rev ['موقعیت']. diff (). dropna () trade_idx = diff. index [np. where (diff! = 0)] شکل ، ax = plt. subplots (1 ، شکل = (12 ، 12 ، 12 ، 12 ،8)) ax. plot (df_rev ['close'] ، linewidth = 1 ، label = f '') ax. scatter (trade_idx ، df_rev. loc [trade_idx] ['close'] ، c = colors [1] ، نشانگر= '^' ، label = 'trade') ax. set_ylabel ('price') ax. set_title (نمودار قیمت f 'و معاملات " +" stochrsi میانگین استراتژی برگشت ") Ax. legend () plt. show ()

bsx-stochrsi-mean-reversion-trade-plot1.png

برای بررسی برخی از معیارهای اصلی برای استراتژی کلی ، بیایید از عملکرد زیر GetStratStats استفاده کنیم.

def getStratStats (log_retus: pd. series ، Risk_free_rate: float = 0. 02): stats =<># آمار بازده کل ['tot_retus'] = np. exp (log_retus. sum ()) - 1 # میانگین آمار بازده سالانه ['سالانه_ retus'] = np. exp (log_retus. mean () * 252) - 1 # عدم صدا سالانهآمار ['Aual_Volatility'] = log_retus. std () * np. sqrt (252) # نسبت Sortino سالانه_ downside = log_retus. loc [log_retus

استفاده از آن در استراتژی ما و مبنای خرید و نگهدارنده:

rev_stats = getStratStats (df_rev ['strat_log_retus']) bh_stats = getStratStats (df_rev ['log_retus']) pd. concat ([pd. dataframe (rev_stats ، index = ['میانگین Reversion']) ، pd. dataframe (= ['خرید و نگه داشتن'])]])

bsx-stochrsi-mean-reversion-stats-table1.png

در اینجا می بینیم که 28 برابر این استراتژی را با همان نوسانات سالانه زیربنایی بازگرداند. علاوه بر این ، ما بازده های تنظیم شده بسیار بهتری داریم ، همانطور که با نسبت های Sortino و Sharpe اندازه گیری می شود.

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

RSI تصادفی و حرکت

استراتژی پایه دیگری که قبلاً به آن اشاره کردیم استفاده از Stochrsi به عنوان یک شاخص حرکت است. هنگامی که نشانگر از خط وسط عبور می کند (stochrsi = 50) ، ما سهام را بر اساس جهت آن خریداری می کنیم یا کوتاه می کنیم.

def StochRSIMomentumStrategy(data, P=14, N=14, centerline=50, shorts=True): ''' Buys when the StochRSI moves above the centerline, sells when it moves below ''' df = calcStochRSI(data, P, N) df['position'] = np.nan df['position'] = np.where(df['StochRSI']>50 ، 1 ، df ['موقعیت']) اگر شورت: df ['موقعیت'] = np. where (df ['stochrsi']

پشتی ما را اجرا می کنیم:

# آزمایش آزمایش df_mom = stochrsimomentumstrategy (data. copy ()) # نتیجه نتایج رنگ = plt. rcparams ['axes. prop_cycle']. by_key () ['color'] fIG ، ax = plt. subplots (2 ، figsize = (2 ، figsize = ()12.) AX [0] . set_ylabel ("بازده (٪)") AX [0] . Set_Title ("بازده تجمعی برای حرکت و" + F "استراتژی های خرید و نگه داشتن") AX [0]. LEGEND (BBOX_TO_ANCHOR = [1، 0. 6]) AX [1] . plot (df_mom ['stochrsi'] ، label = 'stochrsi' ، linewidth = 0. 5) ax [1] . plot (df_mom ['rsi'] ، label = 'rsi' ، linewidth =1) AX [1] . AXHLINE (50 ، برچسب = 'Centerline' ، Color = 'K' ، Linestyle = ':') AX [1] . Set_Ylabel ('Stochastic RSI') AX [1] . Set_Xlabel ("تاریخ') AX [1] . Set_Title (f'Stochastic RSI for') AX [1]

bsx-stochrsi-momentum-plot1.png

در این حالت ، استراتژی حرکت ما کاملاً ضعیف عمل کرد و تقریباً تمام سرمایه گذاری های اولیه ما را در دوره زمانی فرضی از دست داد.

با نگاهی به آمار استراتژی ما ، این مدل چیز مفیدی را ارائه نمی دهد.

mom_stats = getStratStats (df_mom ['strat_log_retus']) pd. concat ([pd. dataframe (mom_stats ، index ، ['momentum "]) ، pd. dataframe (rev_stats ، index =' index = revversion ']) ، pd. dataframeframe(bh_stats ، index = ['خرید و نگه داشتن'])]]

bsx-stochrsi-momentum-stats-table1.png

این بدان معنا نیست که RSI تصادفی برای این نوع کاربرد مناسب نیست. این ممکن است با شاخص ها یا فیلترهای اضافی که می توانند برای بهبود نتایج ما ترکیب شوند ، بهتر کار کند. یا شاید تنظیم پارامترها کمی نتیجه بهتری به شما بدهد.

ساخت یک سیستم

تجارت سخت است.

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

هیچ فرمول ، شاخص یا سیستمی جادویی وجود ندارد که بتوانید در تجارت سودآور باشید. در این بازی کار سختی و نظم و انضباط لازم را انجام می دهد.

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

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

نسخه ی نمایشی رایگان ما را امتحان کنید تا اولین ربات تجارت خود را شروع کنید و امروز اطلاعات بیشتری کسب کنید.

آموزش مقدماتی فارکس...
ما را در سایت آموزش مقدماتی فارکس دنبال می کنید

برچسب : نویسنده : علیرام نورایی بازدید : <-PostHit-> تاريخ : چهارشنبه 15 شهريور 1402 ساعت: 16:35