سهام را پیدا کنید که ارزش خرید با یادگیری ماشین را دارند

ساخت وبلاگ

آیا این امکان وجود دارد که یک مدل یادگیری ماشین تفاوتهای بین سهام را که عملکرد خوبی دارند و آنهایی که انجام نمی دهند بیاموزد ، و سپس این دانش را به منظور پیش بینی اینکه سهام ارزش خرید را دارد ، استفاده می کنند؟علاوه بر این ، آیا با نگاهی به شاخص های مالی موجود در پرونده های 10-K ، می توان به این هدف دست یافت؟

استراتژی تنبل

فضای تجارت الگوریتمی با استراتژی های جدید در حال وزوز است. شرکت ها قبلاً میلیارد ها دلار (و سرمایه گذاری خود را ادامه داده اند) در زیرساخت ها و تحقیق و توسعه هزینه کرده اند تا بتوانند از این رقابت ها پیش بروند و بازار را شکست دهند. با این حال ، به خوبی تصدیق شده است که استراتژی Buy & Hold قادر به فراتر از بسیاری از استراتژی های الگوریتمی ، به ویژه در طولانی مدت است. با این حال ، یافتن ارزش در سهام هنری است که بسیار معدودی از آن تسلط دارد ، آیا می توان یک الگوریتم را برای انجام این کار آموزش داد؟

این مقاله شامل کلیه مراحل مورد نیاز برای ساخت مجموعه داده های مالی برای بسیاری از سهام و تجزیه و تحلیل آن با مدل های مختلف یادگیری ماشین است. در طول مقاله خواهید دید که این Modus-Operandi از داده های قیمت تیک تیک بهره نمی برد ، اما شاخص های مالی موجود در پرونده های 10 K که هر شرکت با تجارت عمومی سالانه منتشر می شود. به ویژه ، به خاطر این مقاله ، ما از داده های مالی از سال 2018 استفاده خواهیم کرد تا برخی از پیش بینی های ساختگی در مورد عملکرد سهام در سال 2019 انجام دهیم (یعنی از اولین روز تجارت ژانویه 'تا آخرین روز معاملات دسامبر'19).

قبل از پریدن در کد ، باید واضح باشد که این مقاله یک استراتژی معاملاتی واقعی را ارائه نمی دهد که می توانید از آنها استفاده کنید:

  1. من مشاور مالی نیستم و مطمئناً نباید از اینترنت مشاوره مالی بگیرید.
  2. شما نمی توانید آن را برای پیش بینی بازار سهام پیاده سازی کنید زیرا فاقد اطلاعات آینده لازم برای تعیین برچسب ها در مرحله آموزش است.

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

سرانجام ، ما در طول سال چندین بار سهام را خریداری و نمی فروشیم: ما از یک استراتژی تنبل استفاده خواهیم کرد و سهام را در ابتدای سال (2019 در این مورد) خریداری می کنیم و سپس آنها را در پایان سال می فروشیم ، امیدوارمسود

با این گفته ، بیایید درست به قسمت سرگرم کننده بپردازیم.

بخش 1: ساخت مجموعه داده

1. 1 واردات اولیه

اگر با یادگیری ماشین در پایتون آشنا هستید ، باید از قبل تمام بسته ها و کتابخانه ای را که ما از آن استفاده خواهیم کرد ، بدانید. اگر تازه وارد این زمینه هستید نترسید ، می توانید اطلاعات و آموزش های زیادی را برای هر بسته و کتابخانه پیدا کنید. تمام بسته های مورد استفاده به راحتی قابل بازیابی هستند و بسته به تنظیم پایتون شما با PIP یا CONDA نصب می شوند (Python 3. 7. 5 در اینجا استفاده شده است).

به منظور خراش دادن داده ها از وب ، یک اتصال اینترنتی لازم است (ما از API رایگان عالی https://financialmodelingprep.com/developer/docs/ و pandas_datareader مشهور استفاده خواهیم کرد).

برای ساده تر کردن کد به چند عملکرد یاور نیز نیاز خواهیم داشت:

  1. GET_JSON_DATA: برای خراش دادن پیوندها به API FinancialModelingPrep و برای کشیدن داده های مالی استفاده می شود.
  2. GET_PRICE_VAR: برای محاسبه تغییر قیمت در سال 2019 استفاده می شود ، از Pandas_Datareader و Yahoo Finance استفاده می کند.
  3. find_in_json: برای اسکن یک فایل JSON پیچیده برای یک کلید و بازگشت مقدار آن استفاده می شود.

1. 2 لیست سهام

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

این لیست در مجموع بیش از 7K سهام را درک می کند ، که به وضوح بیش از یک بخش را شامل می شود. در واقع ، هر شرکت متعلق به بخش خود (فناوری ، مراقبت های بهداشتی ، انرژی ، ...) است که به نوبه خود ممکن است با فصلی خاص ، روندهای کلان اقتصادی و غیره مشخص شود. از هم اکنون ، من تصمیم گرفتم که روی بخش فناوری تمرکز کنم: این بدان معنی است که از لیست کامل سهام موجود در دسترس_تیکرها فقط کسانی را که بخش آنها برابر با فناوری است ، نگه می دارم. این عملیات به لطف قدرت کتابخانه پانداس کاملاً مستقیم است.

بنابراین ، لیست Tickers_tech شامل تمام سهام موجود در API مدل سازی مالی ، متعلق به بخش فناوری خواهد بود.

1. 3 تغییر قیمت را در طول سال 2019 دریافت کنید

تنوع قیمت هر سهام ذکر شده در Tickers_Tech در طول سال 2019 به عنوان متریک برای تمایز بین سهام ارزش خرید و مواردی که نیستند استفاده می شود (زیرا آنها ارزش آنها را کاهش می دهند ، به دلایلی که ما واقعاً به آنها اهمیتی نمی دهیم). بنابراین ، ما باید:

  • تمام قیمت نزدیک تنظیم شده روزانه را برای هر سهام بکشید ، تفاوت محاسبه کنید (این کار به لطف عملکرد یاور get_price_var انجام می شود
  • در صورت یافتن اطلاعاتی ، سهام را پرش کنید
  • تعداد سهام اسکن شده به 1000 را محدود کنید (برای اهداف زمانی. وقتی داده های مالی را می کشیم ، زمان مورد نیاز متناسب با تعداد سهام است ، بنابراین برای نگه داشتن آن می توانیم تعداد سهام را به آستانه محدود کنیم. با این حال ، شما می توانید این چک را رها کنید و به رایانه اجازه دهید کار خود را در طول شب انجام دهد).
  • سهام و تغییرات قیمت نسبی 2019 را در DataFrame D ذخیره کنید

برای سهام موجود در D ، اکنون باید مقادیر شاخص هایی را پیدا کنیم که به داده های ورودی به مدل های طبقه بندی تبدیل شوند. ما یک بار دیگر از API FinancialmodelingPrep استفاده می کنیم.

ابتدا پرونده indentors. tx را بارگیری می کنیم (موجود در مخزن). همانطور که در سند README توضیح داده شد ، مجموعه ای از شاخص های مالی در حال خراب شدن است. من تصمیم گرفتم که یک نیروی بی رحمانه از تمام شاخص های موجود را از API FinancialmodelingPrep انجام دهم ، و سپس نگران تمیز کردن و تهیه مجموعه داده ها برای مدل ها خواهم بود. در جدول زیر مقدار شاخص مالی موجود برای هر گروه خلاصه شده است.

مقدار شاخص های مالی موجود برای هر گروه از API (https://financialmodelingprep.com).

در کل ، 224 شاخص در دسترس است. با این حال ، از آنجا که برخی از نسخه ها وجود دارد ، تعداد واقعی شاخص ها در شاخص ها 221 است (تاریخ را حساب نمی کند). شما می توانید پرونده indinforts. txt را در اینجا بیابید: https://github.com/cnic92/beat-the-stock-market/tree/almer/all٪20tickers٪20and٪20Indicators

1. 4 شاخص های مالی را خراش دهید و مجموعه داده های خام را بسازید

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

خراش به لطف API مدل سازی مالی یک بار دیگر انجام می شود. این فرآیند کاملاً وقت گیر است زیرا لازم است داده های زیادی را به طور مکرر بکشید.

علاوه بر این ، این مهم است که به خاطر داشته باشید که:

  • لازم است داده ها را در یک بازه زمانی خاص بکشید. از آنجا که هدف طبقه بندی سهام با توجه به تغییر قیمت آن در طول سال 2019 است ، شاخص های مالی باید متعلق به پایان سال 2018 باشد.
  • هرچند غیر معمول است که یک شرکت دو سند 10-K را در همان سال ثبت کرد. در این حالت فقط جدیدترین ورودی باید نگه داشته شود.
  • این امکان وجود دارد که API به هیچ وجه داده ای را برای سهام معین بازگرداند. در این حالت سهام باید دور ریخته شود.
  • همه شاخص ها یک مقدار را برمی گردانند. این عادلانه است که انتظار داشته باشیم که درصد از شاخص ها به یک دلیل یا دلیل دیگر از بین بروند. در این حالت ، NP. NAN به ورودی های مفقود شده اختصاص می یابد و ما در مرحله تمیز کردن از آنها مراقبت خواهیم کرد.

در پایان ، آنچه ما می خواهیم به دست آوریم ، داده های Dataframe است که در آن ردیف ها با سهام که داده ها پیدا شده است (واقعی_تیکرها) و ستون ها با شاخص های مالی (شاخص ها) مطابقت دارند.

1. 5 تمیز کردن و آماده سازی مجموعه داده

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

  • از بین بردن ستون هایی که مقادیر NAN زیادی دارند.
  • از بین بردن ستون هایی که 0 مقدار زیادی دارند.
  • مقادیر NAN باقیمانده را با مقدار متوسط ستون پر کنید.

به عنوان مثال ، در این مورد خاص به طور متوسط 84 0 ارزش در هر ستون وجود دارد ، با انحراف استاندارد 140حدود 3. 1 ٪ از کل ردیف های مجموعه داده).

در عین حال ، به طور متوسط حدود 37 ورودی NAN در هر ستون وجود دارد که یک انحراف استاندارد در حدود 86 است. بنابراین تصمیم گرفتم از DataFrame تمام آن ستون هایی را که در آن ورودی های NAN بالاتر از 15 است ، حذف کنم (15 نفر در حدود 15 نفر هستند. 2. 4 ٪ از کل ردیف های مجموعه داده). سپس ، ورودی های NAN باقیمانده با مقدار متوسط ستون پر شده اند.

در پایان فرآیند تمیز کردن ، تعداد ستون های داده از 221 به 108 کاهش یافته است که 50 ٪ کاهش یافته است. در حالی که مطمئناً برخی از شاخص های دور ریخته شده به دلیل کمبود داده بی فایده بودند ، اما ممکن است داده های مفید در این فرآیند نیز از بین برود. با این حال ، باید در نظر گرفت که ما به داده های مفیدی در تمام سهام موجود در مجموعه داده نیاز داریم ، بنابراین فکر می کنم دور از آن نشانگرها (ستون ها) که ممکن است فقط به بخش کوچکی از مجموعه داده مربوط باشد ، قابل قبول است.

سرانجام ، لازم است هر نمونه را طبقه بندی کند. برای هر سهام قبلاً تفاوت قیمت معاملات بین اولین روز معاملات در ژانویه 2019 و آخرین روز معاملاتی در دسامبر 2019 (مجموعه داده D) محاسبه شده است. اگر این تفاوت مثبت باشد ، آن سهام متعلق به کلاس 1 است که یک سیگنال خرید است. در مقابل ، اگر اختلاف قیمت منفی باشد ، سهام به عنوان 0 طبقه بندی می شود ، که یک سیگنال نادیده گرفته است (خرید نکنید). یک مقاله سریع در جدول زیر یافت می شود.

بنابراین ، این آرایه از مقادیر 1 و 0 به عنوان آخرین ستون داده های DataFrame ضمیمه می شود.

این نتیجه بخش 1 این مقاله است. ما یک مجموعه داده ساخته شده ایم که شامل هر دو شاخص مالی مربوطه از سال 2018 و کلاس های باینری است که از عملکرد قیمت سهام در سال 2019 ناشی می شود. در بخش 2 ، ما به اجرای چند الگوریتم یادگیری ماشین می پردازیم تا پیش بینی کنیمسهام ، و سعی کنید بازار را شکست دهید!

بخش 2: پیش بینی های ساختگی را از طریق الگوریتم های یادگیری ماشین انجام دهید

2. 1 مجموعه داده را آماده کنید

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

  1. مجموعه داده ها را در مجموعه داده های آموزش و آزمایش تقسیم کنید.
  2. مجموعه داده ها را به گونه ای استاندارد کنید که هر شاخص دارای میانگین 0 و انحراف استاندارد برابر با 1 باشد.

بنابراین ، برای آنچه مربوط به تقسیم آن به آموزش و آزمایش است ، 80 ٪ از داده های موجود در داده ها برای آموزش الگوریتم ها استفاده می شود ، در حالی که 20 ٪ باقی مانده برای آزمایش الگوریتم های ML استفاده می شود. توجه داشته باشید که طبقه بندی پارامتر مورد استفاده به منظور حفظ همان نسبت کلاس بین مجموعه داده های آموزش و آزمایش. از train_split و test_split ، داده های ورودی x_train ، x_test و خروجی داده های هدف y_train ، y_test را استخراج می کنیم. پس از آن یک بررسی عقل انجام می شود.

نتایج عبارتند از:

برای آنچه مربوط به استاندارد سازی داده ها است ، ما از استانداردهای () موجود از Scikit-Lea استفاده می کنیم. استفاده از ضرایب یکسان هنگام استاندارد سازی داده های آموزش و آزمایش مهم است: به همین دلیل ما ابتدا مقیاس دهنده را در X_Train قرار می دهیم ، و سپس آن را از طریق روش X_Train و X_Test از طریق روش . Transform () استفاده می کنیم.

2. 2 دستگاه بردار پشتیبانی

اولین الگوریتم طبقه بندی که ما اجرا خواهیم کرد دستگاه بردار پشتیبانی است. GridSeachCV به منظور تنظیم برخی از پارامترهای بیش از حد (هسته ، گاما ، ج) انجام می شود. تعداد مورد نیاز اعتبار سنجی متقاطع به 5 تنظیم شده است. ما می خواهیم به حداکثر دقت وزنی دست یابیم تا تعداد مثبت کاذب به حداقل برسیم.

نتایج خیلی بد نیست. همانطور که در زیر نشان داده شده است ، می توانیم شاهد دقت وزنی 71. 3 ٪ باشیم. اگر با دقت بخوانید ، ممکن است متوجه شده باشید که پارامتر امتیاز دهی برابر با Metric Precision_weighted است. این کار به منظور بهینه سازی الگوریتم ها با توجه به دقت آنها (برای اشتباه گرفتن با دقت!) و وزن انجام شده است ، زیرا ما برای هر دو کلاس همان تعداد نمونه را نداریم (سهام ارزش خرید و خرید-سهام شایسته). برای اطلاعات بیشتر در مورد این و دیگران پارامترهای به ثمر رساندن می توانید اسناد را در اینجا بررسی کنید https://scikitlea.org/stable/modules/model_evaluation.html.

2. 3 جنگل تصادفی

الگوریتم طبقه بندی دوم که اجرا خواهیم کرد ، جنگل تصادفی است. GridSeachCV به منظور تنظیم برخی از پارامترهای بیش از حد (n_estimators ، max_features ، max_depth ، معیار) انجام می شود. تعداد مورد نیاز اعتبار سنجی متقاطع به 5 تنظیم شده است. ما می خواهیم به حداکثر دقت وزنی دست یابیم تا تعداد مثبت کاذب به حداقل برسیم.

همانطور که در زیر نشان داده شده است ، می توانیم ببینیم که این الگوریتم از ماشین بردار پشتیبانی با چند درصد نسبت استفاده می کند ، زیرا ما دارای دقت وزنی 72. 4 ٪ هستیم.

2. 4 تقویت شیب شدید

سومین الگوریتم طبقه بندی که اجرا خواهیم کرد ، تقویت شیب شدید است. GridSeachCV به منظور تنظیم برخی از پارامترهای بیش از حد (Leaing_rate ، Max_Depth ، n_estimators) انجام می شود. تعداد مورد نیاز اعتبار سنجی متقاطع به 5 تنظیم شده است. ما می خواهیم به حداکثر دقت وزنی دست یابیم تا تعداد مثبت کاذب به حداقل برسیم.

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

2. 5 Perceptron چند لایه

چهارمین الگوریتم طبقه بندی که ما اجرا خواهیم کرد ، Perceptron چند لایه (شبکه عصبی Feed-Forward) است. GridSeachCV به منظور تنظیم برخی از پارامترهای بیش از حد (Hidden_Layer_Sizes ، فعال سازی ، حل کننده) انجام می شود. تعداد مورد نیاز اعتبار سنجی متقاطع به 5 تنظیم شده است. ما می خواهیم به حداکثر دقت وزنی دست یابیم تا تعداد مثبت کاذب به حداقل برسیم.

این الگوریتم هنوز بهترین است ، زیرا از تمام الگوریتم های قبلاً آزمایش شده بهتر است. MLP با دقت وزنی 73 ٪ بازده می شود.

2. 6 مدل ها را ارزیابی کنید

اکنون که 4 الگوریتم طبقه بندی آموزش داده شده است ، ما باید آنها را آزمایش کنیم و عملکرد آنها را با توجه به یکدیگر مقایسه کنیم و با آنچه در این زمینه معیار محسوب می شود (S& P 500 ، داو جونز). در واقع ، ما خود را به مقایسه دقت آزمایش آنها محدود نمی کنیم: ما می خواهیم درک کنیم که کدام الگوریتم منجر به بهترین بازده سرمایه گذاری (ROI) می شود. برای انجام این کار ، ابتدا باید تغییرات قیمت 2019 موجود در PVAR را فقط از آن دسته از سهام که متعلق به مجموعه داده های آزمایش هستند (که ما هنوز از آنها استفاده نکردیم!) دریافت کنیم.

اکنون ، ما یک DataFrame DataFrame جدید ایجاد می کنیم که در آن ، برای هر سهام آزمایش شده ، تمام کلاس های پیش بینی شده را از هر مدل جمع می کنیم (یادآوری می شود که این دو کلاس 0 = نادیده گرفتن ، 1 = خرید) هستند.

اگر مدل کلاس 1 را پیش بینی کند ، ما 100 دلار ارزش آن سهام را خریداری می کنیم. در غیر این صورت ، ما سهام را نادیده می گیریم.

سرانجام ، ما یک مدل Compact DataFrame_Comparison را ایجاد می کنیم که در آن اطلاعات اصلی مورد نیاز برای انجام مقایسه بین مدل های طبقه بندی و معیارها را جمع آوری می کنیم (S& P 500 ، داو جونز).

با استفاده از DataFrame DF1 ، ما به راحتی می توانیم سود و زیان را برای هر مدل محاسبه کنیم (net_gain_ ، درصد_gain_).

از آنجا که ما داده های معیارها را از دست می دهیم ، به سرعت از عملکرد سفارشی get_price_var سوءاستفاده می کنیم تا درصد درصد برای هر دو S& P 500 (^GSPC) و داو جونز (^DJI) را برای سال 2019 بدست آوریم.

از DataFrame Models_Comparison ، می توان آن را مشاهده کرد:

  • XGB و RF مدل های ML هستند که به ترتیب بالاترین ROI ، 31. 3 ٪ و 40. 9 ٪ دارند
  • RF بیش از 12 p. p از S& P 500 بهتر است ، در حالی که تقریباً 20 p. p.
  • XGB از S& P 500 توسط چند P. P. بهتر است ، در حالی که تقریباً از 10 P. P. داو جونز بهتر است.
  • MLP و SVM از نزدیک هماهنگ هستند و به ترتیب ROI 28. 3 ٪ و 27. 2 ٪ به دست می آورند
  • MLP و SVM به طور مشابه با S& P 500 عمل می کنند ، در حالی که هر دو از داو جونز خارج می شوند
  • SVM منجر به بالاترین سود خالص ، در حدود 3290 دلار می شود. با این حال ، همچنین بالاترین هزینه سرمایه گذاری اولیه را با 12100 دلار دارد
  • RF منجر به کمترین سود خالص ، در حدود 1920 دلار می شود. با این حال ، همچنین کمترین هزینه سرمایه گذاری اولیه را با 4700 دلار دارد

بنابراین، این مثال، حداقل به عنوان اثبات مفهوم، ثابت می کند که می توان اطلاعات مفیدی را در پرونده های 10-K که شرکت های سهامی عام منتشر می کنند، یافت. از اطلاعات مالی می توان برای آموزش مدل های یادگیری ماشینی استفاده کرد که یاد می گیرند سهام ارزش خرید را تشخیص دهند.

برای آنچه که مربوط به مقایسه سنتی تر بین عملکرد مدل های ML پیاده سازی شده است، می توان طبقه بندی_گزارش را تحلیل کرد.

که نتیجه می دهد:

اگر با دقت نگاه کنید، منصفانه است که بپرسید: چرا RF بالاترین ROI را برمی گرداند اگر این روش با کمترین دقت وزنی باشد؟این اتفاق می افتد زیرا:

  • RF بالاترین دقت را برای کلاس BUY (83%) دارد. در واقع، 83% از پیش بینی های BUY مثبت واقعی هستند و 17% باقیمانده مثبت کاذب هستند.
  • تقلید از تعداد مثبت کاذب اجازه می دهد تا مقدار پول خرج شده برای سهام را که در طول سال 2019 ارزش آنها کاهش می یابد به حداقل برسد.
  • RF بالاترین فراخوان را برای کلاس IGNORE (79٪) دارد، به این معنی که 79٪ از سهامی که نباید خریداری شوند را به درستی شناسایی کرده است.

با این حال، همه اینها به این معنی است که ما تعداد زیادی سهام بالقوه را برای خرید از دست می دهیم، زیرا RF منجر به تعداد زیادی منفی کاذب می شود. در واقع، به راحتی می توان فهمید که RF کمترین ارزش یادآوری را برای کلاس BUY (43%) دارد، به این معنی که ما فقط 43٪ از کل سهام را پیدا می کنیم که باید به عنوان ارزش خرید طبقه بندی می شدند.

این بخش 2 این مقاله را به پایان می رساند. امیدوارم برای شما مفید و الهام بخش باشد. برای اطلاعات بیشتر درباره Financial Modeling Prep API، کدها و داده های تاریخی پیوندهای زیر را بررسی کنید.

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

برچسب : نویسنده : محبوب امانی بازدید : 45 تاريخ : پنجشنبه 24 فروردين 1402 ساعت: 20:49