یک فرآیند کامل در اجرای یک شاخص قدرتمند و یک استراتژی معاملاتی در پایتون برای انجام معاملات بهتر در بازار
قلمرو وجود دارد که شاخص های فنی عجیب و غریب مانند شاخص قدرت نسبی ، نوسان ساز تصادفی ، MACD و غیره وجود دارد و شاخصی که امروز می خواهیم در مورد آن بحث کنیم ، مطمئناً با توجه به عملکرد آن که فراتر از موارد فوق الذکر است ، به این لیست اضافه می کند. این کسی نیست جز شاخص قدرت واقعی ، به زودی با نام TSI شناخته می شود.
در این مقاله ، ما ابتدا برخی از شهودهای اساسی در مورد نشانگر و نحوه محاسبه آن یا ریاضیات موجود در آن ایجاد خواهیم کرد. سپس ، ما به قسمت برنامه نویسی حرکت خواهیم کرد که در آن ما از پایتون برای ساختن شاخص از ابتدا استفاده خواهیم کرد ، یک استراتژی معاملاتی را می سازیم ، استراتژی را پشت سر می گذاریم و نتایج را با نتایج ETF جاسوسی مقایسه می کنیم (ETF به ویژه برای ردیابی حرکت طراحی شده است. شاخص بازار S& P 500). بدون آزار و اذیت بیشتر ، بیایید به مقاله بپردازیم!
قبل از ادامه کار ، اگر می خواهید استراتژی های معاملاتی خود را بدون هیچ گونه برنامه نویسی پشت سر بگذارید ، راه حلی برای آن وجود دارد. این backtestzone است. این یک بستر برای پشتوانه هر تعداد استراتژی معاملاتی در انواع مختلف دارایی های قابل تجارت به صورت رایگان و بدون برنامه نویسی است. می توانید بلافاصله با استفاده از پیوند در اینجا از ابزار استفاده کنید: https://www. backtestzone.com/
شاخص قدرت واقعی (TSI)
شاخص قدرت واقعی (TSI) یک نوسان ساز حرکت است که در درجه اول توسط معامله گران استفاده می شود تا مشخص شود که آیا یک بازار یک حرکت صعودی است یا یک حرکت نزولی و تجارت همراه با آن. همچنین برای شناسایی وضعیت فعلی بازار ، بیش از حد یا بیش از حد مورد استفاده قرار می گیرد ، اما این مهمترین شاخص نیست. شاخص قدرت واقعی از دو مؤلفه تشکیل شده است:
- خط TSI: اولین مؤلفه خود خط TSI است که با تعیین اولین تغییر قیمت واقعی (قیمت بسته شدن فعلی منهای قیمت بسته شدن قبلی) و تغییر قیمت مطلق (مقادیر مطلق تغییر قیمت واقعی) محاسبه می شود. سپس یک EMA با 25 به عنوان تعداد دوره ها (طولانی) برای تغییر قیمت واقعی و تغییر قیمت مطلق گرفته می شود. سپس این دو EMA دوباره با یک دوره 13 روزه (کوتاه) میانگین حرکت نمایی صاف می شوند. این فرآیند هموار سازی یک سری داده با دو EMA به عنوان یکنواختی مضاعف شناخته می شود و هدف از انجام این کار از بین بردن نویز از داده ها است. اکنون ، تغییر قیمت واقعی دو صاف با تغییر قیمت مطلق دو برابر تقسیم شده و سپس برای به دست آوردن خوانش خط TSI با 100 ضرب می شود. توجه داشته باشید که پارامترهای (25 ، 13) که ما در نظر گرفتیم تنظیم معمولی است اما می توان مطابق آن تنظیم کرد. محاسبه ممکن است فازی باشد اما اگر آن را به صورت فرمول یا نمایندگی تفسیر کنیم ، به راحتی قابل درک است:
خط TSI = [dsکامپیوتر واقعی /dsPC مطلق] *100جایی که،dsPC واقعی = دو برابر تغییر قیمت واقعی با طول 25 و 13dsPC مطلق = تغییر قیمت مطلق دو برابر با طول 25 و 13
- خط سیگنال: مؤلفه بعدی مؤلفه خط سیگنال است که چیزی جز میانگین متحرک نمایی TSI برای تعداد مشخصی از دوره ها نیست (در طی 7 تا 12 دوره سقوط می کند). بیشتر معامله گران دوره های نزدیک به 7 را برای اهداف معاملات روزانه و نزدیک به 12 برای سرمایه گذاری بلند مدت ترجیح می دهند. در این مقاله ، ما به عنوان تعداد دوره ها با 12 نفر می رویم زیرا ما به جای یک بازه زمانی دقیقه ای با داده های سهام بازه زمانی روزانه سر و کار خواهیم داشت. محاسبه را می توان به شرح زیر نشان داد:
خط سیگنال =Exp. MA 13 [خط TSI]
این چیزی است که شاخص همه چیز در مورد آن است و ریاضیات پشت آن. حال ، بیایید نمودار را تجزیه و تحلیل کنیم که در آن قرائت شاخص قدرت واقعی به همراه داده های قیمت بسته شده اپل ترسیم شده است تا درک بیشتری در مورد شاخص و عملکرد آن ایجاد کند.
نمودار فوق به دو صفحه تقسیم می شود: پانل فوقانی با طرح داده های قیمت بسته شدن اپل و پانل پایین با قرائت اجزای TSI. همانطور که قبلاً گفتم ، TSI در درجه اول برای مشاهده حرکت بازار استفاده می شود و این را می توان به وضوح در نمودار مشاهده کرد که در آن خوانش های TSI بالاتر از قلمرو مثبت (بیشتر از صفر) مستقیماً نشان می دهد که بازار در حال حرکت به سمت بالا استو در زیر قلمرو منفی ، حرکت نزولی در بازار را نشان می دهد.
حال ، بیایید ببینیم که چگونه TSI می تواند برای تعیین اینکه آیا بازار در وضعیت بیش از حد یا بیش از حد قرار دارد ، استفاده شود. معمولاً ، شاخص هایی مانند RSI آستانه استانداردی از سطح بیش از حد و سطح بیش از حد دارند که به ترتیب 70 و 30 است و این آستانه ها برای هر دارایی قابل معامله قابل استفاده هستند. در حالی که ، سطح بیش از حد و بیش از حد در ضمن استفاده از شاخص قدرت واقعی ، از یک دارایی به دیگری متفاوت است و در مورد ما ، می توانی م-10 را به عنوان سطح بیش از حد و 10 به عنوان سطح بیش از حد در نظر بگیریم. اما با این وجود ، به اندازه سایر نوسان سازهای محبوب حرکت مؤثر نخواهد بود.
به دانش من در مورد استراتژی های معاملاتی ، می توانیم سه نوع استراتژی را بر اساس شاخص قدرت واقعی استفاده کنیم. مورد اول سطح بیش از حد و بیش از حد است. این یکی متداول ترین استراتژی در بین نوسان سازهای شتاب دهنده است که هر زمان که اجزای TSI زیر سطح فراتر از سطح خارج شود ، سیگنال خرید را نشان می دهد و هر زمان که خوانش هر دو مؤلفه از سطح بیش از حد بالا می رود ، سیگنال فروش ایجاد می شود. من شخصاً از این استراتژی استفاده نمی کنم زیرا معتقدم که شاخص قدرت واقعی با مفهوم سطح بیش از حد و سطح بیش از حد سابقه خوبی ندارد.
دومین استراتژی تجارت ، متقاطع خط صفر است که هر زمان که اجزای TSI از پایین به صفر صفر عبور می کنند ، یک سیگنال خرید را نشان می دهد ، به همین ترتیب ، هر زمان که اجزای TSI از بالای صفر پایین می روند ، یک سیگنال فروش فاش می شود. این استراتژی مؤثر است اما نه به اندازه استراتژی معاملاتی بعدی که می خواهیم در مورد آن بحث کنیم.
استراتژی معاملاتی نهایی و موردی که در این مقاله می خواهیم پیاده سازی کنیم ، متقاطع خط سیگنال است که هر زمان که خط TSI از پایین به بالای خط سیگنال عبور می کند ، سیگنال خرید را نشان می دهد و به همین ترتیب ، هر زمان که خط TSI یک سیگنال فروش فاش می شود. از بالا به زیر خط سیگنال می رود. این استراتژی یکی از پر استفاده از استراتژی های تجاری در میان دیگران است و در حالی که به دلیل کارآیی آن در بازار از شاخص قدرت واقعی استفاده می کند. این استراتژی تجارت می تواند به شرح زیر باشد:
اگرprev. tline<prev. sline وCUR.TLINE> CUR.SLINE ==> سیگنال بخریداگرPREV.TLINE> prev. sline وCUR.TLINE CUR.SLINE ==> فروش سیگنال
خودشه! این نتیجه تئوری ما در مورد شاخص قدرت واقعی است. اکنون بیایید به برنامه نویسی برویم که در آن از Python استفاده خواهیم کرد تا ابتدا این نشانگر را از ابتدا بسازیم ، استراتژی معاملات متقاطع خط سیگنال را بسازیم ، استراتژی را روی داده های سهام اپل بسازیم و نتایج را با نتایج SPY ETF مقایسه کنیم. بیایید برخی از برنامه نویسی را انجام دهیم! قبل از حرکت ، یادداشتی در مورد سلب مسئولیت: تنها هدف این مقاله آموزش مردم است و باید به عنوان یک قطعه اطلاعاتی در نظر گرفته شود اما نه به عنوان مشاوره سرمایه گذاری یا همینطور.
اجرای در پایتون
قسمت برنامه نویسی به شرح زیر به مراحل مختلف طبقه بندی می شود:
1. واردات بسته ها2. استخراج داده های سهام از دوازده داده3. محاسبه شاخص قدرت واقعی4- ایجاد استراتژی تجارت متقاطع خط سیگنال5. ترسیم لیست های معاملاتی6. ایجاد موقعیت ما7. پشتی8. مقایسه ETF جاسوسی
ما سفارش ذکر شده در لیست بالا را دنبال خواهیم کرد و کمربندهای صندلی خود را جمع می کنیم تا هر قسمت برنامه نویسی آینده را دنبال کنید.
مرحله 1: وارد کردن بسته ها
وارد کردن بسته های مورد نیاز به محیط پایتون یک گام غیر قابل قبول است. بسته های اصلی قرار است پاندا برای کار با داده ها ، Numpy برای کار با آرایه ها و برای توابع پیچیده ، Matplotlib برای ترسیم اهداف و درخواست هایی برای برقراری تماس API باشد. بسته های ثانویه برای کارکردهای ریاضی و Termcolor برای سفارشی سازی قلم (اختیاری) ریاضی خواهند بود.
اجرای پایتون:
# واردات بسته واردات پاندا به عنوان PDدرخواست های وارداتوارد کردن matplotlib. pyplot به عنوان pltوارد کردن numpy به عنوان npاز طبقه واردات ریاضیاز Termcolor وارد شده به عنوان clplt. style. use ('fivethirtyeight')plt. rcparams ['figure. figsize'] = (20،10)اکنون که تمام بسته های مورد نیاز را به پایتون خود وارد کرده ایم. بیایید داده های تاریخی اپل را با نقطه پایانی API دوازده داده بکشیم.
مرحله 2: استخراج داده ها از دوازده داده
در این مرحله ، ما قصد داریم داده های تاریخی سهام اپل را با استفاده از نقطه پایانی 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)بازگشت DFaapl = get_historical_data ('aapl' ، '2019-01-01')aapl. tail ()خروجی:
توضیح کد: اولین کاری که ما انجام دادیم تعریف تابعی به نام "get_historical_data" است که نماد سهام ("نماد") و تاریخ شروع داده های تاریخی ("start_date") را به عنوان پارامترها می گیرد. در داخل عملکرد ، ما کلید API و URL را تعریف می کنیم و آنها را در متغیر مربوطه ذخیره می کنیم. در مرحله بعد ، ما داده های تاریخی را در قالب JSON با استفاده از عملکرد "دریافت" استخراج می کنیم و آن را در متغیر "RAW_DF" ذخیره می کنیم. پس از انجام برخی فرآیندها برای تمیز کردن و قالب بندی داده های RAW JSON ، ما آن را به صورت یک DataFrame Clean Pandas Dataframe باز می گردانیم. سرانجام ، ما در حال استفاده از عملکرد ایجاد شده برای بیرون کشیدن داده های تاریخی اپل از شروع سال 2019 هستیم و آن را در متغیر "AAPL" ذخیره کردیم.
مرحله 3: محاسبه شاخص قدرت واقعی
در این مرحله ، ما قصد داریم با پیروی از روش ها و فرمولی که قبلاً در مورد آنها بحث کردیم ، اجزای شاخص قدرت واقعی را محاسبه کنیم.
اجرای پایتون:
# محاسبه شاخص قدرت واقعی def get_tsi (نزدیک ، بلند ، کوتاه ، سیگنال):diff = بستن - close. shift (1)abs_diff = abs (diff) diff_smoothed = diff. ewm (دهانه = طولانی ، تنظیم = غلط) . mean ()diff_double_smoothed = diff_smoothed. ewm (span = کوتاه ، تنظیم = false) . mean ()abs_diff_smoothed = abs_diff. ewm (span = طولانی ، تنظیم = false) . mean ()abs_diff_double_smoothed = abs_diff_smoothed. ewm (span = کوتاه ، تنظیم = false) . mean () tsi = (diff_double_smoothed / abs_diff_double_smoothed) * 100سیگنال = tsi. ewm (span = سیگنال ، تنظیم = false) . mean ()tsi = tsi[tsi.index>= '2020-01-01']. dropna ()signal = signal[signal.index>= '2020-01-01']. dropna () TSI ، سیگنال را برگردانیدaapl ['tsi'] ، aapl ['signal_line'] = get_tsi (aapl ['close'] ، 25 ، 13 ، 12)aapl = aapl[aapl.index>= '2020-01-01']aapl. tail ()
خروجی:
توضیح کد: اولا ، ما در حال تعیین تابعی به نام "GET_TSI" هستیم که داده های قیمت بسته شدن سهام ("نزدیک") ، دوره بازگشت برای EMA طولانی ("طولانی") ، دوره بازگشت برای EMA کوتاه (کوتاه "') ، و دوره بازگشت برای خط سیگنال ("سیگنال") به عنوان پارامترها. در داخل عملکرد ، ما ابتدا در حال محاسبه و ذخیره تغییر قیمت واقعی ("تفاوت") و تغییر قیمت مطلق ("ABS_DIFF") در متغیر مربوطه آنها هستیم.
سپس ، با استفاده از عملکرد "EWM" که توسط بسته PANDAS برای تعیین میانگین متحرک نمایی ارائه شده است ، ما دو برابر تغییرات قیمت قبلاً محاسبه شده را برای به دست آوردن تغییر قیمت واقعی دو برابر ("DIFF_DOUBLE_SMOOTHED") و تغییر قیمت مطلق دو برابر (Double Smooted "(DIFF_DOUBLE_SMOOTHED) و تغییر قیمت مطلق دو برابر ('ABS_DIFF_DOUBLE_SMOOTHED').
سپس ما مقادیر صاف شده مضاعف را در فرمول خط TSI جایگزین می کنیم تا خوانش های آن را تعیین کنیم. برای محاسبه مقادیر خط سیگنال ، ما برای تعداد مشخصی از دوره ها ، از خوانش های خط TSI تعیین شده استفاده می کنیم. سرانجام ، ما در حال بازگرداندن مؤلفه های محاسبه شده و از عملکرد ایجاد شده برای ذخیره مقادیر اجزای TSI اپل استفاده می کنیم.
مرحله 4: ایجاد استراتژی تجارت
در این مرحله ، ما قصد داریم استراتژی معاملات متقاطع خط سیگنال قدرت واقعی بحث شده در پایتون را پیاده سازی کنیم.
اجرای پایتون:
# استراتژی شاخص قدرت واقعی def defical_tsi_strategy (قیمت ، TSI ، SIGNAL_LINE):buy_price = []sell_price = []tsi_signal = []سیگنال = 0 برای من در محدوده (LEN (قیمت)):اگر TSI [I-1]Signal_line [i]:اگر سیگنال! = 1:buy_price. append (قیمت [i])sell_price. append (np. nan)سیگنال = 1tsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)tsi_signal. append (0)elif tsi[i-1]>سیگنال_ل [I-1] و TSI [i]اگر سیگنال! = -1:buy_price. append (np. nan)sell_price. append (قیمت [i])سیگنال = -1tsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)tsi_signal. append (0)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)tsi_signal. append (0) بازگرداندن buy_price ، sell_price ، tsi_signalbuy_price ، sell_price ، tsi_signal = پیاده سازی_tsi_strategy (aapl ['close'] ، aapl ['tsi'] ، aapl ['signal_line'])
توضیح کد: اول ، ما در حال تعریف تابعی به نام "پیاده سازی_STI_Strategy" هستیم که قیمت سهام ("قیمت ها") و مؤلفه های شاخص قدرت واقعی ("TSI" ، "سیگنال_ل") را به عنوان پارامترها تعریف می کنیم.
در داخل عملکرد ، ما سه لیست خالی (buy_price ، sell_price و tsi_signal) ایجاد می کنیم که در آن مقادیر هنگام ایجاد استراتژی تجارت ضمیمه می شوند.
پس از آن ، ما استراتژی تجارت را از طریق یک حلقه برای اجرای آن اجرا می کنیم. در داخل حلقه ، ما شرایط خاصی را پشت سر می گذاریم و اگر شرایط راضی باشد ، مقادیر مربوطه به لیست های خالی اضافه می شود. اگر شرط خرید سهام برآورده شود ، قیمت خرید به لیست "buy_price" اضافه می شود و ارزش سیگنال به عنوان 1 نماینده برای خرید سهام ضمیمه می شود. به همین ترتیب ، اگر شرط فروش سهام برآورده شود ، قیمت فروش به لیست "sell_price" اضافه می شود و ارزش سیگنال به عنوا ن-1 نماینده برای فروش سهام ضمیمه می شود.
سرانجام ، ما لیست های ضمیمه شده با مقادیر را برمی گردانیم. سپس ، ما در حال استفاده از عملکرد ایجاد شده و مقادیر را در متغیرهای مربوطه آنها ذخیره می کنیم. این لیست معنی ندارد مگر اینکه مقادیر را ترسیم کنیم. بنابراین ، بیایید مقادیر لیست های تجاری ایجاد شده را ترسیم کنیم.
مرحله 5: ترسیم سیگنال های معاملاتی
در این مرحله ، ما می خواهیم لیست های تجاری ایجاد شده را ترسیم کنیم تا از آنها معنا پیدا کنیم.
اجرای پایتون:
# طرح سیگنال های معاملات شاخص قدرت واقعی ax1 = plt. subplot2grid ((11،1) ، (0،0) ، ردیف = 5 ، colspan = 1)ax2 = plt. subplot2grid ((11،1) ، (6،0) ، ردیف = 5 ، colspan = 1)ax1. plot (aapl ['close'] ، linewidth = 2)ax1. plot (aapl. index ، buy_price ، marker = '^' ، markersize = 12 ، color = 'green' ، linewidth = 0 ، label = 'buy signal')ax1. plot (aapl. index ، sell_price ، marker = 'v' ، markersize = 12 ، color = 'r' ، linewidth = 0 ، label = 'فروش سیگنال')ax1. legend ()ax1. set_title ('سیگنال های معاملاتی AAPL TSI')ax2. plot (aapl ['tsi'] ، linewidth = 2 ، color = 'نارنجی' ، label = 'tsi line')ax2. plot (aapl ['signal_line'] ، linewidth = 2 ، color = '#ff006e' ، label = 'signal line')ax2. set_title ('aapl tsi 25،13،12')ax2. legend ()plt. show ()خروجی:
توضیح کد: ما در حال ترسیم اجزای شاخص قدرت واقعی به همراه سیگنال های خرید و فروش تولید شده توسط استراتژی تجارت متقاطع خط سیگنال هستیم. ما می توانیم مشاهده کنیم که هر زمان که خواندن قبلی خط TSI زیر خواندن قبلی خط سیگنال باشد و خواندن فعلی خط TSI بالاتر از خواندن فعلی خط سیگنال باشد ، یک سیگنال خرید به رنگ سبز در نمودار ترسیم می شودبشربه طور مشابه ، هر زمان که خواندن قبلی خط TSI بالاتر از خواندن قبلی خط سیگنال باشد و خواندن فعلی خط TSI زیر خواندن فعلی خط سیگنال باشد ، یک سیگنال فروش به رنگ قرمز در نمودار ترسیم می شود.
مرحله 6: ایجاد موقعیت ما
در این مرحله ، ما قصد داریم لیستی را ایجاد کنیم که اگر سهام را در اختیار نداریم یا سهام خود را نگه نداریم ، 1 را نشان می دهد.
اجرای پایتون:
# موقعیت سهام موقعیت = []برای من در محدوده (len (tsi_signal)):if tsi_signal[i]>1:Position. Append (0)دیگری:Position. Append (1)برای من در محدوده (len (aapl ['close'])):اگر tsi_signal [i] == 1:موقعیت [i] = 1elif tsi_signal [i] == -1:موقعیت [i] = 0دیگری:موقعیت [i] = موقعیت [i-1]close_price = aapl ['close']tsi = aapl ['tsi']سیگنال_ل = aapl ['signal_line']tsi_signal = pd. dataframe (tsi_signal) . rename (ستون ها =) . set_index (aapl. index)موقعیت = pd. dataframe (موقعیت)قاب = [close_price ، tsi ، signal_line ، tsi_signal ، موقعیت]استراتژی = pd. concat (فریم ، پیوستن به = 'درونی' ، محور = 1)استراتژی
خروجی:
توضیح کد: اول ، ما یک لیست خالی به نام "موقعیت" ایجاد می کنیم. ما در حال عبور از دو حلقه برای ما هستیم ، یکی این است که مقادیر لیست "موقعیت" را تولید کنیم تا فقط با طول لیست "سیگنال" مطابقت داشته باشد. حلقه دیگر موردی است که ما برای تولید مقادیر موقعیت واقعی از آن استفاده می کنیم. در داخل حلقه دوم ، ما در مورد مقادیر لیست "سیگنال" تکرار می شویم و مقادیر لیست "موقعیت" در مورد اینکه چه شرایط راضی می شود ، ضمیمه می شوند. اگر سهام خود را نگه داریم یا اگر سهام خود را نداشته باشیم یا سهام خود را نداریم ، مقدار موقعیت 1 باقی مانده است. سرانجام ، ما در حال انجام برخی از دستکاری های داده برای ترکیب همه لیست های ایجاد شده در یک DataFrame هستیم.
از خروجی که نشان داده شده است ، می بینیم که در دو ردیف اول موقعیت ما در سهام 1 باقی مانده است (از آنجا که هیچ تغییری در سیگنال شاخص قدرت واقعی وجود ندارد) اما موقعیت ما به طور ناگهانی ب ه-1 تبدیل شد زیرا ما فروختیمسهام هنگامی که سیگنال تجارت شاخص قدرت واقعی نشان دهنده یک سیگنال فروش (-1) است. موقعیت ما تا زمانی که برخی از تغییرات در سیگنال معاملاتی رخ دهد ، 0 باقی خواهد ماند. اکنون زمان آن رسیده است که برخی از مراحل پشتی را اجرا کنیم!
مرحله 7: پشتی
قبل از حرکت ، ضروری است بدانید که پشتی چیست. Backtesting فرایندی است که می بینیم استراتژی معاملاتی ما در داده های سهام داده شده چگونه انجام داده است. در مورد ما ، ما قصد داریم یک فرآیند پشتی را برای استراتژی تجارت شاخص قدرت واقعی خود بر روی داده های سهام اپل اجرا کنیم.
اجرای پایتون:
# پشتی aapl_ret = pd. dataframe (np. diff (aapl ['close']). تغییر نام (ستون =)tsi_strategy_ret = []برای من در محدوده (len (aapl_ret)):بازگشت = aapl_ret ['بازگشت]] [i]*استراتژی [' tsi_position '] [i]tsi_strategy_ret. append (بازگشت)tsi_strategy_ret_df = pd. dataframe (tsi_strategy_ret) . rename (ستون ها =)Investment_value = 100000number_of_stocks = طبقه (سرمایه گذاری_ value/aapl ['close'] [0])tsi_investment_ret = []برای من در محدوده (len (tsi_strategy_ret_df ['tsi_retus']))):بازگشت = number_of_stocks*tsi_strategy_ret_df ['tsi_retus'] [i]tsi_investment_ret. append (بازده)tsi_investment_ret_df = pd. dataframe (tsi_investment_ret) . rename (ستون ها =)total_investment_ret = دور (جمع (tsi_investment_ret_df ['investion_retus']) ، 2)profit_percentage = طبقه ((total_investment_ret/investment_value)*100)چاپ (CL ("سود حاصل از استراتژی TSI با سرمایه گذاری 100K دلار در AAPL:<>'چاپ (CL ("درصد سود استراتژی TSI:<>٪ '. قالب (profit_percentage) ، attrs = [' bold ']))خروجی:
سود حاصل از استراتژی TSI با سرمایه گذاری 100K دلار در AAPL: 71095. 33درصد سود استراتژی TSI: 71 ٪
توضیح کد: اول ، ما بازده سهام اپل را با استفاده از عملکرد "Diff" ارائه شده توسط بسته NUMPY محاسبه می کنیم و ما آن را به عنوان یک DataFrame در متغیر "AAPL_RET" ذخیره کرده ایم. در مرحله بعد ، ما برای محاسبه بازده هایی که از استراتژی تجارت TSI به دست آوردیم ، یک حلقه را برای تکرار مقادیر متغیر "AAPL_RET" می گذرانیم و این مقادیر بازده به لیست "TSI_STRATEGETY_RET" اضافه می شود. در مرحله بعد ، ما لیست "tsi_strategy_ret" را به یک dataframe تبدیل می کنیم و آن را در متغیر "tsi_strategy_ret_df" ذخیره می کنیم.
مرحله بعدی روند پشتی می آید. ما می خواهیم با سرمایه گذاری صد هزار دلار در استراتژی تجارت خود ، استراتژی خود را پشت سر بگذاریم. بنابراین ابتدا ، ما میزان سرمایه گذاری را در متغیر "سرمایه گذاری_ ولت" ذخیره می کنیم. پس از آن ، ما تعداد سهام اپل را که می توانیم با استفاده از مبلغ سرمایه گذاری خریداری کنیم ، محاسبه می کنیم. می توانید توجه داشته باشید که من از عملکرد "کف" ارائه شده توسط بسته ریاضی استفاده کرده ام ، زیرا در حالی که مبلغ سرمایه گذاری را با قیمت بسته شدن سهام اپل تقسیم می کند ، با تعداد اعشاری خروجی می کند. تعداد سهام باید یک عدد صحیح باشد اما تعداد اعشاری نیست. با استفاده از عملکرد "کف" ، می توانیم اعشار را برش دهیم. به یاد داشته باشید که عملکرد "کف" پیچیده تر از عملکرد "دور" است. سپس ، ما برای یافتن بازده سرمایه گذاری به دنبال برخی از وظایف دستکاری داده ها در حال عبور از حلقه هستیم.
سرانجام ، ما با سرمایه گذاری صد هزار نفر در استراتژی تجارت خود ، بازده کل را که بدست آوردیم چاپ می کنیم و مشخص می شود که ما در یک سال سود تقریبی هفتاد و یک هزار دلار کسب کرده ایم. این بد نیست! اکنون ، بیایید بازده خود را با SPY ETF (ETF طراحی شده برای ردیابی شاخص بازار سهام S& P 500) مقایسه کنیم.
مرحله 8: مقایسه ETF جاسوسی
این مرحله اختیاری است اما بسیار توصیه می شود زیرا می توانیم ایده ای از عملکرد استراتژی تجارت ما در برابر معیار (ETF جاسوسی) داشته باشیم. در این مرحله ، ما داده های ETF SPY را با استفاده از عملکرد "get_historical_data" که ایجاد کردیم استخراج می کنیم و بازده هایی را که از ETF دریافت می کنیم با استراتژی معاملات متقاطع خط سیگنال TSI خود مقایسه می کنیم.
ممکن است مشاهده کرده باشید که در تمام مقالات تجاری الگوریتمی من ، من نتایج استراتژی را نه با شاخص بازار S& P 500 بلکه با SPY ETF مقایسه کرده ام و این به این دلیل است که بیشتر ارائه دهندگان داده های سهام (مانند دوازده داده) don 't داده های شاخص S& P 500 را ارائه می دهد. بنابراین ، من چاره دیگری جز رفتن با ETF جاسوسی ندارم. اگر خوشبخت هستید که داده های شاخص بازار S& P 500 را بدست آورید ، توصیه می شود به جای هر ETF از آن برای مقایسه استفاده کنید.
اجرای پایتون:
# مقایسه ETF جاسوسی 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 ("سود استراتژی TSI است<>٪ بالاتر از معیار سود.خروجی:
سود معیار با سرمایه گذاری 100K دلار: 23370. 75درصد سود معیار: 23 ٪سود استراتژی TSI 48 ٪ بیشتر از سود معیار است
توضیح کد: کد مورد استفاده در این مرحله تقریباً شبیه به موردی است که در مرحله پشتی قبلی استفاده می شود ، اما به جای سرمایه گذاری در اپل ، ما با اجرای هیچ استراتژی معاملاتی در ETF جاسوسی سرمایه گذاری می کنیم. از خروجی ، می توانیم ببینیم که استراتژی معاملات متقاطع خط سیگنال قدرت واقعی ما ، 48 ٪ از ETF جاسوسی بهتر شده است. عالیه!
افکار نهایی!
پس از یک فرآیند قریب به اتفاق خرد کردن هر دو تئوری و قطعات برنامه نویسی ، ما با موفقیت آموخته ایم که شاخص قدرت واقعی در مورد چیست ، ریاضیات موجود در این شاخص و اجرای یک استراتژی تجاری سودآور بر اساس آن. حتی اگر ما موفق شدیم از نتایج ETF جاسوسی پیشی بگیریم ، ما هنوز در یک فضای خاص عقب مانده ایم.
در این مقاله ، الگوریتم ما همان مقدار سهام را برای همه معاملات خریداری و به فروش می رساند ، اما این تصمیم بهینه برای تصمیم گیری در هنگام تجارت در دنیای واقعی نخواهد بود زیرا این خودسرانه است ، و در اینجا جایی است که مفهوم اندازه موقعیت به کار می رود. برای کسانی که در مورد این مفهوم ایده ای ندارند ، اندازه موقعیت ، فرایند تخصیص سهم از نمونه کارها ما به یک سهام خاص است که ما می خواهیم تجارت کنیم. کاری که ما می توانیم انجام دهیم این است که می توانیم یک سیستم اندازه گیری موقعیت را مستقر کنیم که خطر درگیر در هر تجارت را ارزیابی می کند و تعداد سهام را بر این اساس اختصاص می دهد. این نه تنها عملکرد را به طور اساسی تقویت می کند بلکه ما را از مواجهه با ضررهای غیر منتظره جلوگیری می کند. بنابراین ، من اکیداً توصیه می کنم که با این مفهوم پیگیری کنید و سعی کنید آن را در یک استراتژی معاملاتی اجرا کنید.
با این گفته ، شما به پایان مقاله رسیده اید. اگر فراموش کردید که از هر یک از قطعات برنامه نویسی پیروی کنید ، نگران نباشید. من در پایان کد منبع کامل را ارائه داده ام. امیدوارم که از این مقاله چیز جدیدی و مفید یاد گرفته باشید.
کد کامل:
# واردات بستهواردات پاندا به عنوان 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 = 'کلید 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)بازگشت DFaapl = get_historical_data ('aapl' ، '2019-01-01')aapl. tail ()# محاسبه شاخص قدرت واقعیdef get_tsi (نزدیک ، بلند ، کوتاه ، سیگنال):diff = بستن - close. shift (1)abs_diff = abs (diff) diff_smoothed = diff. ewm (دهانه = طولانی ، تنظیم = غلط) . mean ()diff_double_smoothed = diff_smoothed. ewm (span = کوتاه ، تنظیم = false) . mean ()abs_diff_smoothed = abs_diff. ewm (span = طولانی ، تنظیم = false) . mean ()abs_diff_double_smoothed = abs_diff_smoothed. ewm (span = کوتاه ، تنظیم = false) . mean () tsi = (diff_double_smoothed / abs_diff_double_smoothed) * 100سیگنال = tsi. ewm (span = سیگنال ، تنظیم = false) . mean ()tsi = tsi[tsi.index>= '2020-01-01']. dropna ()signal = signal[signal.index>= '2020-01-01']. dropna () TSI ، سیگنال را برگردانیدaapl ['tsi'] ، aapl ['signal_line'] = get_tsi (aapl ['close'] ، 25 ، 13 ، 12)aapl = aapl[aapl.index>= '2020-01-01']aapl. tail ()# طرح فهرست قدرت واقعیax1 = plt. subplot2grid ((11،1) ، (0،0) ، ردیف = 5 ، colspan = 1)ax2 = plt. subplot2grid ((11،1) ، (6،0) ، ردیف = 5 ، colspan = 1)ax1. plot (aapl ['close'] ، linewidth = 2. 5)ax1. set_title ("قیمت بسته شدن AAPL")ax2. plot (aapl ['tsi'] ، linewidth = 2 ، color = 'نارنجی' ، label = 'tsi line')ax2. plot (aapl ['signal_line'] ، linewidth = 2 ، color = '#ff006e' ، label = 'signal line')ax2. set_title ('aapl tsi 25،13،12')ax2. legend ()plt. show ()# استراتژی شاخص قدرت واقعیdef defical_tsi_strategy (قیمت ، TSI ، SIGNAL_LINE):buy_price = []sell_price = []tsi_signal = []سیگنال = 0 برای من در محدوده (LEN (قیمت)):اگر TSI [I-1]Signal_line [i]:اگر سیگنال! = 1:buy_price. append (قیمت [i])sell_price. append (np. nan)سیگنال = 1tsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)tsi_signal. append (0)elif tsi[i-1]>سیگنال_ل [I-1] و TSI [i]اگر سیگنال! = -1:buy_price. append (np. nan)sell_price. append (قیمت [i])سیگنال = -1tsi_signal. append (سیگنال)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)tsi_signal. append (0)دیگری:buy_price. append (np. nan)sell_price. append (np. nan)tsi_signal. append (0) بازگرداندن buy_price ، sell_price ، tsi_signalbuy_price ، sell_price ، tsi_signal = پیاده سازی_tsi_strategy (aapl ['close'] ، aapl ['tsi'] ، aapl ['signal_line'])# طرح سیگنال های معاملات شاخص قدرت واقعیax1 = plt. subplot2grid ((11،1) ، (0،0) ، ردیف = 5 ، colspan = 1)ax2 = plt. subplot2grid ((11،1) ، (6،0) ، ردیف = 5 ، colspan = 1)ax1. plot (aapl ['close'] ، linewidth = 2)ax1. plot (aapl. index ، buy_price ، marker = '^' ، markersize = 12 ، color = 'green' ، linewidth = 0 ، label = 'buy signal')ax1. plot (aapl. index ، sell_price ، marker = 'v' ، markersize = 12 ، color = 'r' ، linewidth = 0 ، label = 'فروش سیگنال')ax1. legend ()ax1. set_title ('سیگنال های معاملاتی AAPL TSI')ax2. plot (aapl ['tsi'] ، linewidth = 2 ، color = 'نارنجی' ، label = 'tsi line')ax2. plot (aapl ['signal_line'] ، linewidth = 2 ، color = '#ff006e' ، label = 'signal line')ax2. set_title ('aapl tsi 25،13،12')ax2. legend ()plt. show ()# موقعیت سهامموقعیت = []برای من در محدوده (len (tsi_signal)):if tsi_signal[i]>1:Position. Append (0)دیگری:Position. Append (1)برای من در محدوده (len (aapl ['close'])):اگر tsi_signal [i] == 1:موقعیت [i] = 1elif tsi_signal [i] == -1:موقعیت [i] = 0دیگری:موقعیت [i] = موقعیت [i-1]close_price = aapl ['close']tsi = aapl ['tsi']سیگنال_ل = aapl ['signal_line']tsi_signal = pd. dataframe (tsi_signal) . rename (ستون ها =) . set_index (aapl. index)موقعیت = pd. dataframe (موقعیت)قاب = [close_price ، tsi ، signal_line ، tsi_signal ، موقعیت]استراتژی = pd. concat (فریم ، پیوستن به = 'درونی' ، محور = 1)استراتژیاستراتژی [12:17]# پشتیaapl_ret = pd. dataframe (np. diff (aapl ['close']). تغییر نام (ستون =)tsi_strategy_ret = []برای من در محدوده (len (aapl_ret)):بازگشت = aapl_ret ['بازگشت]] [i]*استراتژی [' tsi_position '] [i]tsi_strategy_ret. append (بازگشت)tsi_strategy_ret_df = pd. dataframe (tsi_strategy_ret) . rename (ستون ها =)Investment_value = 100000number_of_stocks = طبقه (سرمایه گذاری_ value/aapl ['close'] [0])tsi_investment_ret = []برای من در محدوده (len (tsi_strategy_ret_df ['tsi_retus']))):بازگشت = number_of_stocks*tsi_strategy_ret_df ['tsi_retus'] [i]tsi_investment_ret. append (بازده)tsi_investment_ret_df = pd. dataframe (tsi_investment_ret) . rename (ستون ها =)total_investment_ret = دور (جمع (tsi_investment_ret_df ['investion_retus']) ، 2)profit_percentage = طبقه ((total_investment_ret/investment_value)*100)چاپ (CL ("سود حاصل از استراتژی TSI با سرمایه گذاری 100K دلار در AAPL:<>'چاپ (CL ("درصد سود استراتژی TSI:<>٪ '. قالب (profit_percentage) ، attrs = [' bold ']))# مقایسه ETF جاسوسیdef get_benchmark (start_date ، سرمایه گذاری_ value):جاسوسی = get_historical_data ("جاسوسی" ، start_date) ['Close']معیار = pd. dataframe (np. diff (جاسوسی)). تغییر نام (ستون =) Investment_Value = سرم فارکس وکسب درامد...
ما را در سایت فارکس وکسب درامد دنبال می کنید
برچسب :
نویسنده : احمد قانع پور
بازدید : 54
تاريخ : شنبه
9 ارديبهشت
1402 ساعت: :