تجارت الگوریتمی با ویلیامز ٪ R در پایتون

ساخت وبلاگ

یاد بگیرید که یک استراتژی تجارت قاتل را با یک شاخص فنی قدرتمند در پایتون بسازید

معرفی

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

در این مقاله ، ما قصد داریم بررسی کنیم که ویلیامز ٪ R چیست ، ریاضی در پشت این شاخص و اینکه چگونه می توان یک استراتژی تجاری بر اساس آن را با کمک پایتون ساخته شد. به عنوان یک مرحله جایزه ، ما بازده بازده استراتژی Williams ٪ R را با بازده SPY ETF (ETF که به طور خاص برای ردیابی حرکت شاخص S& P 500 طراحی شده است) مقایسه خواهیم کرد تا ایده ای در مورد عملکرد استراتژی ما در این زمینه بدست آوریم. بازار واقعی و می تواند گامی برای ارزیابی استراتژی در نظر گرفته شود. با توجه به کنجکاوی خود ، اجازه دهید وارد مقاله شویم!

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

ویلیامز ٪ r

ویلیامز ٪ R که توسط لری ویلیامز تأسیس شده است ، یک شاخص حرکت است که مقادیر آن بین 0 ت ا-100 نوسان می کند. این شاخص بیشتر شبیه به نوسان ساز تصادفی است اما در محاسبه آن متفاوت است. معامله گران از این شاخص برای مشخص کردن نقاط ورود و خروج بالقوه برای معاملات با ساخت دو سطح بیش از حد و بیش از حد استفاده می کنند. قبل از جابجایی یک کلمه در مورد سطح بیش از حد و سطح بیش از حد: گفته می شود که وقتی روند بازار بسیار صعودی و محدود به ادغام است ، یک سهام بیش از حد مورد استفاده قرار می گیرد. به همین ترتیب ، هنگامی که روند بازار بسیار نزولی است و تمایل به گزاف گویی دارد ، یک سهام به یک منطقه فراز و نشیب می رسد. آستانه سنتی برای سطح بیش از حد و سطح بیش از حد به ترتیب 20 و 80 است اما هیچ ممنوعیتی در مصرف ارزش های دیگر نیز وجود ندارد.

به منظور محاسبه مقادیر ویلیامز ٪ R با تنظیم سنتی 14 به عنوان دوره بازگشت ، اول ، بالاترین میزان بالا و کمترین میزان برای هر دوره در طی یک بازه زمانی چهارده روز تعیین می شود. سپس ، این دو تفاوت گرفته می شود: قیمت بسته شدن از بالاترین بالا و کمترین میزان از بالاترین سطح بالا. سرانجام ، تفاوت اول با اختلاف دوم و چند برابر ب ا-100 تقسیم می شود تا مقادیر ویلیامز ٪ r را بدست آورد. محاسبه را می توان از نظر ریاضی به شرح زیر نشان داد:

W ٪ r 14 = [H. High -C. Price] / [l. low -C. Price] * (- 100)جایی که،W ٪ R 14 = 14 روز ویلیامز ٪ R از سهامH. HIGH = 14 روز بالاترین میزان سهامL. Low = 14 روز کمترین کمترین سهامC. Price = قیمت بسته شدن سهام

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

درباره استراتژی معاملاتی ما: بسیاری از استراتژی های معاملاتی مبتنی بر R Williams ٪ R وجود دارد که می توانند در بازار جهانی واقعی اجرا شوند اما موردی که امروز می خواهیم در مورد آن بحث کنیم ، یک استراتژی مبتنی بر سطح بیش از حد و بیش از حد است. این استراتژی هر زمان که خواندن قبلی ویلیامز ٪ R زی ر-20 باشد و خواندن فعلی بالاتر ا ز-20 باشد ، سیگنال خرید را نشان می دهد. به همین ترتیب ، هر زمان که خواندن قبلی ویلیامز ٪ R بالاتر ا ز-80 باشد و خواندن فعلی زی ر-80 باشد ، سیگنال فروش ایجاد می شود. استراتژی معاملاتی ما را می توان به شرح زیر نشان داد:

اگرprev. w ٪ r<[- 20] وCURRENT.W%R> [ - 20 ] ==> سیگنال بخریداگرPREV.W%R> [ - 80] وفعلی. w ٪ r<[ - 80 ] ==> فروش سیگنال

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

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

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

1. واردات بسته ها2. استخراج داده های سهام از دوازده داده3. محاسبه ویلیامز ٪ R4- طرح نشانگر ویلیامز ٪ R5- ایجاد استراتژی تجارت6. ترسیم لیست های معاملاتی7. ایجاد موقعیت ما8. پشتی9. مقایسه ETF جاسوسی

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

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

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

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

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

اکنون که تمام بسته های مورد نیاز را به پایتون خود وارد کرده ایم. بیایید داده های تاریخی Netflix را با نقطه پایانی API دوازده داده بکشیم.

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

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

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

def get_historical_data (نماد ، start_date):api_key = 'کلید API شما'api_url = f'https: //api. twelvedata.com/time_series؟ symbol = & interment = 1day & outputSize = 5000 & apikey = 'raw_df = درخواست. get (api_url) . json ()df = pd. dataframe (raw_df ['مقادیر']). iloc [::-1] . set_index ('dateTime')df = df[df.index>= start_date]df. index = pd. to_datetime (df. index)بازگشت DFnflx = get_historical_data ('nflx' ، '2020-01-01')NFLX

خروجی:

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

مرحله 3: محاسبه ویلیامز ٪ R

در این مرحله ، ما می خواهیم مقادیر ویلیامز ٪ R را با دنبال کردن فرمولی که قبلاً در مورد آن بحث کردیم محاسبه کنیم.

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

def get_wr (بالا ، پایین ، نزدیک ، نگاه برگشتی):highh = high. rolling (lookback) . max ()lowl = low. rolling (lookback) . min ()WR = -100 * ((HighH - Close) / (HighH - Lowl))بازگشت WRnflx ['wr_14'] = get_wr (nflx ['high'] ، nflx ['low'] ، nflx ['close'] ، 14)nflx = nflx. dropna ()NFLX

خروجی:

توضیح کد: ما ابتدا تابعی به نام "GET_WR" را تعریف می کنیم که داده های قیمت بالای سهام ("بالا") ، داده های قیمت پایین ("پایین") ، داده های قیمت بسته ("نزدیک") و دوره بازگشت ("دوره ") به عنوان پارامترها. در داخل عملکرد ، ما ابتدا با کمک توابع "نورد" و "حداکثر" که توسط بسته Pandas ارائه شده و آن را در متغیر "HighH" ذخیره می کنیم ، بالاترین ارتفاع را در یک بازه زمانی خاص در جستجوی تعیین می کنیم. آنچه عملکرد "نورد" انجام می دهد این است که بازه زمانی N- دوره را که ما مشخص می کنیم در نظر می گیرد و عملکرد "حداکثر" حداکثر مقادیر موجود در DataFrame داده شده را فیلتر می کند.

در مرحله بعد ، ما در حال تعیین متغیری به نام "Lowl" برای ذخیره کمترین کمترین در یک بازه زمانی بازپرداخت مشخص شده است که ما با استفاده از عملکرد "Rolling" و "min" تعیین کردیم (همانطور که از نام پیدا می کند ، حداقل مقادیر موجود در داده های داده شده را فیلتر می کند)ارائه شده توسط بسته Pandas.

سپس ، ما بالاترین مقادیر بالا و پایین را در فرمولی که قبلاً در مورد آن بحث کردیم جایگزین می کنیم تا مقادیر ویلیامز ٪ R را محاسبه کنیم و آن را در متغیر "WR" ذخیره کنیم. سرانجام ، ما در حال بازگشت و فراخواندن عملکرد ایجاد شده برای ذخیره خوانش های ویلیامز ٪ R Netflix با 14 به عنوان دوره بازپرداخت هستیم.

مرحله 4: طرح ویلیامز ٪ r

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

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

ax1 = plt. subplot2grid ((11،1) ، (0،0) ، ردیف = 5 ، colspan = 1)ax2 = plt. subplot2grid ((11،1) ، (6،0) ، ردیف = 5 ، colspan = 1)ax1. plot (nflx ['close'] ، linewidth = 2)ax1. set_title ('قیمت بسته شدن NFLX')ax2. plot (nflx ['wr_14'] ، رنگ = 'نارنجی' ، خط عرض = 2)Ax2. Axhline (-20 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')Ax2. Axhline (-80 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')ax2. set_title ('NFLX Williams ٪ r 14')plt. show ()

خروجی:

نمودار فوق به دو صفحه تقسیم می شود: پانل فوقانی با قیمت بسته شدن داده های سهام Netflix و صفحه پایین با مقادیر خوانش 14 روزه Netflix از ویلیامز ٪ r. اکنون از نمودار می توان از دو طریق استفاده کرد. اولین راه استفاده از نمودار به عنوان ابزاری برای شناسایی ایالت های بیش از حد و بیش از حد بازار است. شما می توانید مشاهده کنید که دو خط خاکستری افقی در بالا و زیر بازار ترسیم شده است که چیزی جز سطح بیش از حد و بیش از حد در آستان ه-20 و-80 نیست. اگر ویلیامز ٪ R دارای خواندن بالاتر از خط بالا یا خط بیش از حد باشد ، می توانید در نظر بگیرید که بازار در وضعیت بیش از حد قرار دارد. به همین ترتیب ، می توانید فرض کنید که اگر ویلیامز ٪ R دارای خواندن زیر خط پایین یا خط Overlold باشد ، بازار در حالت Oversold قرار دارد.

دومین روش استفاده از ویلیامز ٪ R شناسایی حرکت کاذب در بازار است. در طی یک صعود محکم ، قرائت ویلیامز ٪ R تمایل دارد که به طور مکرر به بالای 20 برسد. اگر نشانگر سقوط کند و تلاش کند تا قبل از پاییز آینده به بالای 20 برسد ، نشان می دهد که حرکت بازار معتبر نیست و ممکن است دنبال کردن یک روند نزولی فوق العاده باشد. به همین ترتیب ، در طی یک روند نزولی سالم ، خوانش ویلیامز ٪ r به طور مکرر به زیر 80 می رود. اگر شاخص افزایش یابد و نتواند قبل از افزایش بعدی ب ه-80 برسد ، نشان می دهد که بازار قصد دارد روند مثبتی را دنبال کند.

از آنجا که ویلیامز ٪ R یک شاخص جهت دار است (شاخصی که حرکت آن به طور مستقیم با بازار واقعی متناسب است) ، معامله گران نیز از این شاخص برای یافتن و تأیید صعودهای قوی یا نزولی در یک بازار و تجارت در کنار آن استفاده می کنند. برخی از شاخص ها در حالی که برای شناسایی یا تأیید روند بازار مورد استفاده قرار نمی گیرند ، از آنجا که ممکن است در طبیعت عقب نشینی کنند (شاخصی که داده های تاریخی را برای تعیین خواندن فعلی در نظر می گیرد) استفاده زیادی نمی کند ، اما ویلیامز ٪ R یک امر مؤثر است زیرا این امر استیک شاخص پیشرو (شاخصی که نقاط داده قبلی را برای پیش بینی حرکات آینده در نظر می گیرد).

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

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

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

def defical_wr_strategy (قیمت ، WR):buy_price = []sell_price = []wr_signal = []سیگنال = 0 برای من در محدوده (LEN (WR)):if wr[i-1]>-80 و WR [i]<80:اگر سیگنال! = 1:buy_price. append (قیمت [i])sell_price. append (np. nan)سیگنال = 1WR_Signal. Append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)WR_Signal. Append (0)elif wr [i-1]<20 and wr[i]>-20:اگر سیگنال! = -1:buy_price. append (np. nan)sell_price. append (قیمت [i])سیگنال = -1WR_Signal. Append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)WR_Signal. Append (0)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)WR_Signal. Append (0) بازگرداندن buy_price ، sell_price ، wr_signalbuy_price ، sell_price ، wr_signal = پیاده سازی_ور_ استریج (nflx ['close'] ، nflx ['wr_14'])

توضیح کد: اول ، ما در حال تعریف تابعی به نام "پیاده سازی_ wr_strategy" هستیم که قیمت سهام ("قیمت") و مقادیر شاخص ویلیامز ٪ r ("WR") را به عنوان پارامترها می گیرد.

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

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

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

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

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

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

ax1 = plt. subplot2grid ((11،1) ، (0،0) ، ردیف = 5 ، colspan = 1)ax2 = plt. subplot2grid ((11،1) ، (6،0) ، ردیف = 5 ، colspan = 1)ax1. plot (nflx ['close'] ، linewidth = 2)ax1. plot (nflx. index ، buy_price ، marker = '^' ، markersize = 12 ، linewidth = 0 ، color = 'green' ، label = 'buy signal')ax1. plot (nflx. index ، sell_price ، marker = 'v' ، markersize = 12 ، linewidth = 0 ، color = 'r' ، label = 'فروش سیگنال')ax1. legend ()ax1. set_title ('سیگنال های معاملات NFLX')ax2. plot (nflx ['wr_14'] ، رنگ = 'نارنجی' ، خط عرض = 2)Ax2. Axhline (-20 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')Ax2. Axhline (-80 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')ax2. set_title ('NFLX Williams ٪ r 14')plt. show ()

خروجی:

توضیح کد: ما در حال ترسیم خواندن ویلیامز ٪ r به همراه سیگنال های خرید و فروش تولید شده توسط استراتژی تجارت هستیم. ما می توانیم مشاهده کنیم که هر زمان که خط ویلیامز ٪ R از پایین به بالاتر ا ز-20 عبور می کند و یک سیگنال خرید با رنگ سبز در نمودار ترسیم می شود. به طور مشابه ، هر زمان که خط ویلیامز ٪ R از بالا به زی ر-80 عبور می کند و یک سیگنال فروش با رنگ قرمز در نمودار ترسیم می شود.

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

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

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

موقعیت = []برای من در محدوده (len (wr_signal)):if wr_signal[i]>1:Position. Append (0)دیگری:Position. Append (1)برای من در محدوده (len (nflx ['close'])):اگر wr_signal [i] == 1:موقعیت [i] = 1elif wr_signal [i] == -1:موقعیت [i] = 0دیگری:موقعیت [i] = موقعیت [i-1]close_price = nflx ['close']WR = nflx ['WR_14']wr_signal = pd. dataframe (wr_signal) . rename (ستون ها =) . set_index (nflx. index)موقعیت = pd. dataframe (موقعیت)قاب = [close_price ، wr ، wr_signal ، موقعیت]استراتژی = pd. concat (فریم ، پیوستن به = 'درونی' ، محور = 1)استراتژی.

خروجی:

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

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

مرحله 8: پشتی

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

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

nflx_ret = pd. dataframe (np. diff (nflx ['close']). تغییر نام (ستون ها =)wr_strategy_ret = []برای من در محدوده (len (nflx_ret)):بازگشت = nflx_ret ['بازگشت'] [i]*استراتژی ['wr_position'] [i]wr_strategy_ret. append (بازگشت)wr_strategy_ret_df = pd. dataframe (wr_strategy_ret) . rename (ستون ها =)Investment_value = 100000number_of_stocks = طبقه (سرمایه گذاری_ value/nflx ['close'] [-1])wr_investment_ret = []برای من در محدوده (len (wr_strategy_ret_df ['wr_retus']))):بازگشت = number_of_stocks*wr_strategy_ret_df ['wr_retus'] [i]WR_INVESTMENT_RET. APPEND (بازگشت)wr_investment_ret_df = pd. dataframe (wr_investment_ret) . rename (ستون ها =)total_investment_ret = دور (جمع (wr_investment_ret_df ['investion_retus']) ، 2)profit_percentage = طبقه ((total_investment_ret/investment_value)*100)چاپ (CL ("سود حاصل از استراتژی W ٪ r با سرمایه گذاری 100K دلار در NFLX:<>'چاپ (CL ("درصد سود استراتژی W ٪ r:<>٪ '. قالب (profit_percentage) ، attrs = [' bold ']))

خروجی:

سود حاصل از استراتژی W ٪ r با سرمایه گذاری 100K دلار در NFLX: 57772. 45درصد سود استراتژی w ٪ r: 57 ٪

توضیح کد: اول ، ما بازده سهام Netflix را با استفاده از عملکرد "Diff" ارائه شده توسط بسته NUMPY محاسبه می کنیم و ما آن را به عنوان یک DataFrame در متغیر "NFLX_RET" ذخیره کرده ایم. در مرحله بعد ، ما برای محاسبه بازده هایی که از استراتژی معاملاتی ویلیامز ٪ R به دست آوردیم ، یک حلقه را برای تکرار در مقادیر متغیر "NFLX_RET" می گذرانیم و این مقادیر بازده به لیست "WR_Strategy_Ret" اضافه می شود. در مرحله بعد ، ما لیست "wr_strategy_ret" را به یک dataframe تبدیل می کنیم و آن را در متغیر "wr_strategy_ret_df" ذخیره می کنیم.

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

سرانجام ، ما با سرمایه گذاری صد هزار نفر در استراتژی تجارت خود ، بازده کل را که بدست آورده ایم چاپ می کنیم و مشخص می شود که ما در یک سال سود تقریبی پنجاه و هفت هزار دلار کسب کرده ایم. این بد نیست! اکنون ، بیایید بازده خود را با SPY ETF (ETF طراحی شده برای ردیابی شاخص بازار سهام S& P 500) مقایسه کنیم.

مرحله 9: مقایسه ETF جاسوسی

این مرحله اختیاری است اما بسیار توصیه می شود زیرا می توانیم ایده ای از عملکرد استراتژی تجارت ما در برابر معیار (ETF جاسوسی) داشته باشیم. در این مرحله ، ما قصد داریم داده های ETF SPY را با استفاده از عملکرد "get_historical_data" که ما ایجاد کردیم استخراج کنیم و بازده هایی را که از جاسوسی ETF دریافت می کنیم با استراتژی معاملات ویلیامز ٪ R در Netflix بازگردانیم.

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

def get_benchmark (start_date ، سرمایه گذاری_ value):جاسوسی = get_historical_data ("جاسوسی" ، start_date) ['Close']معیار = pd. dataframe (np. diff (جاسوسی)). تغییر نام (ستون =) Investment_Value = سرمایه گذاری_والnumber_of_stocks = طبقه (سرمایه گذاری_و وارو/جاسوسی [-1])Benchmark_investment_ret = [] برای من در محدوده (لن (معیار ['benchmark_retus'])):بازگشت = number_of_stocks*معیار ['benchmark_retus'] [i]Benchmark_investment_ret. Append (بازده) Benchmark_investment_ret_df = pd. dataframe (benchmark_investment_ret) . rename (ستون ها =)بازگشت معیار_ investment_ret_dfمعیار = get_benchmark ('' 2020-01-01 '، 100000)Investment_value = 100000total_benchmark_investment_ret = دور (جمع (معیار ['سرمایه گذاری_ retus']) ، 2)Benchmark_profit_percentage = طبقه ((total_benchmark_investment_ret/investment_value)*100)چاپ (CL ('سود معیار با سرمایه گذاری 100K دلار:<>'چاپ (CL ('درصد سود معیار:<>format.چاپ (cl ('w ٪ r سود استراتژی است<>٪ بالاتر از معیار سود.

خروجی:

سود معیار با سرمایه گذاری 100K دلار: 22431. 5درصد سود معیار: 22 ٪W ٪ R استراتژی سود 35 ٪ بیشتر از سود معیار است

توضیح کد: کد مورد استفاده در این مرحله تقریباً شبیه به موردی است که در مرحله قبلی پشتی استفاده می شود ، اما به جای سرمایه گذاری در Netflix ، ما با اجرای هیچ استراتژی تجاری در ETF در حال سرمایه گذاری هستیم. از بازده ، می بینیم که استراتژی معاملاتی ویلیامز ٪ R ما 35 درصد از ETF جاسوسی بهتر شده است. عالیه!

افکار نهایی!

پس از یک فرآیند طولانی برای خرد کردن هر دو تئوری و برنامه نویسی در ویلیامز ٪ R ، ما با موفقیت یک استراتژی تجاری سودآور را ایجاد کرده ایم که بیش از بازده ETF جاسوسی است. این عالی است اما ، این کافی نیستهنگامی که من یک فرایند پشتی جداگانه را برای به دست آوردن بینش بیشتر در مورد عملکرد استراتژی تجارت خود اجرا کردم ، فهمیدم که بازده استراتژی مبتنی بر R ویلیامز ٪ ما کمتر از بازده واقعی سهام Netflix است. مهمترین دلیل این امر ممکن است بهینه سازی استراتژی باشد.

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

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

کد کامل:

واردات پاندا به عنوان PDوارد کردن numpy به عنوان npدرخواست های وارداتوارد کردن matplotlib. pyplot به عنوان pltاز طبقه واردات ریاضیاز Termcolor وارد شده به عنوان clplt. rcparams ['figure. figsize'] = (20،10)plt. style. use ('fivethirtyeight')def get_historical_data (نماد ، start_date):api_key = 'کلید API شما'api_url = f'https: //api. twelvedata.com/time_series؟ symbol = & interment = 1day & outputSize = 5000 & apikey = 'raw_df = درخواست. get (api_url) . json ()df = pd. dataframe (raw_df ['مقادیر']). iloc [::-1] . set_index ('dateTime')df = df[df.index>= start_date]df. index = pd. to_datetime (df. index)بازگشت DFnflx = get_historical_data ('nflx' ، '2020-01-01')چاپ (NFLX)def get_wr (بالا ، پایین ، نزدیک ، نگاه برگشتی):highh = high. rolling (lookback) . max ()lowl = low. rolling (lookback) . min ()WR = -100 * ((HighH - Close) / (HighH - Lowl))بازگشت WRnflx ['wr_14'] = get_wr (nflx ['high'] ، nflx ['low'] ، nflx ['close'] ، 14)nflx = nflx. dropna ()پین (NFLX)ax1 = plt. subplot2grid ((11،1) ، (0،0) ، ردیف = 5 ، colspan = 1)ax2 = plt. subplot2grid ((11،1) ، (6،0) ، ردیف = 5 ، colspan = 1)ax1. plot (nflx ['close'] ، linewidth = 2)ax1. set_title ('قیمت بسته شدن NFLX')ax2. plot (nflx ['wr_14'] ، رنگ = 'نارنجی' ، خط عرض = 2)Ax2. Axhline (-20 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')Ax2. Axhline (-80 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')ax2. set_title ('NFLX Williams ٪ r 14')plt. show ()def defical_wr_strategy (قیمت ، WR):buy_price = []sell_price = []wr_signal = []سیگنال = 0 برای من در محدوده (LEN (WR)):if wr[i-1]>-80 و WR [i]<80:اگر سیگنال! = 1:buy_price. append (قیمت [i])sell_price. append (np. nan)سیگنال = 1WR_Signal. Append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)WR_Signal. Append (0)elif wr [i-1]<20 and wr[i]>-20:اگر سیگنال! = -1:buy_price. append (np. nan)sell_price. append (قیمت [i])سیگنال = -1WR_Signal. Append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)WR_Signal. Append (0)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)WR_Signal. Append (0) بازگرداندن buy_price ، sell_price ، wr_signalbuy_price ، sell_price ، wr_signal = پیاده سازی_ور_ استریج (nflx ['close'] ، nflx ['wr_14'])ax1 = plt. subplot2grid ((11،1) ، (0،0) ، ردیف = 5 ، colspan = 1)ax2 = plt. subplot2grid ((11،1) ، (6،0) ، ردیف = 5 ، colspan = 1)ax1. plot (nflx ['close'] ، linewidth = 2)ax1. plot (nflx. index ، buy_price ، marker = '^' ، markersize = 12 ، linewidth = 0 ، color = 'green' ، label = 'buy signal')ax1. plot (nflx. index ، sell_price ، marker = 'v' ، markersize = 12 ، linewidth = 0 ، color = 'r' ، label = 'فروش سیگنال')ax1. legend ()ax1. set_title ('سیگنال های معاملات NFLX')ax2. plot (nflx ['wr_14'] ، رنگ = 'نارنجی' ، خط عرض = 2)Ax2. Axhline (-20 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')Ax2. Axhline (-80 ، LineWidth = 1. 5 ، linestyle = '-' ، Color = 'Grey')ax2. set_title ('NFLX Williams ٪ r 14')plt. show ()موقعیت = []برای من در محدوده (len (wr_signal)):if wr_signal[i]>1:Position. Append (0)دیگری:Position. Append (1)برای من در محدوده (len (nflx ['close'])):اگر wr_signal [i] == 1:موقعیت [i] = 1elif wr_signal [i] == -1:موقعیت [i] = 0دیگری:موقعیت [i] = موقعیت [i-1]close_price = nflx ['close']WR = nflx ['WR_14']wr_signal = pd. dataframe (wr_signal) . rename (ستون ها =) . set_index (nflx. index)موقعیت = pd. dataframe (موقعیت)قاب = [close_price ، wr ، wr_signal ، موقعیت]استراتژی = pd. concat (فریم ، پیوستن به = 'درونی' ، محور = 1)چاپ (استراتژی)nflx_ret = pd. dataframe (np. diff (nflx ['close']). تغییر نام (ستون ها =)wr_strategy_ret = []برای من در محدوده (len (nflx_ret)):بازگشت = nflx_ret ['بازگشت'] [i]*استراتژی ['wr_position'] [i]wr_strategy_ret. append (بازگشت)wr_strategy_ret_df = pd. dataframe (wr_strategy_ret) . rename (ستون ها =)Investment_value = 100000number_of_stocks = طبقه (سرمایه گذاری_ value/nflx ['close'] [-1])wr_investment_ret = []برای من در محدوده (len (wr_strategy_ret_df ['wr_retus']))):بازگشت = number_of_stocks*wr_strategy_ret_df ['wr_retus'] [i]WR_INVESTMENT_RET. APPEND (بازگشت)wr_investment_ret_df = pd. dataframe (wr_investment_ret) . rename (ستون ها =)total_investment_ret = دور (جمع (wr_investment_ret_df ['investion_retus']) ، 2)profit_percentage = طبقه ((total_investment_ret/investment_value)*100)چاپ (CL ("سود حاصل از استراتژی W ٪ r با سرمایه گذاری 100K دلار در NFLX:<>'چاپ (CL ("درصد سود استراتژی W ٪ r:<>٪ '. قالب (profit_percentage) ، attrs = [' bold ']))def get_benchmark (start_date ، سرمایه گذاری_ value):جاسوسی = get_historical_data ("جاسوسی" ، start_date) ['Close']معیار = pd. dataframe (np. diff (جاسوسی)). تغییر نام (ستون =) Investment_Value = سرمایه گذاری_والnumber_of_stocks = طبقه (سرمایه گذاری_و وارو/جاسوسی [-1])Benchmark_investment_ret = [] برای من در محدوده (لن (معیار ['benchmark_retus'])):بازگشت = number_of_stocks*معیار ['benchmark_retus'] [i]Benchmark_investment_ret. Append (بازده) Benchmark_investment_ret_df = pd. dataframe (benchmark_investment_ret) . rename (ستون ها =)بازگشت معیار_ investment_ret_dfمعیار = get_benchmark ('' 2020-01-01 '، 100000)Investment_value = 100000total_benchmark_investment_ret = دور (جمع (معیار ['سرمایه گذاری_ retus']) ، 2)Benchmark_profit_percentage = طبقه ((total_benchmark_investment_ret/investment_value)*100)چاپ (CL ('سود معیار با سرمایه گذاری 100K دلار:<>'چاپ (CL ('درصد سود معیار:<>format.چاپ (cl ('w ٪ r سود استراتژی است<>٪ بالاتر از معیار سود.
سیگنال های تجاری...
ما را در سایت سیگنال های تجاری دنبال می کنید

برچسب : نویسنده : عبدالله بوتیمار بازدید : <-PostHit-> تاريخ : يکشنبه 11 تير 1402 ساعت: 12:26