پیش‌بینی شاخص بورس

تغییرات پروژه از تاریخ 1394/11/05 تا حالا
شاخص هر بورس، می‌تواند نماینده‌ی خوبی برای نمایش میزان رشد سهام‌های موجود در بورس و خوب و یا بد بودن وضعیت سرمایه‌گذاری در آن باشد. این شاخص در طول زمان نوساناتی را تجربه می‌کند که بسیاری از متخصصین بر این باور هستند، که این نوسانات در شرایط عادی از الگوهای مشخصی پیروی می‌کنند. حتی برخی از این الگوها به صورت فرموله شده نیز تحت عنوان «تحلیل تکنیکال بورس» تبیین شده است. اگر این فرض را بپذیریم، پس باید بتوانیم با کنکاش در گذشته شاخص یک بورس، آینده نوسانات آن را پیش‌بینی کنیم. تکنیک‌های هوش مصنوعی و یادگیری ماشین هم می‌توانند یک ابزار بسیار قدرتمند در استخراج الگو و پیش‌بینی آینده بازار بورس باشند. چیزی که هدف از این پروژه خواهد بود، شکل ساده شده‌ای از مسئله پیش‌بینی شاخص بورس می‌باشد، آن هم این که با مشاهده وضعیت شاخص بورس در بازه‌های مشخص زمانی گذشته (مثلا هفته‌های پیش)، پیش‌بینی کنید که آیا شاخص بورس در بازه زمانی پیش رو (هفته آتی) مثبت است یا منفی. در واقع مسئله در این پروژه یک رده‌بندی دو کلاسه خواهد بود، که داده‌های آن مربوط به شاخص بورس هستند. مجموعه داده‌های متعددی در این زمینه وجود دارد که از یکی از آن‌ها برای انجام پروژه می‌توانید استفاده کنید. مثلا [مجموعه داده شاخص بورس داوجونز](https://archive.ics.uci.edu/ml/datasets/Dow+Jones+Index).  

# مقدمه
در ابتدای سال 2008 میلادی حجم سرمایه بازار بورس ایالات متحده امریکا به 36.6 تریلیون دلار رسید و در همین زمان حجم سرمایه بازارهای بورس جهان 731 تریلیون دلار تخمین زده شد که حجم قابل توجهی است.
با توجه به این اعداد و ارقام مساله زمان خرید و فروش سهام به یکی از چالش برانگیز ترین موضوعات تبدیل شده است؛ حال مساله بزرگتر این است که آیا راهی وجود دارد که بهترین زمان را برای خرید و فروش انتخاب کنیم ، جواب این است که بله راه هایی وجود دارد که ما از بهترین زمان ها برای خرید و فروش آگاه شویم؛اما چگونه؟برای این کار دو روش وجود دارد:
**1) تحلیل بنیادی :** این تحلیل که بیشتر مخصوص مدیران مالی است که توانایی تجزیه و تحلیل گزارشات مالی را دارند و می‌توانند با استفاده از این گزارشات به پیش بینی راجع به آینده شاخص بورس برسند.علاوه بر این نرخ سهام یک شرکت فقط به مسائل مالی آن شرکت وابسته نیست. بلکه عواملی از قبیل خبر های انتشار یافته ، شرایط اجتماعی ، مالی و سیاسی موجود در جامعه و ... می‌توانند در ارزش سهام سهیم باشند.
**2) تحلیل تکنیکال:**[6] این تحلیل شامل بررسی و تجزیه و تحلیل نمودارهای ارزش سهام می‌باشد؛ از آنجایی که این نمودار ها با روند خاصی ادامه می‌یابند پس با تجزیه و تحلیل آنها میتوانیم ادامه یک نمودار را پیش بینی کنیم. [1]
از آنجایی که تجزیه و تحلیل این نمودار ها برای انسان کار زیاد آسانی نیست به دنبال این است که این وظیفه را به کامپیوتر محول کند . پس اکنون ما می‌توانیم با استفاده از روش های هوش مصنوعی از کامپیوتر برای تجزیه و تحلیل نمودار ها استفاده کنیم.
 
# 1. مسئله و راهکار ها
**هدف مسئله**: هدف ما همانطور که درقسمت مقدمه گفته شد پیدا کردن روشی است که با استفاده از روش های هوش مصنوعی و بخصوص شبکه های عصبی بتواند با استفاده از تحلیل تکنیکال یا همان تجزیه و تحلیل نمودار های ارزش سهام پیش بینی برای آینده این سهام انجام دهد.البته اگر بخواهیم هدف مسئله را به صورت دقیق تر بررسی کنیم باید بگوییم که ایده آل ما در این پروژه این است که بتوانیم به یک برنامه دست یابیم که بتواند زمان خرید و فروش سهام های مختلف را به کاربر بدهد و همچنین بتواند آینده را برای یک سهام مشخص کند. این همان کاری است که تحلیل گران بازار بورس انجام می‌دهند.

**راهکار حل مسئله :** راهکاری که ما در این پروژه قصد استفاده از آن را داریم استفاده از روش شبکه های عصبی مصنوعی می‌باشد. و همچنین برای استفاده از این روش از الگوریتم ژنتیک و بازگشت به عقب نیز کمک میگیریم.[2]

**شرح راهکار:** 
**1)شبکه های عصبی مصنوعی[3]:** در ابتدا توضیح خلاصه ای راجع به شبکه های عصبی مصنوعی و الگوریتم ژنتیک می‌دهیم وسپس به شرح راهکار می‌پردازیم.
روش شبکه های عصبی اصولا از شبکه های عصبی موجود در مغز الهام گرفته شده است. شبکه های عصبی داخل مغز انسان بدین صورت کار می‌کنند که یکسری داده وارد این شبکه می‌شود و بعد از پردازش با استفاده از الگوهای خاصی این داده ها به خروجی منتقل می‌شوند.مجموعه این اعمال باعث حل یک مسئله می‌شود، و ما اکنون نیز میخواهیم با شبیه سازی این شبکه های عصبی به صورت مصنوعی مسئله پیش بینی شاخص بورس را حل کنیم.
شبکه های عصبی از سه سطح اصلی تشکیل شده اند : سطح ورودی ، سطح پنهان ، سطح خروجی
شبکه عصبی 4 وظیفه مهم دارد که عبارتنداز:
1.  هر شبکه عصبی شامل چندین واحد پردازش می‌باشد که هرکدام از این پردازشگر ها در هر سطح و در هر زمانی کار به خصوص خود را انجام می‌دهند.
2. ارتباط وزن دار بین سطح های مختلف و پردازشگرهای مختلف است که باعث می‌شود نتیجه کار یکی بر کار دیگری تاثیر گذارد.
3. قانون عملکرد پردازشگر است که مشخص می‌کند یک سیگنال ورودی به چه سیگنال خروجی تبدیل شود.
4. قوانین یادگیری است که مشخص می‌کند با چه احتمالی اطلاعات به چه پردازشگری فرستاده شود.
اثبات شده است که اگر تعداد سطح های لایه پنهان به 3 برسد تقریبا هرگونه داده ای را می‌توان طبقه بندی و تجزیه کرد.
![شکل 1- نشان دهنده سطح های مختلف در شبکه های عصبی](https://boute.s3.amazonaws.com/201-Untitled.png)
**شرح الگوریتم ژنتیک:** این الگوریتم یک الگوریتم جستوجو می‌باشد که قابلیت این را داردکه بهترین راه حل را برای مسائل پیدا کند. این الگوریتم بسیار شبیه الگوریتم های به کار برده شده در بدن انسان و حتی در محیط بیرون می‌باشد . از جمله وراثت ، جهش و سایر عملکرد هایی که در محیط و در انسان رخ میدهد.
در این الگوریتم از چند پارامتر استفاده میکنیم از جمله تابع برازش[^fitness value] ، میزان تاثیر گزاری در پیش بینی [^connection weight] . 
در این الگوریتم ما تغییراتی را  روی ورودی اعمال میکنیم و این تغییرات را آنقدر ادامه می‌دهیم که تا به داده ای که مد نظرمان است برسیم.
این تغییرات  شامل جابجایی بعضی از بیت های اطلاعات و شاید تغییر کامل یک قسمت از اطلاعات باشد.که به مورد اولی جابجایی[^crossover] و به مورد دوم جهش  [^mutation] می‌گویند.
$${ p }_{ i }=\frac { { f }_{ i } }{ \sum _{ j=1 }^{ n }{ { f }_{ i } }  }$$ 
که دراینجا f همان مقدار مناسب و p مقدار اندکی است که به اطلاعات ما در هر مرحله اضافه می‌شود؛و n نیز کل جامعه انتخابی ما می‌باشد که در این جا برابر 100 می‌باشد.
![شکل 2 - نشان دهنده چگونگی وراثت در الگوریتم ژنتیک](http://creationwiki.org/pool/images/9/90/300px-Computational.science.Genetic.algorithm.Crossover.Cut.and.Splice.svg.png)
**فرض مسئله:** ابتد باید فرض هایی را برای مسئله خود متصور شویم و سپس به حل آن بپردازیم. ابتدا فرض می‌کنیم که 8 شرکت با ارزش سهام های متفاوت وجود دارند که قیمت سهام آنها را از 6 جنبه میتوان مورد بررسی قرار داد. حال باید ببینیم که هرکدام از این صفت ها چقدر در پیش بینی ما تاثیر گذارند که این همان مقدار تاثیر گذار می‌باشد؛ و سپس باید مقدار مناسب را بدست آوریم که این مقدار مناسب برابر است با تعداد دفعاتی که ما توانسته ایم برای هر صفت پیش بینی درستی انجام دهیم.
**شرح الگوریتم اصلی[3]:**حال که با شبکه های عصبی و الگوریتم ژنتیک آشنا شدیم می‌توانیم به حل مسئله بپردازیم. 
 بعد از این که ما با استفاده از الگوریتم ژنتیک توانستیم مقدار تاثیر گذاری هر صفت را پیدا کنیم و با آزمایشات پی در پی مقدار مناسب را پیدا کردیم وقت آن است که پیش بینی کنیم که آیا ارزش سهام بورس این شرکت ها حرکت صعودی دارند یا نزولی ! که این پیش بینی نیز با استفاده از فرمول زیر که نشئت گرفته از شبکه های عصبی می‌باشد قابل انجام است.
$$ t\quad =\quad \sum _{ i=1 }^{ 6 }{ { p }_{ i }*{ f }_{ i } }$$ 
 $${ p }(t)=\frac { 1 }{ 1+{ e }^{ -t } }$$
 که در این فرمول ها p برابر بامقدار تاثیر گذاری صفت در پیش بینی می‌باشد و f مقدار تخمین زده شده برای آن صفت و t  نیز یک متغیر است که در فرمول اول تعریف شده است و در تعریف دوم استفاده شده است. 
 ما برای آزمایش این روش از دو مجموعه اطلاعاتی[^data set] استفاده می‌کنیم که مطمئن شویم اطلاعاتی که از این الگوریتم بدست می‌آوریم درست است.
 **مجموعه اطلاعاتی:** مجموعه اطلاعاتی ما شامل اطلاعات بازار بورس  5 سال شرکت های اپل،گوگل ،مایکروسافت، Oracle،Symantec،Sony،IBM   Adobe می‌باشد.
 **نتیجه :** نتیجه ای که پژوهشگران این تحقیق بدست آوردند این بود که الگوریتم ژنتیک توانسته بود با دقت 73.87 درصد ارزش سهام بورس این شرکت هارا به درستی تشخیص دهد و این نتیجه نشان دهنده این است که الگوریتم ژنتیک به عنوان یک الگوریتم کارآمد می‌تواند عمل پیش بینی را انجام دهد.
 
| دقت پیش بینی روی داده های ثانویه  | دقت پیش بینی روی داده های اولیه |نام شرکت       |
|:----------------------------------|:-------------------------------:|:-------------:|
| 73.22%                            |72.09%                           |Adobe          |
| 70.80%                            |73.70%                           |Apple          |
| 69.35%                            |75.00%                           |Google         |
| 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.کارهای مرتبط
نویسندگان این مقاله همچنین از روش دیگری برای پیش بینی ارزش سهام استفاده کردند با نام استراتژی تکامل تدریجی[^Evolution Strategies] که پایه آن بر روی مقادیر تکرار شونده و مدوام است . در عین حال که این الگوریتم دارای ساختار پیچیده تری نیز هست ولی دقت الگوریتم ژنتیک همچنان بالا تر از این الگوریتم است.
الگوریتم دیگری در زمینه پیش بینی شاخص وجود دارد به نام روش عقبگرد [^backpropogation]و تفاوت این روش با روش قبل این است که برای پیش بینی در این الگوریتم باید مستقیما به نتیجه پیش بینی های گذشته بازگردیم و با توجه به آنها پیش بینی کنیم.'[4]
در سال 2007 نیز تحقیقاتی راجع به مشکلات سیستم شبکه عصبی بیان شد که از جمله آن می‌توان به نادیده گرفتن بعضی شرایط برای پیش بینی ارزش سهام اشاره کرد.[5].

# 3 . آزمایش‌ها
در این قسمت قصد داریم که انچه را که در بالا به صورت تئوری توضیح دادیم را به طور عملی اجرا و آزمایش کنیم.برای اینکار درابتدا از روش انتشار به عقب یا back propagation (در پایین به صورت مفصل بحث خواهد شد)استفاده میکنیم.و سپس برای رفع بعضی نواقص از روش دوم که  الگوریتم [Resilient back propagation  algorithm](http://www.codeproject.com/Articles/175777/Financial-predictor-via-neural-network#resilientAlgorithm) استفاده می‌کنیم
**3.1دادگان:** 

**دادگان آزمایش مرحله اول:** برای انجام این آزمایش ها باید از دادگانی معتبر استفاده کنیم . داده هایی که در آزمایش اول استفاده می‌شود S&P500(شاخص بورس 500 شرکت برتر )  آمریکا و ... می‌باشد. و برای محاسبه و پیاده سازی راحت تر فقط از میانگین ارزش شاخص روز برای پیش بینی استفاده میکنیم و از قیمت بازگشایی و قیمت بسته شدن و همچنین قیمت ماکزیمم و مینیموم چشم پوشی می‌کنیم.البته این چشم پوشی ها باعث می‌شود از دقت پیش بینی ما کاسته شود که ما این کاهش دقت را با افزایش داده های تمرینی جبران میکنیم که در هنگام پیش بینی داده نهایی بتوانیم از عهده این کار به خوبی برآییم. 
**دادگان آزمایش مرحله دوم:** برای این که بتوانیم به خوبی این روش را بررسی کنیم؛ این روش را با چهار داده متفاوت چک می‌کنیم و نیز برای اطمینان در یادگیری از داده های سال 1928 تا 2011 در این آزمایش استفاده می‌کنیم که عبارتند از:


1. S&P500: شاخص بورس 500 شرکت برتر بازار بورس آمریکا
2.  DOW JONES: شاخص بورس شرکت های صنعتی آمریکا
3. NASDAQ Composite : شاخص بورس 3000 شرکت برتر الکترونیکی 
4. Prime Interest Rate:شاخص بورس سهام های بانکی 


در این روش دیگر از قیمت باز شدن هرروز و بسته شدن آن چشم پوشی نمیکنیم و این باعث دقت بیشتر و البته کاهش سرعت  میشود که درصورت اجرا کردن آن خودتان به این موضوع پی خواهید برد.   
****3.2شرح پیاده سازی:**** 
**پیش پردازش داده ها:**در این قسمت باید اول داده هارا نرمال کنیم یا به عبارتی باید توسط یک تابع انها را به اعدادی تبدیل کنیم که همگی بین صفر و یک باشند. ما این کار را با استفاده از تابع زیر انجام میدهیم.
Index(x) = (Index(x) - Min(Index))/(Max(Index) - Min(Index)
این کار بدین خاطر انجام می‌شود که پراکندگی داده ها کم شود. بعد از انجام این عملیات روی داده ها اطلاعات به شکل زیر در می‌آیند . برای درک بهتر خوانندگان داده ها توسط matlab به صورتی که در شکل زیر مشاهده میکنید  نمایش می‌دهیم.![نمایش داده ها پس از نرمال سازی](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=919&a=true&file=regression.jpg&t=njybGvXJeuKTxgU&scalingup=0)

**3.2.1شرح پیاده سازی و  آزمایش مرحله اول:**
 در این قسمت پیاده سازی به زبان java  و به کمک کتابخانه neuroph انجام شده است و فایل مربوط به پیاده سازی در سایت [گیت هاب](https://github.com/kahkeshan2/Stocks-Prediction_AI_94) موجود می‌باشد.برای مراجعه به منبع اصلی پیاده سازی میتوانید از این [لینک](/http://technobium.com/stock-market-prediction-using-neuroph-neural-networks)استفاده کنید. پس از این که داده های خود را نرمال کردیم . حال نوبت به یادگیری است . در آزمایش مرحله اول داده های ما به دو دسته تقسیم می‌شوند ، داده هایی برای یادگیری و داده هایی برای تست کردن برنامه می باشد. اطلاعات مربوط به ارزش شاخص در سالهای 2013 و 2014 را به داده های یادگیری اختصاص داده و از اطلاعات سال 2015 برای تست کردن برنامه استفاده می‌شود.
**چگونگی عمل یادگیری:**همانطور که در ابتدا توضیح داده شد در آزمایش مرحله اول به صورت ابتدایی و توسط الگوریتم انتشار به عقب[^back propagation] یادگیری را انجام می‌دهیم . و این روش بدین گونه عمل میکند که در هر بار عمل یادگیری یادداشتی از عمل های خود و همچنین نتیجه پیش بینی برمی‌دارد که اگر درآینده موقعیت مشابهی به وجود آمد در صورت موفقیت در انجام پیش بینی قبلی از همان پیش بینی دوباره استفاده کند تا باز هم به موفقیت برسد . در این روش ابتدا 5 داده اولیه را برمی‌داریم و چون هنوز اولین بار است به طور تصادفی داده ششم یاهمان شاخص روز بعد را حدس می‌زنیم و این مقدار را با مقدار اولین داده سطر بعد یاهمان قیمت واقعی شاخص بورس در روز ششم مقایسه میکنیم و اگر این دوعدد همگرایی خوبی باهم داشته باشند میتوانیم بگوییم توانسته ایم پیش بینی مناسبی انجام دهیم و به موفقیت رسیده ایم و در غیر این صورت یعنی ما نتوانسته ایم قیمت خوبی تخمین بزنیم؛ ما به این کار ادامه میدهیم و هر بار 5 داده را انتخاب میکنیم و با استفاده از تجربه پیش بینی های گذشته و همچنین شانس پیش بینی جدیدی انجام می‌دهیم.برای درک بهتر خوانندگان عکسی از جدول به وجود امده بعد از انجام عمل یادگیری در پایین نمایش داده شده است.ضمنا این نکته نیز قابل توجه است که برنامه در هر بار که داده ای را تخمین میزند میزان خطای تخمین را برای کاربر نیز نمایش می‌دهد و یادگیری را تا زمانی ادامه می‌دهد که درصد خطای برنامه از مقداری که خود برنامه تشخیص می‌دهد پایین تر بیاید و نیز حداکثر به تعدادی یادگیری انجام میدهد که ما به عنوان برنامه نویس به آن بگوییم.![شکل 4 - جدولی که برنامه بعد از عمل یادگیری به صورت خودکار می‌سازد](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1146&y=787&a=true&file=Screenshot%2520from%25202015-12-25%252015%255E%252536%255E%252545.png&t=eAImypYM1ovwuJF&scalingup=0)
**پیش بینی:**بعد از این که داده ها را مورد یادگیری قراردادیم حال موقع امتحان است. اکنون باید به صورت دستی پنج مقدار را به برنامه خود بدهیم و برنامه با توجه به آنچه که آموخته عدد ششم یا همان قیمت تخمینی شاخص را به ما می دهد و ما نیز باید تا فردای آن روز صبر کنیم تا ببینیم که برنامه به ما قیمت درست داده است یا نه! البته چون ما داده های یک سال را در اختیار داریم نیاز به صبر کردن تا فردا نیست و می‌توانیم میزان خطای برنامه را هم اکنون بسنجیم.

**مشکلات این روش :**از جمله مشکلات این روش می‌توان به اشغال کردن فضای بسیار زیاد برای ثبت کردن تجربه های پیشین و ناسازگاری درصورت تغییر شدید قیمت ها به دلیل مشکلات سیاسی و اجتماعی و ...اشاره کرد . 

**ارزیابی :**پس از پایان کار برنامه ،کار ارزیابی شروع می‌شود . در این قسمت باید نتایج پیش بینی را با مقدار حقیقی مقایسه کنیم و میزان خطا را بدست بیاوریم که نتیجه آن نمودار و شکل زیر می‌شود . اگر ما 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|
![شکل 5- خروجی برنامه پس از اجرا](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=919&a=true&file=Screenshot%2520from%25202015-12-25%252016%255E%252544%255E%252558%281%29.png&t=aA0CwinjLigN5UA&scalingup=0)
حال اگر برنامه را چندین بار اجرا کنیم می‎‌بینیم که داده های غیر یکسان تولید میشوند و باعث ایجاد نموداری همانند نمودار زیر می‌شود.
![نمودار 1-نتیجه تکرار اجرای برنامه برای 4/2/2015](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=919&a=true&file=chart1.png&t=gAy2T7LrFi6birT&scalingup=0)
و اگر همین کار را برای تاریخ دیگری انجام دهیم مشاهده میکنیم که نمودا آ ن به شکل زیر خواهد شد.
![نمودار 2- نتیجه تکرار اجرای برنامه برای 3/17/2015](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=919&a=true&file=chart2.png&t=6KsMrgmoUGMJhfZ&scalingup=0)
و برای این آزمایشات محدود نیز درصد خطا برابر است با:
eror%  = (2066.96-2061.62)/2066.96 = 0.2%
که البته همین میزان درصد خطا هم برای مسائل مالی موضوع قابل اهمیتی محسوب می‌شود.

**3.2.2شرح پیاده سازی و  آزمایش مرحله دوم:**
در این قسمت پیاده سازی به وسیله زبان c# و به کمک کتابخانه Encog انجام شده است و فایل های مربوط به پیاده سازی در [گیت هاب](https://github.com/kahkeshan2/Stocks-Prediction2_AI_94) موجود می‌باشد. 
در قسمت قبل گفتیم که یکی از مشکلات انتشار به عقب این است که فضای زیادی را اشغال می‌کند پس اگر ما بتوانیم زمان و میزان تکرار یادگیری خود را به نحوی صحیح کنترل کنیم میتوانیم تا حد خوبی از این اشغال فضا جلوگیری کنیم. برای این کنترل لازم است که برنامه بداند چه درصد خطایی به عنوان درصد خطای مینیموم شناسایی میشود تا بتواند به محض رسیدن به آن پایان یادگیری را اعلام کند. ما برای رسیدن به این مقصود از  [Resilient algorithm](http://www.codeproject.com/Articles/175777/Financial-predictor-via-neural-network#resilientAlgorithm) استفاده میکنیم . 
پس تا اینجا به این نتیجه رسیدیم که برای پیش بینی شاخص بورس روش انتشار به عقب روش مناسبی است ولی در صورتی که ما مینیموم خطا را به درستی انتخاب کرده باشیم .
به طور معمول در روش انتشار به عقب تا زمانی ادامه میدهیم که همچنان راهی برای رسیدن به مینیموم پایینتر نیز باشد. ولی احتمال این که ما در مینیموم های محلی گرفتار شویم زیاد است . ما برای این که این احتمال را کم کنیم از روش  [Resilient algorithm](http://www.codeproject.com/Articles/175777/Financial-predictor-via-neural-network#resilientAlgorithm) استفاده میکنیم که بجای انتخاب پایین ترین نقطه به علامت نقطه توجه میکند . یعنی صرفا توجه میکند که نقطه بالاتر است یا پایین تر و اگر پایین تر بود میتواند آن را به عنوان نقطه مینیموم انتخاب کند. در این روش احتمال به دام افتادن در مینیموم های محلی کمتر می شود.البته این روش نیز مانند روش قبلی همچنان مشکل ناسازگاری با تغییرات شدید را دارد.
تفاوت مرحله اول و دوم فقط در استفاده از resilient algorithm و بعضی جزئیات مانند مقدار و نوع داده های تمرینی می‌باشد ؛ پس برای پرهیز از زیاده گویی بخش های دیگر را دوباره تکرار نمی‌کنیم و به سراغ ارزیابی می‌رویم.
**ارزیابی :** 
پس از اجرای برنامه در سربرگ train به انتخاب خودمان داده های ورودی را انتخاب میکنیم. و پس از آن مشخص میکنیم که عمل یادگیری از چه تاریخی تا چه تاریخی انجام شود. و سپس در سربرگ predict میتوانیم با فشردن دکمه predict عمل پیش بینی را انجام دهیم و در نهایت نتیجه ایجاد شده را با فشردن دکمه export در پوشه ای ذخیره می کنیم.با تجزیه تحلیل نتایج گزارش به نمودار های زیر دست می‌یابیم 
![نمودار 3 - مقایسه مقدار پیش بینی شده با مقدار واقعی شاخص DOW](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1146&y=787&a=true&file=DOW.png&t=mN2tByKxezR4dLX&scalingup=0)
![نمودار 4 - مقایسه مقدار پیش بینی شده با مقدار واقعی شاخص NASDAQ](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1146&y=787&a=true&file=nasdaq.png&t=o6vahzyelH3XpkW&scalingup=0)
![نمودار 5 - مقایسه مقدار پیش بینی شده با مقدار واقعی شاخص PIR ](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1146&y=787&a=true&file=PIR.png&t=7EZknrAN4FOnKqd&scalingup=0)
![نمودار 6 - مقایسه مقدار پیش بینی شده با مقدار واقعی شاخص S&P](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1146&y=787&a=true&file=s%2526p.png&t=uGb0bJylfnXJJRf&scalingup=0)
با توجه به نمودار های بالا متوجه می‌شویم که این برنامه علی رغم این که از الگوریتم هوشمند تری استفاده میکند ولی بخاطر این که در انتخاب مینیموم نقطه بخاطر ترس از افتادن در دام محتاطانه و طبق علامت عمل می‌کند از دقت پایین تری برخوردار است و اگر درصد خطای آن را نیز محاسبه کنیم به عدد 2% می‌رسیم که 10 برابر درصد خطای روش قبل می‌باشد . 
**نتیجه ارزیابی :**پس از اینکه آزمایشات را ارزیابی کردیم به این نتیجه میرسیم که بدلیل اهمیت بالای درصد خطا در پیش بینی های مالی بهتر است که ما هر آنچه از منابع مانند فضای حافظه و زمان را صرف کنیم ولی نتیجه پیش بینی دقیق تر بدست آید.  
# شرح کامل پیاده سازی :
با توجه به توضیحات قسمت قبلی متوجه شدیم که پیاده سازی اولیه کاراتر و دارای ضریب اطمینان بیشتری می‌باشد، البته این روش نیز دارای خطاهایی است که ما بدلیل حساسیت کار خودمان مایلیم که این خطا را به حداقل کاهش دهیم. در ابتدا باید به توضیح و تفسیر کامل این کد بپردازیم تا بعد از روشن شدن این قسمت بتوانیم به راحتی به بهبود کد بپردازیم
فایل اصلی برنامه در مسیر  neuralNetwork/src/main/java/com/technobium  می باشد . در کد اجرایی که مشاهده می‌کنید از چندین کتابخانه استفاده شده که اصلی ترین آن کتابخانه  neuroph می‌باشد . که به تفصیل در پایین توضیح داده خواهد شد . 
ابتدا باید داده ها را توسط تابع بسیار ساده prepare data اماده کنیم به عبارت دیگر باید مقدار ماکسیمم و مینیموم را بدست آوریم و بعد از آن بوسیله  تابع normalizeValue  داده هارا بین مقادیر صفر و یک مرتب کنیم . 
بعد از آن نوبت به استفاده از کلاس data set  کتابخانه neuroph میباشد. این کلاس  وظیفه دریافت اطلاعات روزهای متوالی بورس را دارد  و آنها را به دسته های مختلف با اندازه های مشخص تقسیم میکند . برای مثال ما در این پروژه روزهارا به دسته های 5 تایی تقسیم کرده ایم و سپس برای هرکدام به پیش بینی می‌پردازیم. 
بعد از اینکه داده هارا مرتب و پشت سرهم و در ردیف های 5 تایی مرتب کردیم نوبت به یادگیری توسط کلاس SupervisedLearning می رسد که باید قبل از یادگیری چند پارامتر را برای آن مشخص کنیم .اولین پارامتری که باید مشخص شود  بیشترین مقدار تکرار در یادگیری است[^max Iterations] .که ما این مقدار را برابر با 1000 میگیریم یعنی اگر ما نتوانستیم به نتیجه دلخواه خود یا همان کمترین میزان خطا برسیم در هرصورت بعد از 1000 تکرار یادگیری ما متوقف خواهد شد. پارامتر بعدی که باید مشخص کنیم  نرخ یادگیری است [^learning Rate] که اگر مقدار آن را زیاد انتخاب کنیم باعث می‌شود سرعت یادگیری ما افزایش یابد و در مقابل دقت ما کاهش یابد پس برای پیش بینی های مالی که کار حساسی است بهتر است که نرخ یادگیری را تا حد ممکن پایین آورد تا دقت ما افزایش یابد
و این سرعت به تجزیه و تحیلیل داده های قبلی بستگی دارد به عبارت دیگر وقتی ما نرخ یادگیری را افزایش دهیم با این کار باعث میشویم که برای یادگیری کمتر از تجربیات گذشته استفاده کند. پارامتر بعدی که باید مشخص کنیم بیشترین خطاست  [^maxError]. به عبارت دیگر وقتی یادگیری به پایان می‌رسد که خطای ما از این مقدار کمتر باشد.
پس از مشخص کردن این مقادیر آنها را به صورت قوانین به کلاس supervised learning می‌ دهیم و می‌توانیم بعد از بارگزاری اطلاعات ،یادگیری را با استفاده از همین کلاس انجام دهیم.بعد از این که یادگیری طبق همین قواعد به پایان رسید میتوانیم 5 داده تستی را به انتخاب خود از داده های تستی انتخاب کنیم و به تابع test network  بدهیم تا پس از نرمال سازی روی آنها پیش بینی را انجام دهد.
لازم به ذکر است که پس از هربار تکرار یادگیری و انجام پیش بینی نتایج را چاپ میکنیم و هر موقع مقدار خطا به مقدار دلخواه ما برسد این تکرار را قطع میکنیم.
پس از پایان پیش بینی لازم است که این مقدارپیش بینی شده از حالت نرمال خارج شده و مقدار اصلی را نمایش دهد.پس برای این کار از تابع denormalize value استفاده میکنیم.فایل مربوط به پیاده سازی در سایت [گیت هاب](https://github.com/kahkeshan2/Stocks-Prediction_AI_94) موجود می‌باشد.برای مراجعه به منبع اصلی پیاده سازی میتوانید از این [لینک](/http://technobium.com/stock-market-prediction-using-neuroph-neural-networks)استفاده کنید. 

# بهبود مدل و پیاده سازی
در مدل و روشی که توضیح داده شد شاهد مقدار کمی خطا می‌باشیم و مایلیم این خطا ها را کم و کمتر کنیم . برای انجام این کار ایده هایی موجود است که باید پیاده شود و نتیجه آن بررسی شود. این تغییرات شاید باعث کاهش خطا شوند و شاید برخلاف تفکر و میل ما باعث افزایش خطا شوند. 
1- روند های بورسی متشکل از روند های روزانه ، هفته ای ،ماهیانه ، نیم سالی و سالیانه می‌باشد پس به جای اینکه پیش بینی را از روی 5 روز گذشته انجام دهیم بهتر است به این روند ها دقت بیشتری بکنیم تا برنامه بتواند به خوبی این روند هارا آموخته و از انها در پیش بینی استفاده نماید. البته شاید این فکر به ذهن آید که هرچه ما بازه یادگیری را افزایش دهیم به یادگیری کمک میکنیم در صورتی که اینطور نیست ، با افزایش طول بازه های یادگیری علاوه بر پایین آمدن عملکرد ماشین باعث میشویم که روند های کوچک و تغییرات کوچک در قیمت نادیده گرفته شود که این زیاد به نفع ما نیست ، پس بهترین کار این است که ما مقداری میانه را برای طول بازه های یادگیری خود انتخاب کنیم . با تغییر طول ردیف از 5 به 10 و 15 و 20 شاهد نتایج چشمگیر و شگفت انگیزی می‌شویم که در نمودار زیر مشاهده می‌کنید. 
![مقایسه مقدار حقیقی با مقدار پیش بینی شده با طول بازه های یادگیری متفاوت](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=971&a=true&file=learning.png&t=w0L4AcXlUDB3EBt&scalingup=0)
با توجه به نمودارهای بالا میتوان دریافت که بهترین پیش بینی زمانی اتفاق افتاده که طول بازه یادگیری ما 15 روز بوده است. پس اولین راه حل برای بهبود نتایج تغییر طول بازه یادگیری است.
2- همانطور که در کد اجرایی مشاهده می‌کنید پارامتر هایی مانند بیشترین خطا ، بیشترین تکرار یادگیری و نرخ یادگیری بصورت استاتیک تعریف شده اند که این کار باعث می‌شود این کد برای تمام سهام ها و تمام قیمت ها به صورت یکسان عمل کند و بین سهام هایی با قیمتهای بالا و تلورانس زیاد و سهام هایی با قیمت پایین و تلورانس کم تفاوتی قائل نشود. برای اینکه بتوانیم به پیش بینی بهتری برسیم نباید این تفاوت ها را نادیده بگیریم . برای مثال اگر قیمت سهامی 10 برابر سهام دیگر است باید حداکثر درصد خطای آن نیز 0.1 برابر سهام دیگر و به تبع آن ماکزیمم تکرار نیز 10 برابر سهام دیگر باشد تا اگر پیش بینی اشتباه بود ما ضرر زیادی را متحمل نشویم. این کار بدلیل ایجاد توازن بین سهام های مختلف می باشد .
پس میتوانیم در قسمتی از کد که ماکزیمم تکرار، بیشترین خطا و نرخ یادگیری مشخص شده است آنها را از حالت استاتیک درآورده و به صورت تابعی از max و min بنویسیم . همانند عبارت مقابل:
 

    double m = Math.log((max + min)/2)/Math.log(10);
    if(m>5){
    m=5;}
    else if(m<2){
    m=2;}
    double max iteration = Math.pow(10,m);
   
 وبه همین صورت برای max errorنیز بدست می‌آوریم (فقط در این قسمت باید به توان -m برسانیم ):

    double max error = Math.pow(10,-m);

واگر قیمت روز های مختلف سهامی نیز بسیار نزدیک بهم باشد یا به عبارت دیگر max - min عبارت بسیار کوچک باشد میتوانیم نتیچه بگیریم که این داده ها پراکندگی بسیار کمی دارند پس باید در یادگیری روند این داده ها دقت زیادی اعمال شود که برای اینکار باید مقدار نرخ یادگیری را به صورت تابعی از max و min می‌نویسیم . 

    double n = log(max-min)/log(10);
    if(n>3){
    n=3;}
    double learning rate =pow(10, n-4);
   
و این جملات شرطی برای این گذاشته شده است که اگر n یا m بسیار بزرگ یا بسیار کوچک شدند ما به صورت دستی مقداری برای آنها در نظر بگیریم.
بعد از ایجاد تغییرات فوق در کد برنامه، آن را تست میکنیم و نمودار های زیر از آن نتیجه می‌شود.
در نمودار اول ما برای تست برنامه خود تمام داده ها را در 10 ضرب میکنیم تا داده های بزرگتری بدست آوریم . در این صورت تعداد تکرار نیز در 10 ضرب شده و درصد خطا نیز در  0.1 ضرب می‌شود .
![مقایسه پیش بینی با پارامتر های استاتیک و داینامیک](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=971&a=true&file=S%2526T.png&t=FTPCTfRKKcZMOyR&scalingup=0)
همانطور که در بالا مشاهده می‌کنید بر خلاف میل ما وقتی که به جای پارامتر های استاتیک از پارامتر های داینامیک برای قانون یادگیری استفاده می‌کنیم نه تنها درصد خطا کمتر نمی‌شود بلکه در بعضی آزمایشات نیز بیشتر هم می‌شود.و این بدین دلیل است که وقتی ما در مدل سازی مدل انتخابی را خیلی پیچیده انتخاب کنیم این  مدل نمیتواند در حل مسئله کمکی به ما بکند .حال دوباره برنامه خود را با یک مجموعه کوچک که دارای 45 داده با پراکندگی پایین است تست میکنیم و نتایج زیر از آن حاصل می‌شود.
![مقایسه پیش بینی با پارامتر های استاتیک و داینامیک](http://drive.elenoon.ir/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=971&a=true&file=S%2526T2.png&t=U61pKOuKUtPkf8y&scalingup=0) 
همانطور که از نمودار بالا نیز پیداست باز هم نتیجه دلخواه حاصل نشد و ما به مقصود خود یعنی کم کردن درصد خطا به وسیله پارامتر های داینامیک نرسیدیم.پس این راه حل برای بهبود نتایج با شکست مواجه شد و برای بهبود نتایج فقط می‌توانیم از راه حل اول استفاده کنیم.

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

# مراجع
[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]کتاب تحلیل تکنیکال بازار سرمایه نوشته دکتر لنگرودی،مقدمه



**پیوندهای مفید**
+ [پیش بینی بورس با استفاده از پایتون](http://francescopochetti.com/stock-market-prediction-part-introduction/).
+ [مسابقه پیش‌بینی بورس](https://www.kaggle.com/c/informs2010) 
+ [آیا بورس قابل پیش‌بینی است؟](http://fastml.com/are-stocks-predictable/)