شاخص هر بورس، میتواند نمایندهی خوبی برای نمایش میزان رشد سهامهای موجود در بورس و خوب و یا بد بودن وضعیت سرمایهگذاری در آن باشد. این شاخص در طول زمان نوساناتی را تجربه میکند که بسیاری از متخصصین بر این باور هستند، که این نوسانات در شرایط عادی از الگوهای مشخصی پیروی میکنند. حتی برخی از این الگوها به صورت فرموله شده نیز تحت عنوان «تحلیل تکنیکال بورس» تبیین شده است. اگر این فرض را بپذیریم، پس باید بتوانیم با کنکاش در گذشته شاخص یک بورس، آینده نوسانات آن را پیشبینی کنیم. تکنیکهای هوش مصنوعی و یادگیری ماشین هم میتوانند یک ابزار بسیار قدرتمند در استخراج الگو و پیشبینی آینده بازار بورس باشند. چیزی که هدف از این پروژه خواهد بود، شکل ساده شدهای از مسئله پیشبینی شاخص بورس میباشد، آن هم این که با مشاهده وضعیت شاخص بورس در بازههای مشخص زمانی گذشته (مثلا هفتههای پیش)، پیشبینی کنید که آیا شاخص بورس در بازه زمانی پیش رو (هفته آتی) مثبت است یا منفی. در واقع مسئله در این پروژه یک ردهبندی دو کلاسه خواهد بود، که دادههای آن مربوط به شاخص بورس هستند. مجموعه دادههای متعددی در این زمینه وجود دارد که از یکی از آنها برای انجام پروژه میتوانید استفاده کنید. مثلا مجموعه داده شاخص بورس داوجونز.
۱. مقدمه
در ابتدای سال 2008 میلادی حجم سرمایه بازار بورس ایالات متحده امریکا به 36.6 تریلیون دلار رسید و در همین زمان حجم سرمایه بازارهای بورس جهان 731 تریلیون دلار تخمین زده شد که حجم قابل توجهی است.
با توجه به این اعداد و ارقام مساله زمان خرید و فروش سهام به یکی از چالش برانگیز ترین موضوعات تبدیل شده است؛ حال مساله بزرگتر این است که آیا راهی وجود دارد که بهترین زمان را برای خرید و فروش انتخاب کنیم ، جواب این است که بله راه هایی وجود دارد که ما از بهترین زمان ها برای خرید و فروش آگاه شویم؛اما چگونه؟برای این کار دو روش وجود دارد:
1) تحلیل بنیادی : این تحلیل که بیشتر مخصوص مدیران مالی است که توانایی تجزیه و تحلیل گزارشات مالی را دارند و میتوانند با استفاده از این گزارشات به پیش بینی راجع به آینده شاخص بورس برسند.علاوه بر این نرخ سهام یک شرکت فقط به مسائل مالی آن شرکت وابسته نیست. بلکه عواملی از قبیل خبر های انتشار یافته ، شرایط اجتماعی ، مالی و سیاسی موجود در جامعه و ... میتوانند در ارزش سهام سهیم باشند.
2) تحلیل تکنیکال:[6] این تحلیل شامل بررسی و تجزیه و تحلیل نمودارهای ارزش سهام میباشد؛ از آنجایی که این نمودار ها با روند خاصی ادامه مییابند پس با تجزیه و تحلیل آنها میتوانیم ادامه یک نمودار را پیش بینی کنیم. [1]
از آنجایی که تجزیه و تحلیل این نمودار ها برای انسان کار زیاد آسانی نیست به دنبال این است که این وظیفه را به کامپیوتر محول کند . پس اکنون ما میتوانیم با استفاده از روش های هوش مصنوعی از کامپیوتر برای تجزیه و تحلیل نمودار ها استفاده کنیم.
۲. 1. مسئله و راهکار ها
هدف مسئله: هدف ما همانطور که درقسمت مقدمه گفته شد پیدا کردن روشی است که با استفاده از روش های هوش مصنوعی و بخصوص شبکه های عصبی بتواند با استفاده از تحلیل تکنیکال یا همان تجزیه و تحلیل نمودار های ارزش سهام پیش بینی برای آینده این سهام انجام دهد.البته اگر بخواهیم هدف مسئله را به صورت دقیق تر بررسی کنیم باید بگوییم که ایده آل ما در این پروژه این است که بتوانیم به یک برنامه دست یابیم که بتواند زمان خرید و فروش سهام های مختلف را به کاربر بدهد و همچنین بتواند آینده را برای یک سهام مشخص کند. این همان کاری است که تحلیل گران بازار بورس انجام میدهند.
راهکار حل مسئله : راهکاری که ما در این پروژه قصد استفاده از آن را داریم استفاده از روش شبکه های عصبی مصنوعی میباشد. و همچنین برای استفاده از این روش از الگوریتم ژنتیک و بازگشت به عقب نیز کمک میگیریم.[2]
شرح راهکار:
1)شبکه های عصبی مصنوعی[3]: در ابتدا توضیح خلاصه ای راجع به شبکه های عصبی مصنوعی و الگوریتم ژنتیک میدهیم وسپس به شرح راهکار میپردازیم.
روش شبکه های عصبی اصولا از شبکه های عصبی موجود در مغز الهام گرفته شده است. شبکه های عصبی داخل مغز انسان بدین صورت کار میکنند که یکسری داده وارد این شبکه میشود و بعد از پردازش با استفاده از الگوهای خاصی این داده ها به خروجی منتقل میشوند.مجموعه این اعمال باعث حل یک مسئله میشود، و ما اکنون نیز میخواهیم با شبیه سازی این شبکه های عصبی به صورت مصنوعی مسئله پیش بینی شاخص بورس را حل کنیم.
شبکه های عصبی از سه سطح اصلی تشکیل شده اند : سطح ورودی ، سطح پنهان ، سطح خروجی
شبکه عصبی 4 وظیفه مهم دارد که عبارتنداز:
هر شبکه عصبی شامل چندین واحد پردازش میباشد که هرکدام از این پردازشگر ها در هر سطح و در هر زمانی کار به خصوص خود را انجام میدهند.
ارتباط وزن دار بین سطح های مختلف و پردازشگرهای مختلف است که باعث میشود نتیجه کار یکی بر کار دیگری تاثیر گذارد.
قانون عملکرد پردازشگر است که مشخص میکند یک سیگنال ورودی به چه سیگنال خروجی تبدیل شود.
قوانین یادگیری است که مشخص میکند با چه احتمالی اطلاعات به چه پردازشگری فرستاده شود.
اثبات شده است که اگر تعداد سطح های لایه پنهان به 3 برسد تقریبا هرگونه داده ای را میتوان طبقه بندی و تجزیه کرد.
شرح الگوریتم ژنتیک: این الگوریتم یک الگوریتم جستوجو میباشد که قابلیت این را داردکه بهترین راه حل را برای مسائل پیدا کند. این الگوریتم بسیار شبیه الگوریتم های به کار برده شده در بدن انسان و حتی در محیط بیرون میباشد . از جمله وراثت ، جهش و سایر عملکرد هایی که در محیط و در انسان رخ میدهد.
در این الگوریتم از چند پارامتر استفاده میکنیم از جمله تابع برازش1 ، میزان تاثیر گزاری در پیش بینی 2 .
در این الگوریتم ما تغییراتی را روی ورودی اعمال میکنیم و این تغییرات را آنقدر ادامه میدهیم که تا به داده ای که مد نظرمان است برسیم.
این تغییرات شامل جابجایی بعضی از بیت های اطلاعات و شاید تغییر کامل یک قسمت از اطلاعات باشد.که به مورد اولی جابجایی3 و به مورد دوم جهش 4 میگویند.
{ p }_{ i }=\frac { { f }_{ i } }{ \sum _{ j=1 }^{ n }{ { f }_{ i } } }
که دراینجا f همان مقدار مناسب و p مقدار اندکی است که به اطلاعات ما در هر مرحله اضافه میشود؛و n نیز کل جامعه انتخابی ما میباشد که در این جا برابر 100 میباشد.
فرض مسئله: ابتد باید فرض هایی را برای مسئله خود متصور شویم و سپس به حل آن بپردازیم. ابتدا فرض میکنیم که 8 شرکت با ارزش سهام های متفاوت وجود دارند که قیمت سهام آنها را از 6 جنبه میتوان مورد بررسی قرار داد. حال باید ببینیم که هرکدام از این صفت ها چقدر در پیش بینی ما تاثیر گذارند که این همان مقدار تاثیر گذار میباشد؛ و سپس باید مقدار مناسب را بدست آوریم که این مقدار مناسب برابر است با تعداد دفعاتی که ما توانسته ایم برای هر صفت پیش بینی درستی انجام دهیم.
شرح الگوریتم اصلی[3]:حال که با شبکه های عصبی و الگوریتم ژنتیک آشنا شدیم میتوانیم به حل مسئله بپردازیم.
بعد از این که ما با استفاده از الگوریتم ژنتیک توانستیم مقدار تاثیر گذاری هر صفت را پیدا کنیم و با آزمایشات پی در پی مقدار مناسب را پیدا کردیم وقت آن است که پیش بینی کنیم که آیا ارزش سهام بورس این شرکت ها حرکت صعودی دارند یا نزولی ! که این پیش بینی نیز با استفاده از فرمول زیر که نشئت گرفته از شبکه های عصبی میباشد قابل انجام است.
t\quad =\quad \sum _{ i=1 }^{ 6 }{ { p }_{ i }*{ f }_{ i } }
{ p }(t)=\frac { 1 }{ 1+{ e }^{ -t } }
که در این فرمول ها p برابر بامقدار تاثیر گذاری صفت در پیش بینی میباشد و f مقدار تخمین زده شده برای آن صفت و t نیز یک متغیر است که در فرمول اول تعریف شده است و در تعریف دوم استفاده شده است.
ما برای آزمایش این روش از دو مجموعه اطلاعاتی5 استفاده میکنیم که مطمئن شویم اطلاعاتی که از این الگوریتم بدست میآوریم درست است.
مجموعه اطلاعاتی: مجموعه اطلاعاتی ما شامل اطلاعات بازار بورس 5 سال شرکت های اپل،گوگل ،مایکروسافت، Oracle،Symantec،Sony،IBM Adobe میباشد.
نتیجه : نتیجه ای که پژوهشگران این تحقیق بدست آوردند این بود که الگوریتم ژنتیک توانسته بود با دقت 73.87 درصد ارزش سهام بورس این شرکت هارا به درستی تشخیص دهد و این نتیجه نشان دهنده این است که الگوریتم ژنتیک به عنوان یک الگوریتم کارآمد میتواند عمل پیش بینی را انجام دهد.
دقت پیش بینی روی داده های ثانویه | دقت پیش بینی روی داده های اولیه | نام شرکت |
---|---|---|
73.22% | 72.09% | Adobe |
70.80% | 73.70% | Apple |
69.35% | 75.00% | |
70.80% | 70.64% | IBM |
70.32% | 75.32% | Microsoft |
72.90% | 71.77% | Oracle |
69.51% | 66.45% | Sony |
73.87% | 70.96% | symantec |
شاید برای شما خیلی عجیب باشد که چگونه با الگوریتم ژنتیک و بدون استفاده از هیچ گونه الگوریتم دیگری میتوانیم با این دقت آینده بورس را پیش بینی کنیم ؛ لازم است بدانید که این اتفاق بخاطر این است که افراد برای تصمیم گیری خرید سهام نیز در ذهن خود تقریبا به صورت خودکار از همین الگوریتم استفاده میکنند. و شرایط اجتماعی و سیاسی محیط نیز تقریبا بر اساس همین الگوریتم ژنتیک کار میکنند . پس ما میتوانیم با کمال آرامش از این الگوریتم استفاده کنیم
۳. 2.کارهای مرتبط
نویسندگان این مقاله همچنین از روش دیگری برای پیش بینی ارزش سهام استفاده کردند با نام استراتژی ارزیابی6 که پایه آن بر روی مقادیر تکرار شونده و مدوام است . در عین حال که این الگوریتم دارای ساختار پیچیده تری نیز هست ولی دقت الگوریتم ژنتیک همچنان بالا تر از این الگوریتم است.
الگوریتم دیگری در زمینه پیش بینی شاخص وجود دارد به نام روش عقبگرد 7و تفاوت این روش با روش قبل این است که برای پیش بینی در این الگوریتم باید مستقیما به نتیجه پیش بینی های گذشته بازگردیم و با توجه به آنها پیش بینی کنیم.'[4]
در سال 2007 نیز تحقیقاتی راجع به مشکلات سیستم شبکه عصبی بیان شد که از جمله آن میتوان به نادیده گرفتن بعضی شرایط برای پیش بینی ارزش سهام اشاره کرد.[5].
۴. 3 . آزمایشها
در این قسمت قصد داریم که انچه را که در بالا به صورت تئوری توضیح دادیم را به طور عملی اجرا و آزمایش کنیم.برای اینکار درابتدا از روش انتشار به عقب یا back propagation (در پایین به صورت مفصل بحث خواهد شد)استفاده میکنیم.و سپس برای رفع بعضی نواقص از روش دوم که الگوریتم Resilient back propagation algorithm استفاده میکنیم
3.1دادگان:
دادگان آزمایش مرحله اول: برای انجام این آزمایش ها باید از دادگانی معتبر استفاده کنیم . داده هایی که در آزمایش اول استفاده میشود S&P500(شاخص بورس 500 شرکت برتر ) آمریکا و ... میباشد. و برای محاسبه و پیاده سازی راحت تر فقط از میانگین ارزش شاخص روز برای پیش بینی استفاده میکنیم و از قیمت بازگشایی و قیمت بسته شدن و همچنین قیمت ماکزیمم و مینیموم چشم پوشی میکنیم.البته این چشم پوشی ها باعث میشود از دقت پیش بینی ما کاسته شود که ما این کاهش دقت را با افزایش داده های تمرینی جبران میکنیم که در هنگام پیش بینی داده نهایی بتوانیم از عهده این کار به خوبی برآییم.
دادگان آزمایش مرحله دوم: برای این که بتوانیم به خوبی این روش را بررسی کنیم؛ این روش را با چهار داده متفاوت چک میکنیم و نیز برای اطمینان در یادگیری از داده های سال 1928 تا 2011 در این آزمایش استفاده میکنیم که عبارتند از:
S&P500: شاخص بورس 500 شرکت برتر بازار بورس آمریکا
DOW JONES: شاخص بورس شرکت های صنعتی آمریکا
NASDAQ Composite : شاخص بورس 3000 شرکت برتر الکترونیکی
Prime Interest Rate:شاخص بورس سهام های بانکی
در این روش دیگر از قیمت باز شدن هرروز و بسته شدن آن چشم پوشی نمیکنیم و این باعث دقت بیشتر و البته کاهش سرعت میشود که درصورت اجرا کردن آن خودتان به این موضوع پی خواهید برد.
3.2شرح پیاده سازی:
پیش پردازش داده ها:در این قسمت باید اول داده هارا نرمال کنیم یا به عبارتی باید توسط یک تابع انها را به اعدادی تبدیل کنیم که همگی بین صفر و یک باشند. ما این کار را با استفاده از تابع زیر انجام میدهیم.
Index(x) = (Index(x) - Min(Index))/(Max(Index) - Min(Index)
این کار بدین خاطر انجام میشود که پراکندگی داده ها کم شود. بعد از انجام این عملیات روی داده ها اطلاعات به شکل زیر در میآیند . برای درک بهتر خوانندگان داده ها توسط matlab به صورتی که در شکل زیر مشاهده میکنید نمایش میدهیم.
3.2.1شرح پیاده سازی و آزمایش مرحله اول:
در این قسمت پیاده سازی به زبان java و به کمک کتابخانه neuroph انجام شده است و فایل مربوط به پیاده سازی در سایت گیت هاب موجود میباشد. پس از این که داده های خود را نرمال کردیم . حال نوبت به یادگیری است . در آزمایش مرحله اول داده های ما به دو دسته تقسیم میشوند ، داده هایی برای یادگیری و داده هایی برای تست کردن برنامه می باشد. اطلاعات مربوط به ارزش شاخص در سالهای 2013 و 2014 را به داده های یادگیری اختصاص داده و از اطلاعات سال 2015 برای تست کردن برنامه استفاده میشود.
چگونگی عمل یادگیری:همانطور که در ابتدا توضیح داده شد در آزمایش مرحله اول به صورت ابتدایی و توسط الگوریتم انتشار به عقب8 یادگیری را انجام میدهیم . و این روش بدین گونه عمل میکند که در هر بار عمل یادگیری یادداشتی از عمل های خود و همچنین نتیجه پیش بینی برمیدارد که اگر درآینده موقعیت مشابهی به وجود آمد در صورت موفقیت در انجام پیش بینی قبلی از همان پیش بینی دوباره استفاده کند تا باز هم به موفقیت برسد . در این روش ابتدا 5 داده اولیه را برمیداریم و چون هنوز اولین بار است به طور تصادفی داده ششم یاهمان شاخص روز بعد را حدس میزنیم و این مقدار را با مقدار اولین داده سطر بعد یاهمان قیمت واقعی شاخص بورس در روز ششم مقایسه میکنیم و اگر این دوعدد همگرایی خوبی باهم داشته باشند میتوانیم بگوییم توانسته ایم پیش بینی مناسبی انجام دهیم و به موفقیت رسیده ایم و در غیر این صورت یعنی ما نتوانسته ایم قیمت خوبی تخمین بزنیم؛ ما به این کار ادامه میدهیم و هر بار 5 داده را انتخاب میکنیم و با استفاده از تجربه پیش بینی های گذشته و همچنین شانس پیش بینی جدیدی انجام میدهیم.برای درک بهتر خوانندگان عکسی از جدول به وجود امده بعد از انجام عمل یادگیری در پایین نمایش داده شده است.ضمنا این نکته نیز قابل توجه است که برنامه در هر بار که داده ای را تخمین میزند میزان خطای تخمین را برای کاربر نیز نمایش میدهد و یادگیری را تا زمانی ادامه میدهد که درصد خطای برنامه از مقداری که خود برنامه تشخیص میدهد پایین تر بیاید و نیز حداکثر به تعدادی یادگیری انجام میدهد که ما به عنوان برنامه نویس به آن بگوییم.
پیش بینی:بعد از این که داده ها را مورد یادگیری قراردادیم حال موقع امتحان است. اکنون باید به صورت دستی پنج مقدار را به برنامه خود بدهیم و برنامه با توجه به آنچه که آموخته عدد ششم یا همان قیمت تخمینی شاخص را به ما می دهد و ما نیز باید تا فردای آن روز صبر کنیم تا ببینیم که برنامه به ما قیمت درست داده است یا نه! البته چون ما داده های یک سال را در اختیار داریم نیاز به صبر کردن تا فردا نیست و میتوانیم میزان خطای برنامه را هم اکنون بسنجیم.
مشکلات این روش :از جمله مشکلات این روش میتوان به اشغال کردن فضای بسیار زیاد برای ثبت کردن تجربه های پیشین و ناسازگاری درصورت تغییر شدید قیمت ها به دلیل مشکلات سیاسی و اجتماعی و ...اشاره کرد .
ارزیابی :پس از پایان کار برنامه ،کار ارزیابی شروع میشود . در این قسمت باید نتایج پیش بینی را با مقدار حقیقی مقایسه کنیم و میزان خطا را بدست بیاوریم که نتیجه آن نمودار و شکل زیر میشود . اگر ما 5 داده اول که در جدول زیر است را به برنامه بدهیم خروجی آن برابر شکل 5 خواهد شد.
4/2/2015 | 4/1/2015 | 3/31/2015 | 3/30/2015 | 3/29/1015 | 3/28/2015 | تاریخ |
---|---|---|---|---|---|---|
2066.96 | 2059.69 | 2067.89 | 2086.24 | 2061.02 | 2056.15 | قیمت شاخص s&p500 |
حال اگر برنامه را چندین بار اجرا کنیم میبینیم که داده های غیر یکسان تولید میشوند و باعث ایجاد نموداری همانند نمودار زیر میشود.
و اگر همین کار را برای تاریخ دیگری انجام دهیم مشاهده میکنیم که نمودا آ ن به شکل زیر خواهد شد.
و برای این آزمایشات محدود نیز درصد خطا برابر است با:
eror% = (2066.96-2061.62)/2066.96 = 0.2%
که البته همین میزان درصد خطا هم برای مسائل مالی موضوع قابل اهمیتی محسوب میشود.
3.2.2شرح پیاده سازی و آزمایش مرحله دوم:
در این قسمت پیاده سازی به وسیله زبان c# و به کمک کتابخانه Encog انجام شده است و فایل های مربوط به پیاده سازی در گیت هاب موجود میباشد.
در قسمت قبل گفتیم که یکی از مشکلات انتشار به عقب این است که فضای زیادی را اشغال میکند پس اگر ما بتوانیم زمان و میزان تکرار یادگیری خود را به نحوی صحیح کنترل کنیم میتوانیم تا حد خوبی از این اشغال فضا جلوگیری کنیم. برای این کنترل لازم است که برنامه بداند چه درصد خطایی به عنوان درصد خطای مینیموم شناسایی میشود تا بتواند به محض رسیدن به آن پایان یادگیری را اعلام کند. ما برای رسیدن به این مقصود از Resilient algorithm استفاده میکنیم .
پس تا اینجا به این نتیجه رسیدیم که برای پیش بینی شاخص بورس روش انتشار به عقب روش مناسبی است ولی در صورتی که ما مینیموم خطا را به درستی انتخاب کرده باشیم .
به طور معمول در روش انتشار به عقب تا زمانی ادامه میدهیم که همچنان راهی برای رسیدن به مینیموم پایینتر نیز باشد. ولی احتمال این که ما در مینیموم های محلی گرفتار شویم زیاد است . ما برای این که این احتمال را کم کنیم از روش Resilient algorithm استفاده میکنیم که بجای انتخاب پایین ترین نقطه به علامت نقطه توجه میکند . یعنی صرفا توجه میکند که نقطه بالاتر است یا پایین تر و اگر پایین تر بود میتواند آن را به عنوان نقطه مینیموم انتخاب کند. در این روش احتمال به دام افتادن در مینیموم های محلی کمتر می شود.البته این روش نیز مانند روش قبلی همچنان مشکل ناسازگاری با تغییرات شدید را دارد.
تفاوت مرحله اول و دوم فقط در استفاده از resilient algorithm و بعضی جزئیات مانند مقدار و نوع داده های تمرینی میباشد ؛ پس برای پرهیز از زیاده گویی بخش های دیگر را دوباره تکرار نمیکنیم و به سراغ ارزیابی میرویم.
ارزیابی :
پس از اجرای برنامه در سربرگ train به انتخاب خودمان داده های ورودی را انتخاب میکنیم. و پس از آن مشخص میکنیم که عمل یادگیری از چه تاریخی تا چه تاریخی انجام شود. و سپس در سربرگ predict میتوانیم با فشردن دکمه predict عمل پیش بینی را انجام دهیم و در نهایت نتیجه ایجاد شده را با فشردن دکمه export در پوشه ای ذخیره می کنیم.با تجزیه تحلیل نتایج گزارش به نمودار های زیر دست مییابیم
با توجه به نمودار های بالا متوجه میشویم که این برنامه علی رغم این که از الگوریتم هوشمند تری استفاده میکند ولی بخاطر این که در انتخاب مینیموم نقطه بخاطر ترس از افتادن در دام محتاطانه و طبق علامت عمل میکند از دقت پایین تری برخوردار است و اگر درصد خطای آن را نیز محاسبه کنیم به عدد 2% میرسیم که 10 برابر درصد خطای روش قبل میباشد .
نتیجه ارزیابی :پس از اینکه آزمایشات را ارزیابی کردیم به این نتیجه میرسیم که بدلیل اهمیت بالای درصد خطا در پیش بینی های مالی بهتر است که ما هر آنچه از منابع مانند فضای حافظه و زمان را صرف کنیم ولی نتیجه پیش بینی دقیق تر بدست آید.
۵. کارهای آینده
۶. مراجع
[1]Yuzheng Zhai, Arthur Hsu, and Saman K Halgamuge(2007)Combining News and Technical Indicators in
Daily Stock Price Trends Prediction
[2]Ganesh Bonde,Rasheed Khaled , Stock price prediction using genetic algorithms and evolution
strategie
[3]Dr. Sunil Kumar Dhal, Artificial Neural Network (ANN) for Stock Market Predictions
[4]Lev Blynski and Alex Faseruk (2006) Journal of Financial Management and Analysis,19 (2), 46-58.
[5]Olivier Coupelon (2007) Neural network Modeling for Stock Movement Prediction, 11.
[6]کتاب تحلیل تکنیکال بازار سرمایه نوشته دکتر لنگرودی،مقدمه
پیوندهای مفید
fitness value
connection weight
crossover
mutation
data set
Evolution Strategies
backpropogation
back propagation