با کار در OneTick و تعامل با مشتریان در زمینه بازارهای مالی، ما دائماً با وظایف جالب و پر تقاضا روبرو هستیم. یک مثال وظیفه پیش بینی حجم معاملات است. چنین موردی به چند دلیل جالب است: از یک طرف، برای بهبود کیفیت اجرای سفارشات بزرگ مفید است، و از سوی دیگر - شناسایی ناهنجاری ها در بازار در تلاش برای جستجوی دستکاری ها. علاوه بر این، پیش بینی حجم می تواند به توسعه سیستم های معاملاتی کمک کند، به عنوان مثال. هنگام برون یابی شاخص ها با استفاده از حجم. در این مقاله، می خواهم نمونه ای از ساخت یک مدل نسبتاً ساده، اما کاملاً مؤثر برای پیش بینی حجم معاملات آتی شاخص نزدک برای 10 دقیقه آینده را نشان دهم.
رویکرد
برای حل مشکل توصیف شده از یادگیری ماشینی استفاده خواهیم کرد که البته جای تعجب نیست. به منظور بهبود کیفیت پیش بینی مدل، سعی می کنیم روندهای بازار را به طور گسترده تری پوشش دهیم و نه تنها حجم معاملات آتی شاخص نزدک را مستقیماً در نظر بگیریم، بلکه آنها را با داده های ETF و گزینه ها ترکیب کنیم. ما همچنین روش های مختلف پیش پردازش داده ها را امتحان خواهیم کرد، مدل های مختلف ML را با هم مقایسه کرده و مناسب ترین گزینه ها را انتخاب خواهیم کرد.
در حال بارگیری داده ها
ما داده های معاملاتی را برای دوره از 1 آوریل 2021 تا 31 مارس 2022 (1 سال) انتخاب کردیم. ما قراردادهای آتی E-mini NASDAQ-100 را برای پیش بینی حجم در 10 دقیقه آینده انتخاب کردیم. بر این اساس، 6 قرارداد اصلی معامله شده در این بازه زمانی انتخاب شد: NQH21، NQM21، NQU21، NQx1a21، NQH22 و NQM22.
در اینجا یک نکته ظریف وجود دارد. اگر به سادگی قراردادهای آتی را به هم بپیوندیم، با اثر کاهش هموار حجم معاملات آتی قدیمی و افزایش آرام حجم معاملات آتی جدید نزدیک به تاریخ انقضا مواجه خواهیم شد.
با این حال، جمع کردن حجم قراردادها نمودار را همسو می کند و آن را پایدار می کند.
بنابراین، پس از بارگیری داده های آتی، حجم معاملات آتی مختلف را در یک سری زمانی خلاصه می کنیم، اما این تنها در لحظات نزدیک به تاریخ انقضا نقش مهمی ایفا می کند.
با سری زمانی ETF همه چیز بسیار ساده است، ما فقط داده های تیک تیک Invesco QQQ ETF (QQQ) را می گیریم و نیازی به دستکاری اضافی نیست.
سومین سری زمانی که ما انتخاب کرده ایم گزینه هایی در QQQ ETF است. از آنجایی که مجموعه عظیمی از قراردادهای اختیار معامله برای قیمت های اعتصاب مختلف و تاریخ انقضا وجود دارد، ما تمام روزهای معاملاتی را در بازه زمانی مشخص (1 سال) بررسی کردیم و برای هر روز 5 قرارداد برتر با بیشترین حجم را شناسایی کردیم. در نتیجه، مجموعه کوچکتری از نمادهای اصلی را به دست آوردیم، سپس حجم آنها را خلاصه کردیم و یک سری زمانی واحد ساختیم. یادآوری می کنم که از این داده ها فقط به عنوان یک ویژگی اضافی هنگام پیش بینی حجم Nasdaq E-minis استفاده می شود.
برای ایجاد ویژگی ها از داده های تیک، در مورد من، راحت است که به قدرت پلتفرم OneTick با استفاده از کتابخانه پایتون onetick-py یا otp روی بیاورید. ما می توانیم به راحتی به هر داده بازار دسترسی داشته باشیم و به سرعت فیلترها و تجمیع های مختلف را اعمال کنیم، زیرا onetick-py دارای نحوی شبیه پانداها است که برای اکثر تحلیلگران آشناست، و پلتفرم OneTick دارای درجه قابل توجهی از موازی سازی وظایف انجام شده است.
بیایید آن را امتحان کنیم! یک مثال کوچک برای دریافت داده های آتی. در اینجا این است که چگونه با onetick-py آسان است:
data = data. agg(,bucket_interval = 600)fut_df = otp. run(داده، apply_times_daily=درست)
داده های تیک خام (معاملات) در سطل هایی (فواصل زمانی) 600 ثانیه = 10 دقیقه جمع آوری می شوند. فیلتر بر اساس زمان نیز انجام می شود زیرا ما فقط جلسه اصلی معاملات سهام را با مدت زمان 6. 5 ساعت = 390 دقیقه در نظر می گیریم: از ساعت 9:30 صبح تا 4:00 بعد از ظهر. بنابراین، هر روز معاملاتی به 390 دقیقه / 10 دقیقه = 39 بازه تقسیم می شود.
otp داده ها را در قالب داده پاندا برمی گرداند. ETF و گزینه ها به همین ترتیب بارگذاری می شوند.
داده های حاصل برای ایجاد ویژگی به این صورت است:
ستون = ['VOLUME_fut'، 'VOLUME_etf'، 'VOLUME_opt']ts[ستون]
مروری بر داده ها
تحقیقات اولیه داده ها وجود تناوب قوی و همچنین پرت را نشان می دهد.
ts. iloc[-250:]. plot(y='VOLUME_fut', x='Time', figsize=[20, 8])
fig, ax = plt. subplots(figsize=(20, 8))plt_pacf = plot_acf(ts['VOLUME_fut']،تبر = تبر،تاخیر = np. arange(150)،auto_ylims = درست)
fig, ax = plt. subplots(figsize=(20, 8))plt_pacf = plot_pacf(ts['VOLUME_fut']،تبر = تبر،تاخیر = np. arange(200)،auto_ylims = درست است،روش='ywm')
نمودار همبستگی به وضوح مؤلفه فصلی را با یک دوره 39 ، یعنی 1 جلسه معاملاتی نشان می دهد. نمودار همبستگی جزئی همچنین وابستگی شدیدی از مقدار حجم فعلی نه تنها به نزدیکترین مقدار قبلی سری زمانی بلکه به مقادیر نزدیک به زمان فعلی یک جلسه معاملاتی قبل نشان می دهد (به عنوان مثال تاخیر با مقادیر 38 ، 39 ، 40 ، 41)بشرهر روز معاملاتی ، برای آینده و همچنین برای ETF و گزینه ها ، از ابتدا تا پایان جلسه اصلی تجارت ، چهره U شکل را نشان می دهد. این امر می تواند مشاهده شود اگر ما مقادیر حجم معاملات را برای هر سطل داخلی بیش از تمام داده ها (1 سال - از 1 آوریل 2021 ، تا 31 مارس 2022) به طور متوسط انجام دهیم ، و سپس آن را به عنوان نمودار (توزیع میانگین) ترسیم کنیم. مقدار حجم تا زمان هر بازه 10 دقیقه ای).
پیش پردازش داده ها
برای بهبود کیفیت مدلهای آموزشی ، از بین بردن اثرات شرح داده شده در بخش قبلی مهم است. اول از همه ، بیایید با Extreme Outries سر و کار داشته باشیم ، برای این کار ، ما حداکثر (و حداقل) حجم را با استفاده از چندین انحراف استاندارد که به مقدار متوسط حجم معاملات اضافه شده اند ، محدود می کنیم. به منظور جلوگیری از نشت داده ها ، انحراف استاندارد را فقط بر اساس نمونه آموزش محاسبه می کنیم.
برای ستون در ستون ها:میانگین = ts. iloc [train_indexes] . mean (numeric_only = true) [ستون]std = ts. iloc [train_indexes] . std (numeric_only = true) [ستون]up_border = میانگین + std_num * stddown_border = حداکثر (0 ، میانگین - std_num * std)ts [ستون] = ts [ستون]. کجا (ts [ستون] up_border)ts[column] = ts[column].where(ts[column]>= down_border ،ord_border)
ما از مقدار زیادی از std_num = 4 استفاده می کنیم ، بنابراین این پیش پردازش تأثیر کمی در داده های منبع دارد ، با این حال ، این ما را از مقادیر غیر طبیعی و احتمالاً داده های نادرست محافظت می کند.
در مرحله بعد ، بیایید به سمت از بین بردن فصلی در داده ها حرکت کنیم.
برای حذف فصلی ، 2 روش مورد آزمایش قرار گرفتند: - تجزیه روند فصلی با استفاده از LOESS - تفریق داده های متوسط به طور متوسط
روش اول مزایای قابل توجهی را نشان نمی دهد ، در حالی که به طور قابل توجهی مدل را پیچیده می کند. بنابراین ، فقط روش دوم در زیر در نظر گرفته می شود.
اول ، میانگین ارزش حجم معاملات برای هر سطل داخل intraday برای 20 روز گذشته محاسبه می شود. ما مقادیر مختلفی را برای تعداد روزها امتحان کردیم و افزایش تعداد روزهای فراتر از 20 منجر به سود بسیار کمی شد.
سطل ها = 39Window_days = 20agg_df = agg_df. groupby (توسط = 'hhmm'). نورد (windows_days) . mean ()agg_df = agg_df. shift (1) . reset_index (سطح = 0) . sort_index ()
سپس مقدار حاصل را از مقدار فعلی حجم معاملات کم کنید.
ts_unseason = ts. join (ts_agg [ستون ها] ،lsuffix = '_ Orig' ،rsuffix = '_ agg'). کپی (عمیق = درست)ts_unseason [ستون ها] = ts [ستون ها] - agg_df [ستون ها]ts_unseason
بنابراین ، ما در حال تلاش برای از بین بردن تکرار U از داده ها و دریافت داده های ثابت تر هستیم. فرض ما توسط نمودارهای داده تأیید می شود. نمودار همبستگی جزئی از داده های پیش پردازش شده عدم وجود وابستگی های همبستگی صریح را نشان می دهد ، به جز مقادیر مجاور سری زمانی (تاخیر 1 ، 2 ، 3 ، 4) ، که نشان دهنده حذف نسبتاً با کیفیت بالا از فصلی در داده ها است.
نمودارهای حجم معاملات ETF و گزینه ها ظاهری مشابه دارند.
امکانات
بنابراین هدف ما پیش بینی ارزش حجم معاملات آتی است. بر اساس تحقیقات قبلاً انجام شده ، ما یک مدل نسبتاً ساده ایجاد خواهیم کرد. مقادیر قبلی سری زمانی - آینده ، ETF و گزینه ها - به عنوان ویژگی ها استفاده می شود. ما نزدیکترین مقادیر این سریال را انتخاب می کنیم - تاخیر 1 ، 2 ، 3 ، 4 - بیشترین سهم را ارائه می دهیم ، و همچنین مقادیر نزدیک به 1 جلسه معاملاتی قبل - تاخیر 38 ، 39 ، 40 ، 41. بنابراین ، ما 24 ویژگی دریافت می کنیم: 8مقادیر قبلی حجم معاملات آتی ، 8 - از حجم معاملات ETF ، 8 - حجم معاملات گزینه.
دوره = [1 ، 2 ، 3 ، 4 ، 38 ، 39 ، 40 ، 41]هدف = ['volume_fut']ویژگی ها_ columns = []برای ستون در ستون ها:برای تاخیر در دوره ها:feature_col_name = f'_lag_ 'df [feature_col_name] = df. shift (تاخیر) [ستون]ویژگی های_ columns. append (feather_col_name)
بعد ، بیایید اهمیت ویژگی ها را ارزیابی کنیم. در تحقیقات اولیه ، ما گزینه های مختلفی را برای ارزیابی اهمیت ویژگی ها امتحان کردیم: تجزیه و تحلیل همبستگی ، تنظیم L2 یک مدل غیرخطی ، تقویت GRAD دارای اهمیت و مقادیر شکل است. در نتیجه ، به نظر می رسید که یکی از موفق ترین و بصری ترین روش های تجزیه و تحلیل ویژگی ها ، یک مدل CatBoost آموزش دیده با استفاده از مقادیر Shap است. سایر روشهای مشخص شده نتایج مشابه یا بدتری را نشان می دهد.
CAT = CATBOOSTREGRESSOR (تکرار = 1000)cat. fit (df. loc [train_indexes] [ویژگی های_Columns] ،df. loc [train_indexes] [هدف] ،Verbose = 0 ،طرح = نادرست)توضیح دهنده = ash. treeexplainer (CAT)shap_values =
nتوضیح دهنده. shap_values (df. loc [train_indexes] [ویژگی های_Columns])shap. summary_plot (shap_values ،df. loc [train_indexes] [ویژگی های_Columns])
برای آموزش بیشتر مدل ها ، 10 ویژگی مهم انتخاب شده است (ما سعی کردیم تعداد ویژگی ها را افزایش دهیم ، اما بیشتر اوقات فقط منجر به نتایج بدتری می شود یا بدون بهبود نتیجه ، اتصالات را کند می کند).
تقسیم و مقیاس گذاری
قبل از ادامه روند آموزش ، ما روشهای استاندارد را انجام می دهیم:
- مجموعه داده های آموزش ، اعتبار سنجی و آزمایش را برای مدل های مناسب و تست درست تعریف کنید
- مقیاس ویژگی ها در یک محدوده واحد در تلاش برای ساده سازی و بهبود کیفیت مدل های آموزش
اتصالات مقیاس دهنده ، البته فقط در داده های آموزش به منظور جلوگیری از نشت داده ها (مشابه کاری که ما هنگام از بین بردن مسافت ها در بخش پیش پردازش داده ها انجام دادیم) ساخته شده است.
test_size = . 1x_train ، x_test ، y_train ، y_test =
ntrain_test_split (df [top_features] ، df [target] ،test_size = test_size ،shuffle = false)val_size = . 1val_size /= (1 - test_size)x_train ، x_val ، y_train ، y_val =
ntrain_test_split (x_train ، y_train ،test_size = val_size ،shuffle = false)scaler = minmaxscaler ()scaler. fit (x_train)x_train = pd. dataframe (data = scaler. transform (x_train) ،index = x_train. index ،ستون = x_train. columns)x_val = pd. dataframe (data = scaler. transform (x_val) ،index = x_val. index ،ستون = x_val. columns)x_test = pd. dataframe (data = scaler. transform (x_test) ،index = x_test. index ،ستون = x_test. columns)
آموزش و اعتبار سنجی مدل ها
برای مقایسه ، 4 نوع مدل انتخاب شدند: XGBOOST REGROSSOR ، CATBOOST REGROSSOR ، CASCADEFOREST REGROSSOR و DNN (Perceptron MultiLayer). یک رویکرد مشابه برای هر نوع مدل ، ساده اما کاملاً مؤثر اعمال شد:
- در مرحله اول ، ما هاپرپارامترهای مدل را با استفاده از اعتبار سنجی پیاده روی بهینه می کنیم ، یعنی مقدار متریک تخمین زده شده را به طور متوسط در تمام برابر (آموزش + زیر مجموعه های اعتبار سنجی) برای هر مجموعه ای از هاپرپارامترها که آزمایش می شوند محاسبه می کنیم.
توجه: اگر در فرآیند اعتبارسنجی به جلو ما از چین های N استفاده می کنیم ، ما نیز مدل های آموزش دیده ای داریم (هر یک آموزش دیده و در آموزش + نمونه اعتبار سنجی آن).
- در مرحله بعد ، ما مجموعه ای از Hyperparameters را انتخاب می کنیم که بهترین ارزش متریک ارزیابی عمومی (به طور متوسط بیش از همه برابر) را نشان می دهد
- سپس ، ما مجموعه ای از مدل ها (مدل های N را انتخاب می کنیم که هر یک از آنها در برابر آن آموزش دیده و آزمایش می شوند) مطابق با بهترین مجموعه موجود در hyperparameters
- سرانجام ، برای به دست آوردن پیش بینی نهایی ، ما از یک رویکرد گروه استفاده می کنیم ، و میانگین پیش بینی تمام مدلهای انتخاب شده در مرحله قبل است
همانطور که از آزمایشات نشان می دهد ، استفاده از یک مدل گروه اجازه می دهد تا یک سیستم پیش بینی بهتر و با ثبات تر بدست آورید.
ارزیابی مدل ها
نتایج به دست آمده را در نظر بگیرید. تأیید شد که کیفیت پیش بینی نسبی انواع مختلف مدل ها در اعتبار سنجی و داده های آزمون کاملاً با یکدیگر سازگار است ، که احتمال نمایندگی نتایج مقایسه در نمونه آزمون را افزایش می دهد.
بیایید حجم معاملات پیش بینی شده و واقعی معاملات آتی E-Mini NASDAQ-100 را برای انواع مختلف مدل ترسیم کنیم.
در نگاه اول ، همه مدل ها داده های آزمون را به خوبی توصیف می کنند ، برای ارزیابی دقیق تر ، مقادیر دقیق معیارهای ارزیابی کیفیت را محاسبه می کنیم.
در کل ، 4 معیار انتخاب شدند:
- میانگین خطای متوسط (MAE)
- میانگین خطای درصد متوسط (MAPE)
- R-Squared (R2)
- میانگین خطای متوسط / انحراف استاندارد از حجم (MAE / STDDEV)
علاوه بر این ، ما یک مدل پایه از نوع زیر ایجاد می کنیم: - بیایید سری زمانی اصلی را بگیریم و با کم کردن مقادیر متوسط به طور متوسط (از آنجا که در بخش پیش پردازش انجام شده است) فصلی را از آن خارج کنیم - سپس فرض کنید که مقدار فعلی سریبرابر با مقدار قبلی این سریال است - در پایان ، ما جزء فصلی را به عقب اضافه می کنیم
اکنون می توانیم مدل ها را نه تنها با یکدیگر بلکه با توجه به مدل پایه مقایسه کنیم.
نتایج نهایی در جدول زیر ارائه شده است:
mae mape r2 mae/stddevپایه 2517. 9539 21. 11 ٪ 0. 6939 38. 15 ٪XGBOOST 2164. 3319 18. 44 ٪0. 7704 32. 79 ٪CatBoost 2129. 089117. 34 ٪ 0. 7606 32. 26 ٪DNN 2206. 7617 19. 37 ٪ 0. 7647 33. 44 ٪Cascadeforest 2200. 6267 18. 99 ٪ 0. 7658 33. 34 ٪
یک مزیت قابل توجه از مدلهای پیشرفته نسبت به مدل پایه قابل مشاهده است. نتایج انواع پیشرفته مدل ها کاملاً نزدیک است ، اما Catboost کمی از مجموعه عوامل جلوتر است.
تحقیقات آینده
زمینه قابل توجهی برای تحقیقات بیشتر وجود دارد. اول از همه ، ما می خواهیم روش های پیش پردازش داده های بیشتری را کشف کنیم. به عنوان مثال ، همبستگی جزئی وجود فصلی ضعیف هفتگی را نشان می دهد. حذف آن باعث می شود نتایج کمی بهبود یابد. ثانیا ، جالب است که سعی کنید از ویژگی های اضافی مانند نسبت پیشنهاد/سؤال از حجم ، مشخصات حجم ، داده های خبری و غیره استفاده کنید. سرانجام ، آزمایش سایر مدل های یادگیری ماشین ، به عنوان مثال ، معماری پیچیده تر شبکه عصبی مهم استمانند LSTM و GAN.
من همچنین می خواهم توجه داشته باشم که در حال حاضر ما در حال توسعه چارچوب علوم داده Onetick هستیم که به شما امکان می دهد آزمایش های ML را به سرعت و راحت انجام دهید ، و همچنین نتایج را پیگیری و ذخیره کنید.
ما در مورد همه این موارد در مقاله های آینده صحبت خواهیم کرد.
نوت بوک با تحقیق نهایی (بدون آزمایش فرضیه های مقدماتی) در اینجا ارائه شده است: VolumePrediction (github. com)
ممنون بخاطر وقتی که گذاشتید!
فارکس پرشین...
ما را در سایت فارکس پرشین دنبال می کنید
برچسب :
نویسنده : الیزابت امینی
بازدید : <-PostHit->
تاريخ : سه
شنبه
14 شهريور
1402 ساعت: 1:32