پیش بینی بورس با پایتون — آموزش جامع
تلاش برای پیش بینی بورس چشماندازی دلفریب برای دانشمندان دادهای فراهم کرده است که بیش از سود مالی به مسائل چالشی علاقمند هستند. همه روزه میتوان شاهد فراز و نشیبهای بازار بورس بود و به این فکر کرد که آیا الگوهایی وجود دارند که افراد یا مدلها (یادگیری ماشین) بتوانند آنها را بیاموزند و بر اساس آنچه آموختهاند بر معاملهگرانی که مدارک تخصصی کسبوکار دارند غلبه کنند و به پیش بینی بورس بپردازند؟
«ویلیام کوهرسن» (William Koehrsen) در مطلبی با عنوان «پیش بینی بورس با پایتون» چنین میگوید: «هنگامی که من شروع به استفاده از مدلهای گوناگون برای پیشبینی سریهای زمانی کردم، مجبور بودم روشم را روی دادههای بازار بورس با سرمایههای شبیهسازی شده تست کنم. بنابراین، به ناچار به جمع کثیر افرادی پیوستم که در تلاش برای غلبه بر بازار با بهرهگیری از روشهای تحلیلی روز به روز (تحلیل دادههای روزانه) بودند و البته همه به نوعی شکست خوردند.
اگرچه در این فرآیند، پایتون، «برنامهنویسی شیگرا» (Object Oriented Programming | OOP)، چگونگی دستکاری دادهها (Data Manipulation)، مدلسازی و بصریسازی را به خوبی آموختم. همچنین فهمیدم که چرا باید از (تخصیص وقت و) بازی کردن روزانه با دادههای بازار سهام حتی بدون از دست دادن یک دلار (در محیط شبیهسازی شده) اجتناب کرد (تنها میتوانم بگویم این بازی بسیار زمانبر است).
نکتهای که باید بگویم آن است که (به نظر من) هنگام عدم موفقیت در کارها سه راهکار پیش روی ما قرار دارد:
- پیچاندن نتایج به گونهای که به نظر برسد موفق بودهایم.
- مخفی کردن نتایج که منجر میشود هیچ کسی از عدم موفقیت ما آگاه نشود.
- نمایش دادن همه نتایج و روشهایمان به دیگران (و البته خودمان)، زیرا این کار موجب آگاهی افراد از روشهای پیشتر استفاده شده و ناموفق میشود و آنها میتوانند با بهرهگیری از این اطلاعات در تلاشهای آتی که برای حل مساله انجام میدهند، آن را به شیوه بهتری حل کنند.
در حالیکه گزینه سه بهترین انتخاب در سطح فردی و اجتماعی محسوب میشود، نیاز به شجاعت زیادی برای انجام دارد. میتوان هنگامی که مدل به سود قابل توجهی رسید، بازهها را به طور انتخابی به آن داد و یا میتوان آنها را به دور انداخت و چنین وانمود کرد که زمانی برای ساخت این مدل گذاشته نشده که البته این راهکار بسیار سادهلوحانه است. نوع بشر با شکست خوردن و یادگیری از شکستهایش به موفقیت دست مییابد.»
البته نکته قابل توجه دیگر آن است که کد پایتونی که برای انجام کار دشواری مانند پیش بینی بورس نوشته شده (و بسیاری از کدهای دیگری که برای مسائل پیچیده دیگر نوشته میشوند) حتی در صورتی که خروجی نهایی مدل از آنچه مورد انتظار است دور باشد، باز هم یک کد بیهوده به حساب نمیآیند. در این مطلب، قابلیتهای ابزار «Stocker» یا «Stock Explorer» که توسط ویلیام کوهرسن به منظور پیش بینی بورس با زبان برنامهنویسی پایتون ساخته شده به همراه چگونگی کد نویسی آن مورد بررسی قرار میگیرد. کد کامل این برنامه در گیتهاب (+) برای کلیه افرادی که تمایل به استفاده از آن و یا مشارکت در این پروژه را دارند موجود است.
Stocker برای پیش بینی بورس
Stocker یک ابزار پایتون برای انجام اکتشاف در بورس است که توسط ویلیام کوهرسن با استفاده از زبان برنامهنویسی پایتون نوشته شده است.
به منظور اجرای این برنامه، پس از آنکه کتابخانههای مورد نیاز آن نصب شد، میتوان Jupyter Notebook را در همان پوشه اسکریپت برنامه آغاز و کلاس Stocker را ایمپورت کرد.
1from stocker import Stocker
این کلاس در حال حاضر در دسترس است. یک شی از کلاس Stocker با پاس دادن هر مقدار معتبری از stock ticker به آن ساخته میشود.
:[In[1
1amazon = Stocker('AMZN')
:[1]Out
AMZN Stocker Initialized. Data covers 1997-05-16 to 2018-01-18.
همانطور که از خروجی مشهود است، دادههای سهام آمازون برای بیست سال موجود هستند و میتوان در آنها به اکتشاف پرداخت. Stocker برپایه کتابخانه مالی Quandl با بیش از ۳۰۰۰ بورس برای استفاده ساخته شده است. در ادامه، میتوان با استفاده از متد plot_stock یک نمودار ساده از تاریخچه دادههای بورس را ترسیم کرد.
:[In[2
1amazon.plot_stock()
:[2]Out
Maximum Adj. Close = 1305.20 on 2018-01-12. Minimum Adj. Close = 1.40 on 1997-05-22. Current Adj. Close = 1293.32.
تواناییهای تحلیل Stocker میتواند برای یافتن گرایشهای کلی و الگوهای موجود در میان دادهها مورد استفاده قرار بگیرد اما تمرکز ادامه این مطلب بر چگونگی پیشبینی قیمتهای آینده سهام بر اساس دادههای گذشته بازار بورس (سریهای زمانی) است. پیش بینی بورس در Stocker با استفاده از «مدلهای جمعی» (Additive Model | AM) که شامل سریهای زمانی به عنوان ترکیبی از یک گرایش کلی دارای فصلبندیها در مقیاسهای زمانی متفاوت مانند روزانه، هفتگی و ماهانه است. Stocker همچنین از بسته prophet که توسط فیسبوک برای مدلسازی تجمعی ساخته شده استفاده میکند. ساخت یک مدل و انجام پیش بینی بورس در Stocker تنها با بهرهگیری از یک خط کد انجامپذیر است.
:[In[3
1# predict days into the future
2model, model_data = amazon.create_prophet_model(days=90)
:[3]Out
Predicted Price on 2018-04-18 = $1336.98
پیشبینی - خط سبز رنگ - در برگیرنده «فاصله اطمینان» (Confidence Interval) است. این امر از «عدم قطعیت» (Uncertainty) مدل در پیشبینیها حکایت دارد. در این مثال، پهنای فاصله اطمینان بر ۸۰٪ تنظیم شده است، بدین معنا که انتظار میرود این بازه در ۸۰٪ مواقع شامل مقدار واقعی باشد. فاصله اطمینان در گذر زمان پهنتر میشود زیرا تخمین با دورتر شدن از دادهها، دارای عدم قطعیت بیشتری نیز میشود. هر زمان که پیش بینی بورس انجام شود، باید بازههای اطمینان در آن لحاظ شود. اگرچه بیشتر افراد به دنبال یک پاسخ ساده درباره آینده هستند، پیشبینیها حاکی از آن است که بشر در جهان غیر قطعی زندگی میکند.
هر کسی میتواند به پیش بینی بورس بپردازد، بدین صورت که صرفا کافی است یک عدد را انتخاب کند و نتیجه حاصل، پیشبینی بر اساس انتخاب فرد محسوب میشود (ویلیام کوهرسن: «شاید اشتباه میکنم اما این همان روشی است که همه افراد در وال استریت دارند»). برای آنکه بتوان به مدل اعتماد کرد، نیاز به ارزیابی صحت آن است. تعدادی روش نیز در Stocker برای ارزیابی صحت مدل وجود دارند.
ارزیابی پیشبینیها
برای محاسبه صحت، نیاز به مجموعه دادههای تست و آموزش است. دادهکاو نیاز دارد که پاسخها را برای مجموعه تست بداند - قیمت کنونی بورس -، بنابراین از دادههای تاریخی یک سال گذشته برای انجام این کار استفاده میشود (در مثال پیش رو ۲۰۱۷). هنگام آموزش، به مدل اجازه داده نمیشود که پاسخهای مجموعه داده تست را ببیند، بنابراین از دادههای سه سال قبلتر از آن برای ارزیابی چارچوب زمانی استفاده میشود (۲۰۱۴ تا ۲۰۱۶). ایده اساسی «یادگیری نظارت شده» (Supervised Learning) آن است که مدل الگوها و روابط میان دادهها را از مجموعه داده آموزش میآموزد و سپس قادر به بازتولید صحیح آنها برای دادههای تست است.
در عین حال، نیاز به مقدارسنجی صحت (به صورت کمی) است، بنابراین از پیشبینیها برای مجموعه داده تست و مقادیر کنونی استفاده میشود، سنجهها شامل خطای دلار میانگین در مجموعه دادههای تست و آموزش، درصد زمانی که جهت تغییر قیمت به طور صحیح پیشبینی شده و درصد زمانی که قیمت واقعی در داخل فاصله اطمینان ۸۰٪ قرار گرفته میشود. همه این محاسبات توسط Stocker با بصریسازی خوبی انجام میپذیرند.
:[In[4
1amazon.evaluate_prediction()
:[4]Out
Prediction Range: 2017-01-18 to 2018-01-18. Predicted price on 2018-01-17 = $814.77. Actual price on 2018-01-17 = $1295.00. Average Absolute Error on Training Data = $18.21. Average Absolute Error on Testing Data = $183.86. When the model predicted an increase, the price increased 57.66% of the time. When the model predicted a decrease, the price decreased 44.64% of the time. The actual value was within the 80% confidence interval 20.00% of the time.
این آمارها غیر قبل پیمایش هستند! درست مانند اینکه شیر یا خط انداخته شده باشد. اگر فردی بخواهد از این آمارها برای سرمایهگذاری استفاده کند شاید بهتر باشد کار با معناتری مانند خرید بلیط بختآزمایی انجام دهد. اگرچه، کار با این مدل هنوز تمام نشده است. معمولا از مدل در ابتدا انتظار میرود که دارای عملکرد بدی باشد، زیرا در آن از تنظیمات پیشفرض (هایپرپارامترها | hyperparameters) استفاده میشود.
اگر تلاشهای اولیه موفقیتآمیز نبودند، میتوان این پارامترها را جهت حصول نتایج بهتر تغییر داد. تنظیمات گوناگونی برای تنظیم مدل Prophet وجود دارد، که مهمترین آنها مقیاس اولیه «نقطه تغییر» (changepoint) است که میزان وزنی که مدل در تغییرات گرایشهای دادهها قرار میدهد را کنترل میکند.
انتخاب اولویت نقطه تغییر
نقاط تغییر نمایانگر محلهایی هستند که سری زمانی از افزایش رو به کاهش یا از رشد آهسته به رشد سریع رفته است (یا برعکس). این موارد در محلهایی با بیشترین تغییر در نرخ سریهای زمانی به وقوع میپیوندند. مقیاس اولویت نقطه تغییر میزان تاکید داده شده بر نقاط تغییر در مدل را نشان میدهد. این مورد برای کنترل «بیشبرازش» (overfitting) و «کمبرازش» (underfitting) مورد استفاده قرار میگیرد.
اولویتهای بالاتر مدلهایی با وزن بیشتر در نقاط تغییر و فیتهای انعطافپذیرتر را میسازند. این امر ممکن است منجر به بیشبرازش شود، زیرا مدل به شدت به دادههای آموزش میچسبد و قادر به تعمیم به دادههای تست جدید نیست. کاهش اولویت، انعطافپذیری مدل را کاهش میدهد که میتواند منجر به مساله برعکسی، یعنی کمبرازش، بشود.
این مساله هنگامی که مدل دادههای آموزش را به اندازه کافی از نزدیک دنبال نمیکند و برای یادگیری الگوهای اساسی شکست میخورد به وقوع میپیوندد. فهمیدن تنظیمات مناسب برای کسب توازن صحیح، بیشتر یک مساله مهندسی است تا مساله نظری، و در اینجا به نتایج تجربی باید اعتماد کرد. کلاس Stocker در برگیرنده دو راه مختلف برای انتخاب اولویت مناسب است، راهکار بصری و کمی. در ادامه ابتدا روش گرافیکی (بصری) مورد استفاده قرار میگیرد.
:[In[5
1# changepoint priors is the list of changepoints to evaluate
2amazon.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2])
در این گام، آموزش مدل با دادههای سه سال انجام و سپس پیشبینیها برای سه ماه نمایش داده میشوند. پیشبینیها در اینجا کمیسازی نمیشوند زیرا سعی تنها بر این است که نقش اولویت نقطه تغییر درک شود. این نمودار در نمایش بیشبرازش و کمبرازش فوقالعاده عمل میکند. کمترین اولویت - خط آبی - دادههای آموزش را دنبال نمیکند.
مشاهدات مشکی رنگ به شدت دادههای آموزش را دنبال میکنند و ظاهرا کار خودشان را انجام داده و مسیری را از میان مجاورت عمومی انتخاب میکنند. این در حالیست که بالاترین اولویت، خط زرد، تا حد امکان به مشاهدات آموزش چسبیده است. مقدار پیشفرض برای اولویت نقطه تغییر برابر با 0.05 است که جایی بین دو تا از مقادیر فوقالعاده قرار میگیرد.
همچنین، تفاوت بین عدم قطعیت (فاصلههای به اشتراک گذاشته شده) برای اولویتها قابل توجه است. کمترین اولویت بالاترین عدم قطعیت را در دادههای آموزش دارد، اما دارای کمترین عدم قطعیت روی دادههای تست است. هر چه اولویت بیشتر می شود، اطمینان روی دادههای آموزش افزایش مییابد، زیرا از نزدیک هر مشاهدهای را دنبال میکند.
اگرچه هنگامی که بحث از دادههای تست میشود، یک مدل بیشبرازش بدون هیچ نقطه دادهای که به آن مربوط باشد گم میشود. از آنجا که بورس دارای کمی تنوع است، امکان دارد پژوهشگر به دنبال مدل انعطافپذیرتری نسبت به مدل پیشفرض باشد، بنابراین مدل میتواند هر تعداد الگوی ممکنی را ثبت کند. اکنون که ایده مشخصی از تاثیر اولویت شکل گرفت، میتوان به صورت عددی مقادیر گوناگون را با استفاده از مجموعه دادههای آموزش و اعتبارسنجی ارزیابی کرد.
:[In[6
1amazon.changepoint_prior_validation(start_date='2016-01-04', end_date='2017-01-03', changepoint_priors=[0.001, 0.05, 0.1, 0.2])
:[Out[6
1Validation Range 2016-01-04 to 2017-01-03.
2
3 cps train_err train_range test_err test_range
40.001 44.507495 152.673436 149.443609 153.341861
50.050 11.207666 35.840138 151.735924 141.033870
60.100 10.717128 34.537544 153.260198 166.390896
70.200 9.653979 31.735506 129.227310 342.205583
اکنون باید مواظب بود که دادههای اعتبارسنجی مشابه دادههای تست نباشند. اگر این اتفاق بیافتد ظاهرا به نظر میرسد که بهترین مدل برای دادهها ساخته شده اما در حقیقت بیشبرازش دادههای تست اتفاق افتاده و مدل نمیتواند برای دادههای جهان واقعی مورد استفاده قرار بگیرد. در کل، همانطور که معمولا در علم داده انجام میشود، از سه مجموعه متفاوت از دادهها استفاده خواهد شد: مجموعه دادههای آموزش (سالهای ۲۰۱۳ الی ۲۰۱۵)، مجموعه ارزیابی (مربوط به سال ۲۰۱۶) و مجموعه داده تست (متعلق به سال ۲۰۱۷).
چهار سنجه اولویت ارزیابی شدند: خطاهای آموزش، فاصله آموزش (فاصلههای اطمینان)، خطاهای تست و بازه تست (فاصلههای اطمینان) و در کلیه این سنجهها همه مقادیر به دلار است. همانطور که در گراف مشهود است، هرچه اولویت بیشتر باشد خطای آموزش و عدم قطعیت روی دادههای آموزش کمتر است. همچنین، میتوان مشاهده کرد که اولویت بالاتری برای کاهش خطای تست وجود دارد، و اثباتی است بر شهود انجام شده مبنی بر آنکه دادههایی که از نزدیک برازش شدهاند برای سهام مناسبتر هستند.
در مبادله به منظور کسب صحت بالاتر، بازه بزرگتری از عدم قطعیت روی دادههای تست با اولویت افزایش یافته دریافت میشود. ارزیابی پیشین Stocker نیز دو نمودار را نمایش میدهد که نقاط زیر را به تصویر میکشند.
به دلیل اینکه بالاترین اولویت کمترین نتیجه آزمون را در پی داشته، باید برای افزایش اولویت تلاش کرد تا متوجه شد که آیا بدین شکل کارایی بهتری حاصل میشود یا خیر. میتوان نتایج جستوجو را با پاس دادن مقادیر افزوده به متد ارزیابی پالود.
:[In[7
1# test more changepoint priors on same validation range
2amazon.changepoint_prior_validation(start_date='2016-01-04', end_date='2017-01-03', changepoint_priors=[0.15, 0.2, 0.25,0.4, 0.5, 0.6])
خطای مجموعه تست در اولویت ۰.۵ حداقل شده است. ویژگی اولویت نقطه تغییر برای شی Stocker به شکل مناسبی تنظیم میشود.
:[In[8
1amazon.changepoint_prior_scale = 0.5
تنظیمات دیگری برای مدل وجود دارد که کاربر میتواند آنها را پیکربندی کند، از این جمله میتوان به الگوهایی که انتظار میرود دیده شوند یا تعداد سالهای دادههای تست که مدل استفاده میکند اشاره کرد. پیدا کردن بهترین ترکیب نیازمند تکرار روال بالا با مقادیر متفاوت است. به مخاطبان این مطلب توصیه میشود روال بیان شده در بالا را با مقادیر متفاوت تکرار کنند.
ارزیابی مدل پالایش شده
اکنون که مدل بهینه شده، میتوان مجددا آن را ارزیابی کرد.
:[In[9
1amazon.evaluate_prediction()
:[Out[9
1Prediction Range: 2017-01-18 to 2018-01-18.
2
3Predicted price on 2018-01-17 = $1164.10.
4Actual price on 2018-01-17 = $1295.00.
5
6Average Absolute Error on Training Data = $10.22.
7Average Absolute Error on Testing Data = $101.19.
8
9When the model predicted an increase, the price increased 57.99% of the time.
10When the model predicted a decrease, the price decreased 46.25% of the time.
11
12The actual value was within the 80% confidence interval 95.20% of the time.
بهتر به نظر میرسد. این نشانگر اهمیت بهینهسازی مدل است. استفاده از مقادیر پیشفرض حدسهای اولیه منصفانهای را فراهم میکند، اما نیاز به حصول اطمینان از آن است که از تنظیمات مدل صحیحی استفاده میشود، همانطور که یک صدای استریو با تنظیم موارد گوناگون بهینه میشود.
بازی با بازار بورس
انجام پیش بینی بورس یک تمرین جالب است، اما جذابیت واقعی نگاه کردن به این است که چگونه این پیشبینیها در بازار واقعی نقشآفرین هستند. با استفاده از متد evaluate_prediction میتوان با بازار بورس با استفاده از مدل موجود در طول دوره ارزیابی بازی کرد. در ادامه از استراتژی که اطلاعات آن از مدل موجود به دست آمده استفاده خواهد شد. این استراتژی با استراتژی ساده خرید و نگهداری سهام در طول کل دوره قابل مقایسه است.
قواعد این استراتژی واضح و به شرح زیر هستند:
- برای هر روزی که مدل افزایش بورس را پیشبینی میکند، میتوان سهام را در آغاز روز خرید و در پایان روز آن را فروخت. هنگامی که مدل پیشبینی میکند که قیمت بورس کاهش پیدا میکند نباید هیچ سهامی خرید.
- اگر سهامی توسط فرد خریده شود و قیمت آن در طول روز افزایش پیدا کند، به میزان افزایش در تعداد سهامهای خریداری شده آورده وجود خواهد داشت.
- اگر سهام توسط فرد خریداری شود و قیمت آن کاهش پیدا کند به میزان کاهش در تعداد سهامها پول از دست میرود.
این بازی باید هر روز در کل دوره ارزیابی انجام شود. در این مثال دوره برابر با سال ۲۰۱۷ است. برای انجام بازی، تعداد سهامها به فراخوانی متد داده میشوند. Stocker کاربر را از نتیجه استراتژی خود با اعداد و ارقام و نمودارها آگاه میکند.
:[In[10
1# Going big
2amazon.evaluate_prediction(nshares=1000)
:[Out[10
You played the stock market in AMZN from 2017-01-18 to 2018-01-18 with 1000 shares. When the model predicted an increase, the price increased 57.99% of the time. When the model predicted a decrease, the price decreased 46.25% of the time. The total profit using the Prophet model = $299580.00. The Buy and Hold strategy profit = $487520.00. Thanks for playing the stock market!
این خروجی یک درس قابل توجه به همراه دارد: بخر و نگه دار! در حالیکه با استراتژی پیشتر مطرح شده میشد مقدار قابل توجهی دستاورد داشت، بهترین راهکار آن است که برای مدت طولانی سرمایهگذاری انجام شود. میتوان دیگر دوره تست را نیز امتحان کرد تا مشاهده شود که آیا زمانهایی وجود دارد که استراتژی مدل موجود بر متد خرید و نگهداری غلبه کند یا خیر.
استراتژی موجود محافظهکارانه است زیرا کاربر هنگامی که میداند بازار کاهش پیدا میکند وارد بازی نمیشود، بنابراین انتظار میرود هنگامی که بازار کاهش پیدا کرد عملکرد بهتری نسبت به زمانی که از استراتژی خریدن و نگه داشتن استفاده میشود داشته باشد.
پیشبینی آینده
اکنون که مشخص شد مدل موجود به اندازه کافی خوب است، میتوان با استفاده از متد ()predict_future به پیشبینی آینده پرداخت.
1amazon.predict_future(days=10)
2amazon.predict_future(days=100)
این مدل برای سهام آمازون اغلب صعودی است زیرا حرفهایترینها در آن حضور دارند. علاوه بر این، عدم قطعیت در طول زمان (که کاربر آنچنانکه انتظار میرود تخمین میزند) افزایش پیدا میکند. در واقعیت، اگر از این مدل برای تجارت فعالانه استفاده شود، یک مدل جدید هر روز آموزش داده میشود و در آینده میتواند پیش بینی بورس را برای حداکثر یک روز انجام دهد.
با وجود آنکه ممکن است کسی با ابزار Stocker پولدار نشود، اما سود واقعی در ساخت و توسعه مدل است نه خروجی نهایی آن. تا هنگامی که مدل در واقعیت امتحان نشود نمیتوان فهمید که توانسته مسالهای را حل کند یا خیر، اما امتحان کردن و شکست خوردن بهتر از هیچ کاری نکردن است. افرادی که علاقمند به توسعه این مدل یا ساخت مدل اختصاصی خود بر اساس آن هستند میتوانند کد Stocker را در گیتهاب پروژه (+) بررسی کنند.
اگر نوشته بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- آموزش تحلیل و پیشبینی سریهای زمانی
- آموزش بهینهسازی سبد سهام با استفاده از روشهای بهینهسازی کلاسیک و هوشمند
- آموزش مبانی و روشهای اقتصاد سنجی با Eviews
- آموزش تحلیل پوششی دادهها یا DEA به همراه پیادهسازی عملی در متلب
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
^^
ایا این روش در بورس ما کاربرد داره ؟ یعنی دیتای بورس خودمون رو میتونیم با این روش انالیز کنیم ؟ اگر نه انتشار این مطلب واقعا چه نفعی داره .
سلام
چرا کتابخونه برای من کامل نصب نمی شه
یعنی Stocker رو پیدا نمی کنه
خانم حصارکی شما بهترین محتواها رو تولید میکنید , مخاطبین دقت میکنند و پیگیری , درود بر شما.
بله واقعا همینطوره که ایشون گفتن- عجب مطلب جالبی بود
سلام چگونه میشه اطلاعات از سازمان بورس تهران گرفت ؟
سلام آیا میشه از این برای تحلیل بورس ایران استفاذه کرد؟