با الهام از مقاله تحقیقاتی با عنوان "تجارت مالی الگوریتمی با شبکه های عصبی عمیق و عمیق: سری زمانی به تبدیل تصویر"
این پروژه کاملاً مبتنی بر یک مقاله تحقیقاتی با عنوان "تجارت مالی الگوریتمی با شبکه های عصبی عمیق حلقوی: سری زمانی به رویکرد تبدیل تصویر" است. من می گویم "شل و ول" زیرا اگرچه من ایده اصلی را از کاغذ وام گرفته ام ، اما مواردی وجود دارد که من انجام داده ام (یا باید انجام دهم) متفاوت است همانطور که بعداً خواهیم دید. پیوندی که در بالا به اشتراک گذاشته ام ، چاپ مقاله است. مقاله پرداخت شده/اصلی ممکن است جزئیات بیشتری داشته باشد. این مقاله توسط یکی از خوانندگان مقاله قبلی من در مورد پیش بینی قیمت سهام پیشنهاد شده است و بلافاصله توجه من را به خود جلب کرد. در اینجا پیوند به Repo Github و نوت بوک اصلی آموزش در Kaggle آورده شده است.
یک مورد وجود دارد که من دوست دارم خوانندگان بدانند - من اینجا نیستم که ادعا کنم که آماده استفاده از مدل معاملاتی هستم (اگرچه من برای استفاده شخصی خود این روش را بیشتر بررسی می کنم). ایده تبدیل یک داده های جدولی یا سری زمانی معمولی به تصویر ، و آموزش یک مدل طبقه بندی بر روی آن ، فقط به نظر می رسید که در برابر امتحان کردن آن و به اشتراک گذاری آن با جامعه مقاومت کنید. مانند مقاله قبلی من این یک گزارش از تجربه من با پروژه است.
1. مقاله تحقیق چه می گوید؟
در این بخش ایده ارائه شده در مقاله را توضیح خواهم داد. من در مورد کد و اجرای در بخش بعدی بحث خواهم کرد.
این ایده نسبتاً ساده است: 15 شاخص فنی را با 15 طول دوره مختلف (توضیح داده شده در زیر) برای هر روز در داده های معاملاتی خود محاسبه کنید. سپس ویژگی های جدید 225 (15*15) را به تصاویر 15x15 تبدیل کنید. داده ها را به عنوان خرید/فروش/نگهدارنده بر اساس الگوریتم ارائه شده در مقاله برچسب گذاری کنید. سپس مانند هر مشکل طبقه بندی تصویر دیگر ، یک شبکه عصبی حلقوی را آموزش دهید.
مهندسی ویژگی: اگر از شاخص فنی آگاه نیستید ، پیشنهاد می کنم لینک ارائه شده در بالا را بررسی کنید. من مفهوم شاخص های فنی و دوره زمانی را با میانگین حرکت ساده (SMA) توضیح می دهم زیرا ساده تر است. این باید برای شما کافی باشد تا ایده را درک کنید.
میانگین متحرک برای لیستی از اعداد مانند میانگین حسابی است، اما به جای محاسبه میانگین همه اعداد، میانگین اولین اعداد "n" را محاسبه می کنیم (n به اندازه پنجره یا دوره زمانی گفته می شود) و سپس حرکت می کنیم (یاslide) پنجره را با 1 شاخص بکشید، بنابراین اولین عنصر را حذف کرده و عنصر n+1 را شامل می شود و میانگین آنها را محاسبه می کند. این روند ادامه دارد. در اینجا یک مثال برای هدایت این نقطه به خانه آورده شده است:
این نمونه ای از SMA در اندازه پنجره 6 است. SMA 6 عنصر اول به رنگ نارنجی نشان داده شده است. اکنون ستون اول بالا را به عنوان قیمت بسته سهام انتخابی خود در نظر بگیرید. اکنون SMA را با قیمت بسته برای 14 اندازه پنجره دیگر (7 تا 20) در سمت راست sma_6 محاسبه کنید. اکنون 15 ویژگی جدید برای هر ردیف از مجموعه داده خود دارید. این روند را برای 14 نشانگر فنی دیگر تکرار کنید و ردیف های تهی را رها کنید.
برخی از شاخص های مورد استفاده، پسوند SMA هستند. به عنوان مثال، WMA (میانگین متحرک وزنی) میانگین روزهای قبلی است که وزن بیشتری به روزهای اخیر داده شده است. به طور مشابه HMA (Hull Moving Average) یک توسعه WMA با مراحل زیر است:
اکنون 225 ویژگی جدید دارید. اگر این اعداد را به یک آرایه 15×15 تغییر شکل دهید، یک تصویر خواهید داشت!(البته، در این مرحله، این یک کانال واحد است. در ادامه در این مورد بیشتر خواهید شد). هر چند یک نکته را باید در نظر داشت. هنگام ساخت این تصاویر، باید شاخص های فنی مرتبط را از نظر مکانی نزدیک نگه داریم. شهود این است که هنگام آموزش تشخیص چهره انسان، اگر یک چشمش زیر بینی باشد، عکسی را به عنوان چهره انسان نمی دانید. پیکسل های مرتبط باید نزدیک باشند. من کدی را برای محاسبه همه شاخص ها برای اختصار ارسال نمی کنم. می توانید آنها را در فایل utils. py پیدا کنید.
برچسب گذاری: آنچه اکنون باقی مانده است، برچسب گذاری این مجموعه داده است. برای آن، نویسندگان از الگوریتم زیر استفاده کردند:
در نگاه اول، ممکن است فوق العاده به نظر برسد، اما تنها چیزی که می گوید این است: از یک پنجره 11 روزه با قیمت بسته استفاده کنید. اگر عدد وسط در پنجره حداکثر است، روز وسط را به عنوان "فروش" یا اگر عدد وسط حداقل است، روز وسط را به عنوان "خرید" و در غیر این صورت برچسب "نگهداری" بزنید. همانطور که قبلا توضیح داده شد، پنجره را بلغزانید و تکرار کنید. ایده این است که برای هر پنجره 11 روزه در فرودها بخرید و در کرست بفروشید. شایستگی این الگوریتم موضوع متفاوتی است و تا آخر به آن خواهم پرداخت.
آموزش: نویسندگان از آموزش پنجره نورد استفاده کرده اند ، که شبیه به مفهوم پنجره کشویی است که در بالا دیدیم. اگر داده های تاریخچه سهام را برای سال 2000 تا 2019 دارید و تصمیم می گیرید که داده های 5 ساله را آموزش دهید و روی داده های 1 ساله آزمایش کنید ، داده ها را برای 2000-2004 از مجموعه داده ها برای آموزش و داده های سال 2005 برای آزمایش برش دهید. مدل خود را بر روی این داده ها آموزش داده و آزمایش کنید. بعدی 2001-2005 را به عنوان داده های آموزشی و 2006 به عنوان داده های آزمون انتخاب کنید. برای بازیابی این داده ها از همان مدل استفاده کنید. تکرار کنید تا به پایان برسید.
ارزیابی عملکرد محاسباتی: نویسندگان دو نوع ارزیابی مدل را در مقاله ، ارزیابی محاسباتی و مالی ارائه داده اند. ارزیابی محاسباتی شامل ماتریس سردرگمی ، نمره F1 ، دقت عاقلانه کلاس و غیره است. ارزیابی مالی با استفاده از پیش بینی مدل در تجارت دنیای واقعی و اندازه گیری سود حاصل از آن انجام می شود. من فقط در مورد ارزیابی محاسباتی بحث خواهم کرد. ارزیابی مالی را می توان با تجارت دنیای واقعی یا پشتوانه در مورد داده های نگهدارنده انجام داد ، که ممکن است در مقاله های آینده در مورد آنها بحث کنم.
2. اجرای
همانطور که در ابتدای این مقاله ذکر شد ، من مقاله تحقیق را به شدت دنبال نکرده ام زیرا نتایج مورد انتظار را به دست نیاورد. من به اختلافات و در هنگام ظهور اشاره خواهم کرد. اما با تغییراتی که نتیجه را انجام دادم با کاغذ یا در بعضی موارد بهتر بود.
کد مربوط به پردازش داده ها را می توان در data_generator. py یافت
منبع داده: من معمولاً داده های سهام را از Alpha Vantage دریافت می کنم که داده های سهام تاریخی را به صورت رایگان ارائه می دهد. من از آن برای پروژه قبلی خود نیز استفاده کرده بودم. در اینجا نحوه بارگیری داده ها آورده شده است.
url = "https://www. alphavantage. co/query؟function=time_series_daily_adusted& outputsize=full& apikey=api_key& datatype=csv& symbol=company_code"urllib. request. urlretrive (url ، path_to_save)
داده ها به این شکل است:
مهندسی ویژگی: اولین انحراف از مقاله ، شاخص های فنی است که من استفاده کردم. من نمی توانم کتابخانه/اجرای برخی از شاخص هایی را که در مقاله ذکر شده است ، مانند PSI پیدا کنم. برخی از شاخص ها فقط مشخص نبودند. به عنوان مثال ، PPO با استفاده از EMA از دوره 12 و 26 محاسبه می شود. چگونه می توان PPO را برای دوره های مختلف محاسبه کرد؟من سعی کردم از بیشتر شاخص های ذکر شده در مقاله ای استفاده کنم که برای آنها برای جلوگیری از هرگونه خطای برنامه نویسی ، پیاده سازی های منبع باز را پیدا کردم. من برخی از شاخص ها مانند WMA ، HMA و غیره را پیاده سازی کرده ام ، اگرچه آنها کند هستند و به بهینه سازی نیاز دارند. از آنجا که من مجبور هستم فقط یک بار آن را اجرا کنم و داده ها را ذخیره کنم ، برای من مسئله ای نیست. شما می توانید از شاخص های مختلف مورد نظر خود استفاده کنید. آنها همچنین قیمت ها (باز ، بالا ، پایین و غیره) را با نسبت تنظیم تنظیم کرده اند. اما من این را دنبال نکرده ام زیرا نمی توانم هیچ مرجعی در مورد نحوه انجام این تنظیم پیدا کنم. تمام توابع ساخت این ویژگی ها در پرونده upils. py قرار دارند.
برچسب زدن داده ها: برای این وبلاگ ، من از الگوریتم برچسب زدن اصلی که نویسندگان از آن استفاده کرده اند استفاده کرده ام. در اینجا اجرای مستقیم آن وجود دارد:
عادی سازی: من از MinmaxScaler از Sklea برای عادی سازی داده ها در محدوده [0 ، 1] استفاده کردم ، اگرچه مقاله مورد استفاده [-1 ، 1] (انحراف دوم). این فقط یک ترجیح شخصی است.
عدم تعادل کلاس: یکی دیگر از دلایلی که این نوع مشکلات برای حل مشکل هستند این است که داده ها به طور گسترده ای نامتعادل هستند. تعداد موارد "نگه داشتن" همیشه بسیار بیشتر از خرید/فروش خواهد بود. در حقیقت ، الگوریتم برچسب گذاری ارائه شده در مقاله تعداد زیادی از نمونه های خرید/فروش را تا حدودی سخاوتمندانه تولید می کند. هر استراتژی دنیای واقعی دیگر موارد بسیار کمتری را تولید می کند. و برای پیچیده تر کردن چیزها ، طبقه بندی رویداد "نگه داشتن" مستقیم به جلو نخواهد بود (بیشتر در این مورد تا پایان).
این واقعاً کمتر است که مدل برای یادگیری هر چیز مهم باشد. در این مقاله فقط "تغییر شکل مجدد" به عنوان راهی برای مقابله با این مشکل ذکر شده است. من تولید بیش از حد ، تولید داده های مصنوعی (Smote ، Adasyn) را امتحان کردم اما هیچ یک از آنها نتیجه رضایت بخشی ندادند. سرانجام من برای "وزن نمونه" مستقر شدم ، که در آن شما به مدل می گویید که بیشتر به برخی از نمونه ها (انحراف چهارم) توجه کنید. این در حالی که با عدم تعادل کلاس برخورد می کند مفید است. در اینجا نحوه محاسبه وزن نمونه آمده است:
آموزش مدل Keras با تماس های اولیه و کاهش دهنده های کاهش یافته مانند این انجام شد:
همانطور که در بالا مشاهده می کنید ، من از نمره F1 به عنوان متریک استفاده کرده ام. برای ارزیابی داده های آزمون ، من همچنین از ماتریس سردرگمی ، نمره وزنی F1 Sklea و Kappa استفاده کرده ام (که اخیراً با آن آشنا شدم ، باید عمیق تر حفر کنم).
در داده های والمارت مدل فوق نتیجه زیر را ارائه داد:
این نتیجه تا حدودی متفاوت است هر بار که من آن را اجرا می کنم ، که ممکن است به دلیل اولیه سازی وزن Keras باشد. این در واقع یک رفتار شناخته شده است ، با موضوع طولانی بحث در اینجا. به طور خلاصه شما باید بذر تصادفی را برای Numpy و Tensorflow تنظیم کنید. من فقط برای Numpy دانه تصادفی تنظیم کرده ام. بنابراین من مطمئن نیستم که آیا این مشکل را برطرف خواهد کرد یا خیر. من پس از امتحان کردن در اینجا به روز می شوم. اما بیشتر اوقات و برای بیشتر معماری های CNN که من امتحان کرده ام ، دقت کلاس 0 و کلاس 1 (خرید/فروش) کمتر از کلاس 2 است (با کلاس 0/1 70s).
نویسندگان نتایج زیر را دریافت کردند:
اگر توجه کنید ، نمرات کلاس "نگه دارید" به طور قابل توجهی بدتر از "خرید/فروش" ، چه در نتیجه ما و هم در مقاله است. من فکر می کنم این نتیجه کاملاً امیدوار کننده است با توجه به اینکه مدل می تواند بیشتر موارد خرید/فروش را مشخص کند. در اینجا چیزی است که نویسندگان در مورد آن می گویند:
با این حال ، بسیاری از نقاط ورود و خروج کاذب نیز ایجاد می شود. این عمدتاً به این دلیل است که نقاط "خرید" و "فروش" بسیار کمتر از نقاط "نگه داشتن" به نظر می رسند ، برای شبکه عصبی آسان نیست که بتوانند نقاط ورود و خروج "به ندرت" را بدست آورند بدون اینکه به خطر بیفتد توزیع عمومیمقادیر غالب "نگه دارید". به عبارت دیگر ، برای اینکه بتوانیم بیشتر نقاط "خرید" و "فروش" را بدست آوریم (فراخوان) ، این مدل با ایجاد آلارم کاذب برای نقاط ورود و خروج غیر موجود (دقت) معامله می کند. علاوه بر این ، امتیازات نگه داشتن به اندازه "خرید" و "فروش" (تپه ها و دره ها) مشخص نیست. کاملاً ممکن است که شبکه عصبی برخی از نقاط "نگه داشتن" را با نقاط "خرید" و "فروش" اشتباه بگیرد ، به خصوص اگر نزدیک به بالای تپه یا پایین دره در پنجره های کشویی باشند. "
3. پیشرفت های بیشتر
- مطمئناً فضای زیادی برای معماری بهتر شبکه و تنظیم هایپرپارامتر وجود دارد.
- استفاده از CNN با همان معماری در سایر مجموعه داده ها به همان اندازه چشمگیر چشمگیر برای خرید و فروش نیست. اما با بازی در اطراف با HyperParameters می توانیم آن را به چهره های مشابه Walmart بهبود بخشیم.
- اگرچه این نتایج به اندازه کافی خوب به نظر می رسند، اما هیچ تضمینی وجود ندارد که در تجارت دنیای واقعی به شما سود بدهد، زیرا با استراتژی ای که برای برچسب گذاری داده های خود انتخاب می کنید محدود می شود. به عنوان مثال، من در بالای استراتژی معاملاتی (با برچسب های اصلی و نه پیش بینی مدل!) آزمایش مجدد دادم اما سود زیادی کسب نکردم. اما این بستگی به برچسب گذاری داده ها دارد. اگر کسی از استراتژی بهتری برای برچسب گذاری داده های آموزشی استفاده کند، ممکن است عملکرد بهتری داشته باشد.
- بررسی سایر شاخص های فنی ممکن است نتیجه را بیشتر بهبود بخشد.
4. نتیجه گیری
کار روی این پروژه را با ذهنی بسیار شکاک شروع کردم. مطمئن نبودم که آیا تصاویر اطلاعات/الگوهای کافی برای یافتن ConvNet داشته باشند یا خیر. اما از آنجایی که به نظر می رسد نتایج بسیار بهتر از پیش بینی تصادفی است، این رویکرد امیدوارکننده به نظر می رسد. من به خصوص روشی را که آنها مسئله سری زمانی را به طبقه بندی تصویر تبدیل کردند، دوست داشتم.
به روز رسانی- 12/7/2020: به روز رسانی عمده- یک اشکال در ایجاد برچسب وجود داشت که به جای آیتم میانی، برچسب ها را به آخرین روز پنجره اختصاص می داد. من همچنین این مقاله را با نتایج جدید به روز کرده ام. مدل جدید در "stock_keras. ipynb" به روز شد
رفع کد در GitHub نیز موجود است. لطفاً توجه داشته باشید که از آنجایی که من به PyTorch نقل مکان کرده ام و دیگر محیط Tensorflow کار نمی کند، این مدل را روی ابر آموزش دادم و مجبور شدم اصلاحات را کپی کنم. بنابراین، من نتوانستم کد نهایی را به طور کامل (بخش آموزشی) آزمایش کنم.
فهرست کدهایی که به دلیل تغییرات در حساب GitHub من وجود نداشت را درج کردم.
به روز رسانی - 23/2/2020: من به تازگی یک اشکال در تابع ایجاد مدل خود "create_model_c" کشف کرده ام، که در آن از بررسی زیر برای اضافه کردن لایه های MaxPool استفاده می کنم:
اگر پارامترها["conv2d_layers"]['conv2d_mp_1'] == 1این را باif params["conv2d_layers"]['conv2d_mp_1']>= 0
همین کار را برای "conv2d_mp_2" نیز انجام دهید. هیچ اشکالی در مدل یا برنامه وجود ندارد، فقط این است که من فضای جستجوی فراپارامترها را بدون هیچ MaxPool کاوش می کردم:-(. باید بررسی شود که آیا مدل می تواند با لایه های MaxPool بهتر عمل کند یا خیر.
به روز رسانی - 09/02/2020: توضیحات اضافه شده برای برخی از شاخص های فنی پیچیده تر در بخش "مهندسی ویژگی".
گزینه های باینری...
ما را در سایت گزینه های باینری دنبال می کنید
برچسب :
نویسنده : هایده حائری
بازدید : <-PostHit->
تاريخ : چهارشنبه
15 شهريور
1402 ساعت: 10:44