پس از تمیز کردن و تجسم داده ها ، این قسمت یادگیری ماشین را برای یافتن بهترین خط متناسب با تمام نقاط داده ، به عنوان آماده سازی برای پیش بینی در قسمت نهایی ، مستقر می کند.
اگر قسمت اول من را در این پروژه پایان به پایان در مورد پیش بینی نرخ ارز از دست داده اید ، در صورت تمایل آن را در اینجا بررسی کنید.
به عنوان یک بازپرداخت ، این پروژه با هدف تجزیه و تحلیل الگوی تاریخی نرخ ارز در ارزهای مختلف کشور در برابر دلار و بنابراین پیش بینی مقادیر در سال 2020 است. برای ارائه بهترین مدل ، من پروژه را به 3 بخش تقسیم کرده ام که منامید ، احتمالاً آنچه را برای پیش بینی لازم است پوشش خواهد داد:
- قسمت 1: تجزیه و تحلیل داده های توضیحی (EDA) و تجسم داده ها (جایزه: آزمایش فرضیه)
- قسمت 2: یادگیری ماشین با 4 مدل رگرسیون
- قسمت 3: یادگیری ماشین (ادامه) با ARIMA
امروز ، من شما را از طریق بخش 2 که یادگیری ماشین را با هدف یافتن خطی که به بهترین وجه متناسب با الگوی نرخ ارز در طول سالها باشد ، به شما می رسانم. گفته می شود ، رگرسیون خطی به ظاهر الگوی مناسب یا حداقل پایه و اساس تجزیه و تحلیل ما خواهد بود. فراتر از آن ، من قبل از تصمیم گیری برای استفاده برای پیش بینی ، سایر مدلهای رگرسیون خطی را نیز آزمایش کرده ام (قسمت 3):
- رگرسیون خطی
- رگرسیون خطی چندگانه
- رگرسیون چند جمله ای
- رگرسیون ریج (تنظیم مجدد L2)
- رگرسیون لاسو (تنظیم L1)
بیا شروع کنیم!
به گفته سرمایه گذاری ، 3 روش مشترک برای پیش بینی نرخ ارز وجود دارد: خرید برابری قدرت (PPP) ، قدرت اقتصادی نسبی و الگوی اقتصاد سنجی. در بین این سه نفر ، من تصمیم گرفتم که با سومین حرکت کنم زیرا این امر شامل بسیاری از عوامل مؤثر بر حرکات ارز است.
3 روش مشترک برای پیش بینی نرخ ارز را بیاموزید
استفاده از پیش بینی نرخ ارز می تواند به کارگزاران و مشاغل کمک کند تا تصمیمات آگاهانه ای برای کمک به به حداقل رساندن خطرات بگیرند ...
"عوامل مورد استفاده در مدلهای اقتصاد سنجی به طور معمول مبتنی بر تئوری اقتصادی است ، اما اگر اعتقاد بر این باشد که به میزان قابل توجهی بر نرخ ارز تأثیر می گذارد ، می توان هر متغیر را اضافه کرد."- سرمایه گذاری ، توسط جوزف نگوین.
این روش تا حد زیادی با جهتی که از «هر متغیر مستقل» که بر متغیر وابسته تأثیرگذار است - رگرسیون خطی استفاده می کند، همسو می شود. بنابراین، عواملی که من می خواستم آزمایش کنم عبارتند از تفاوت نرخ بهره، نرخ رشد تولید ناخالص داخلی و نرخ رشد درآمد، به طور متوالی و در عین حال انباشته. برای این پروژه، من از نرخ ارز AUD/USD برای تحلیل استفاده کردم.
1. رگرسیون خطی
بیایید مدل رگرسیون خطی خود را با یک متغیر مستقل شروع کنیم: تفاوت نرخ بهره. اگر مایل به کاوش هستید، لطفاً به این منبع داده مراجعه کنید.
ir_df = pd. read_csv("سود دلار آمریکا حمل تجارت. csv")ir_df. head()در بالا جدول تفاوت نرخ بهره AUD/USD از سال 2017 تا 2019 آمده است. اگر می خواهید بیشتر بدانید که "حمل طولانی" و "حمل کوتاه" چیست، این مقاله را در Investopedia درباره Carry Trade و مقاله دیگری در FXCM در مورد بهره را بررسی کنید.-Rate Carry Trade. به اختصار،
معاملات حمل با نرخ بهره نوعی آربیتراژ است که در آن شخصی از تفاوت موجود بین دو بازار برای کسب سود استفاده می کند.
به این ترتیب، اجازه دهید این داده ها را برای تجزیه و تحلیل تبدیل کنیم (در این مورد، من از نرخ بهره طولانی مدت استفاده کردم):
x_ir = ir_df['Long Carry']. atype(str)x_ir = x_ir. replace(، regex = درست)x_ir = x_ir. atype(float)x_ir = np. array(x_ir). reshape(-1, 1)aud_usd_fx = df_groupby_aud[(df_groupby_aud['month_year']>= '01-2017') و (df_groupby_aud['month_year']<='2019-12')].reset_index(drop=True)aud_usd = aud_usd_fx['AUD_USD']y_fx = aud_usd
در اینجا x_ir به متغیر مستقلی اشاره دارد که بر نرخ ارز ما تأثیر می گذارد. برای استفاده راحت تر، "%" را از اعداد با regex جایگزین حذف کردم و آنها را به شناور تبدیل کردم. از آنجایی که داده های آرایه دوبعدی در مدل رگرسیون مورد نیاز است، باید 1D x_ir خود را با استفاده از . reshape(-1, 1) به 2D تبدیل کنیم. و اگر از قسمت اول به خاطر بیاورید، ما کل مجموعه داده را پاکسازی کرده ایم، بنابراین اکنون برای ما آسان تر است که داده های AUD/USD (y_fx) را به عنوان متغیر وابسته انتخاب کنیم.
لطفا توجه داشته باشید که من برای سادگی کار از مدت زمان کوتاهی (از سال 2017 تا 2019، 36 ماه) در این پروژه استفاده کردم.
بیایید اولین مدل یادگیری ماشین خود را با وارد کردن توابع مرتبط از کتابخانه Scikit-lea اجرا کنیم!
از sklea. model_selection واردات train_test_splitاز sklea. linear_model import LinearRegression
همانطور که ممکن است بدانید، برای آزمایش دقت مدل خود، به ما توصیه می شود مجموعه داده را به مجموعه های آموزشی و آزمایشی تقسیم کنیم. در اصل، ما مدل را روی مجموعه آموزشی آموزش می دهیم و سپس مقادیر را با مجموعه تست پیش بینی می کنیم.
x_train ، x_test ، y_train ، y_test = train_test_split (x_ir ، y_fx ، train_size = 0. 8 ، test_size = 0. 2 ، random_state = 1)model = LinearRegression ()model. fit (x_train ، y_train)y_predict = model. predict (x_test)چاپ (model. score (x_train ، y_train))چاپ (model. score (x_test ، y_test))
در اینجا ، من داده ها را به 80 ٪ آموزش و 20 ٪ آزمون تقسیم می کنم ، به این معنی که این مدل الگوی 80 ٪ داده های آموزشی را یاد می گیرد و سپس مقادیر Y را با داده های آزمایش 20 ٪ پیش بینی می کند.. Score () درصد یک متغیر وابسته (نرخ ارز) را که توسط متغیر مستقل (دیفرانسیل نرخ بهره) یا همانطور که می دانیم ، به ما می گوید ، به ما می گوید.
همانطور که مشاهده می کنید ، درصد بین داده های آموزش و آزمایش بسیار نزدیک است ، به این معنی که دقت مدل نسبتاً خوب است.
با این حال ، از مشاهدات من ، اندازه مجموعه داده نسبتاً اندک است (36 نفر = 36 که ما فقط 2017 را تا 2019 پوشش می دهیم) ، می خواستم ببینم که آیا من قادر به تقسیم داده ها به مجموعه های آموزش و آزمایش نیستم یا نه ،به خاطر سادگی.
model = LinearRegression ()model. fit (x_ir ، y_fx)y_fx_predict = model. predict (x_ir)چاپ (model. score (x_ir ، y_fx))
تفاوت در R-Squared بین تقسیم و بدون تقسیم حداقل است ، احتمالاً به دلیل اندازه مجموعه داده های کوچک. از این رو ، من داده ها را تقسیم نمی کنم و از کل مجموعه داده استفاده می کنم.
بیایید ببینیم مدل ما در ایجاد خط "بهترین مناسب" چقدر خوب عمل می کند:
ماه_ه = AUD_USD_FX ['MONUS_YEAR']ماه_ه = ماه_هار. ASTYPE (STR)plt. figure (figsize = (12،6))plt. scatter (ماه_ه ، y_fx ، آلفا = 0. 4)plt. plot (month_year ، y_fx_predict)plt. title ("رگرسیون خطی: نرخ ارز AUD/USD (1 وار: نرخ بهره)")plt. xlabel ("ماه ماه")plt. ylabel ("نرخ ارز")plt. xticks (fontsize = 4)plt. show ()همراه با مربع R ، به نظر می رسد که این خط می تواند نرخ ارز را تا حدی به تصویر بکشد (R-Squared 72 ٪ است). بیایید متغیر دیگری را اضافه کنیم تا ببینیم مربع R ما با رگرسیون چندین خطی تا چه اندازه بهبود می یابد.
2. رگرسیون خطی چندگانه
همانطور که از ابتدای مقاله به اشتراک گذاشته شده است ، ما می توانیم متغیرهای اضافی را به مدل اضافه کنیم تا زمانی که در متغیر وابسته تأثیرگذار باشند. این ما را به سمت مدل رگرسیون خطی دوم سوق می دهد ، که شامل بیش از 1 متغیر مستقل است.
بیایید نرخ رشد تولید ناخالص داخلی را به مجموعه داده های ما اضافه کنیم ، که از این دامنه می توان یافت.
aus_gdp = pd. read_csv ("aus gdp. csv")USA_GDP = PD. READ_CSV ("USA GDP. CSV")aus_gdp = aus_gdp. rename (ستون =)aus_usa_gdp = pd. merge (aus_gdp ، usa_gdp ، on = "moon_year" ، چگونه = "درونی")aus_usa_gdp = aus_usa_gdp. rename (ستون =)aus_usa_gdp ['gdp_diff'] = aus_usa_gdp ['aus_gdp'] - aus_usa_gdp ['usa_gdp']aus_usa_gdp_20172019 = aus_usa_gdp[(aus_usa_gdp['month_year']>= '2017-01') & (aus_usa_gdp ['Moon_year']<='2019-12')].reset_index(drop=True)gdp_diff = ["٪ . 4f" ٪ num برای num در aus_usa_gdp_20172019 ['gdp_diff']]پس از بارگیری داده ها ، من EDA را برای تمیز کردن و استخراج GDP_DIFF از DataFrame به یک لیست اعمال کردم ، تا با متغیر X_IR برای رگرسیون چند خطی ما ترکیب شود.
x_ir_gdp = np. array (لیست (zip (x_ir ، gdp_diff)))x_ir_gdp = x_ir_gdp. astype (np. float)model. fit (x_ir_gdp ، y_fx)y_fx_predict_2 = model. predict (x_ir_gdp)چاپ (model. score (x_ir_gdp ، y_fx))
پس از افزودن متغیر دیگر به مدل ، مربع R بسیار قابل توجهی بهبود یافته است ، از 72 ٪ به 87. 2 ٪. بیایید آن را بصری در برابر اولین خطی که ایجاد کردیم مقایسه کنیم:
خوب به نظر می رسد ، درست است! خوب ، بیایید سعی کنیم متغیر مستقل دیگری به مدل ما ، شاخص قیمت مصرف کننده (CPI) اضافه کنیم. باز هم ، مجموعه داده را می توان از این دامنه یافت.
cpi = pd. read_csv ("AUS USA CPI Difference. csv")cpi_diff = cpi ['cpi_diff']x_ir_gdp_cpi = np. array (لیست (zip (x_ir ، gdp_diff ، cpi_diff)))x_ir_gdp_cpi = x_ir_gdp_cpi. astype (np. float)model. fit (x_ir_gdp_cpi ، y_fx)y_fx_predict_4 = model. predict (x_ir_gdp_cpi)چاپ (model. score (x_ir_gdp_cpi ، y_fx)این بار ، R-Squared واقعاً اندکی افزایش یافته است ، از 87. 2 ٪ به 87. 3 ٪. این بدان معنی است که CPI به طور قابل توجهی بر حرکت نرخ ارز تأثیر نمی گذارد و به بهبود مدل ما کمک نمی کند. از نظر بصری ، هیچ تفاوتی وجود ندارد.
بیایید متغیر CPI را با نرخ بیکاری دیگر (UER) جایگزین کنیم و ببینیم که آیا این مدل ما را بهبود می بخشد یا خیر.
بیکاری_RATE = PD. READ_CSV ("نرخ بیکاری AUS USA. CSV")Bealment_Rate ['uer_diff'] = BAGENEMENT_RATE ['نرخ کار AUS_UNEMPLOYMENT'] - BAGENEMENT_RATE ['USA_UNEMPLANCEMENT "]uer_diff_all = بیکاری_rate ['uer_diff']uer_diff = ["٪ . 4f" ٪ num برای num در uer_diff_all]x_ir_gdp_uer = np. array (لیست (zip (x_ir ، gdp_diff ، uer_diff)))x_ir_gdp_uer = x_ir_gdp_uer. astype (np. float)model. fit (x_ir_gdp_uer ، y_fx)y_fx_predict_3 = model. predict (x_ir_gdp_uer)چاپ (model. score (x_ir_gdp_uer ، y_fx))خوب ، R-Squared کمی بهتر شده است ، از 87. 2 ٪ به 88. 9 ٪. از نظر آماری و بصری خیلی بد نیست. شما می توانید به اضافه کردن متغیرهای دیگر به مدل ادامه دهید ، اما با استفاده از بیش از حد مراقب باشید!
برای من ، به جای اضافه کردن متغیرهای مستقل تر ، تصمیم گرفتم یک مدل رگرسیون دیگر را آزمایش کنم تا یک خط بهتر پیدا کنم: رگرسیون چند جمله ای.
3. رگرسیون چند جمله ای
رگرسیون چند جمله ای چیست؟این هنوز یک نوع رگرسیون خطی است اما یک نسخه بسیار "سازگار" است.
به طور سنتی ، رگرسیون خطی با هدف یافتن بهترین خط خطی متناسب با تمام نقاط داده شما ، که ممکن است همیشه اینگونه نباشد. بنابراین ، رگرسیون چند جمله ای به عنوان شکل دیگری عمل می کند که خط را از مختصات (x ، y) با y که به عنوان چند جمله ای درجه نهم مدل می شود ، ترسیم می کند.
بیایید عملکرد را از کتابخانه Sciki-Lea وارد کنیم و مدل خود را بسازیم:
از sklea. preprocessing واردات چند جمله ایپلی = چند جمله ای (درجه = 4)x_poly = poly. fit_transform (x_ir_gdp_uer)model_poly = LinearRegression ()model_poly. fit (x_poly ، y_fx)y_pred = model_poly. predict (x_poly)چاپ (model_poly. score (x_poly ، y_fx))
تنها تفاوت عملکرد بین رگرسیون خطی و چند جمله ای پارامتر درجه است. قبل از رسیدن به نتیجه ، بگذارید به طور خلاصه توضیح دهم: . fit_transform () تبدیل متغیرهای مستقل خود از خطی به چند جمله ای است. بقیه عملکرد همان باقی می ماند.
در اینجا ، من به طور تصادفی درجه 4 را انتخاب کردم و R-Squared تقریباً کامل است: 99. 9 ٪! ممکن است بخواهید بصری آن را ببینید؟
خط سیاه نشان دهنده تناسب رگرسیون چند جمله ای است که با درجه 4 یافت می شود. چقدر شگفت انگیز است؟اما سؤال این است: "کدام درجه بهترین است ، نه اینکه داده ها را بیش از حد اضافه کنید و زیر آن قرار ندهید؟"
ما می دانیم که هدف ما این است که R-Squared را تا حد امکان پیدا کنیم ، زیرا این واقعیت را توضیح می دهد که متغیر وابسته (نرخ ارز) تحت تأثیر متغیر (های) مستقل قرار می گیرد. جدا از آن ، یک متریک دیگر وجود دارد که قادر به ارزیابی صحت مدل ما است: میانگین خطای مربع (MSE).
برای یافتن بهترین درجه ، تصمیم گرفتم طیف وسیعی از درجه ها را آزمایش کنم ، از 1 تا 10 بر روی مدل ما به طور جداگانه با یک حلقه برای حلقه و تجسم آن:
از Sklea. Metrics واردات MEAN_SQUARED_ERRORr_squared_list = []mse_list = []A = دامنه (1،10،1)برای من در A:پلی = چند جمله ای (درجه = I)x_poly = poly. fit_transform (x_ir_gdp_uer) model_poly = LinearRegression ()model_poly. fit (x_poly ، y_fx)y_pred = model_poly. predict (x_poly) r_squared = model_poly. score (x_poly ، y_fx)mse = mean_squared_error (y_pred ، y_fx) r_squared_list. append (r_squared)mse_list. append (MSE)
همانطور که در هر دو نمودار مشاهده می کنید ، از آنجا که خط از درجه 1 به 4 افزایش می یابد ، مربع R و MSE به طور قابل توجهی بهبود می یابند (هرچه برای مربع R بهتر باشد ، برای MSE بهتر می شود). با این حال ، در درجه 4 به اوج خود می رسد و از درجه 5 پیشرفت دیگری مشاهده نمی شود. این بدان معنی است که درجه 4 بهترین نمره دقت را برای مدل ما به ارمغان می آورد! پس بیایید با 4 بچسبیم!
بلهسرانجام به لطف رگرسیون چند جمله ای ، خطی را بدست آوردیم که به بهترین وجه در این سالها متناسب با نرخ ارز باشد!
4. & 5. رگرسیون ریج و رگرسیون لاسو
این دو مورد نهایی آخرین آزمایش من در "اکوسیستم" مدل های رگرسیون خطی است که قبلاً در مورد جایی شنیده ام. اوه بله ، آن را به تنظیم L1 و L2 می رساند! به همین ترتیب ، من می خواستم این دو مدل را در پروژه خود آزمایش کنم تا ببینم که چگونه آنها در برابر مدل های فوق عملکرد دارند.
با این حال ، قبل از پرش به آنها ، بیایید به سرعت منشأ این مدل ها ، منظم سازی و نقش هایی را که آنها در برابر آنچه که معمولاً در مورد رگرسیون خطی می دانیم ، نشان دهیم.
همه چیز با استفاده از بیش از حد شروع شد. به طور خلاصه ، بیش از حد هنگامی اتفاق می افتد که یک مدل یادگیری ماشین بیش از حد متناسب با یک مجموعه داده خاص (به ویژه با متغیرها/ویژگی های مستقل بیش از حد) باشد و از این رو قادر به تعمیم در سایر مجموعه داده ها نیست. از این رو ، تنظیم مجدد برای جلوگیری از این پدیده معرفی شد. در اصل ، آنچه منظم انجام می دهد این است:
- ضمن حفظ تعداد متغیرها/ویژگی های مستقل ، پیچیدگی مدل را کاهش دهید
- از نظر فنی ، میزان ضرایب را به عنوان مجازات به عملکرد از دست دادن کاهش دهید
اگر می خواهید به نحوه کار ، از نظر ریاضی ، در مورد نحوه عملکرد بیشتر به علوم داده مراجعه کنید.
رگرسیون ریج و رگرسیون لاسو از این مفهوم تنظیم تنظیم شده است. تنها تفاوت بین این دو در این است:
- رگرسیون ریج از تکنیک تنظیم L2 استفاده می کند ، که ضرایب را به صفر می رساند ، اما صفر مطلق نیست
- رگرسیون Lasso از تکنیک تنظیم L1 استفاده می کند ، که ضرایب را به صفر مطلق می اندازد
این امر به این دلیل است که ریج تمام متغیرها/ویژگی ها را نگه می دارد در حالی که Lasso فقط موارد مهمی را که مهم هستند ، نگه می دارد ، از این رو به عنوان تکنیک انتخاب متغیر/ویژگی وقتی که مجموعه داده ما متغیرها/ویژگی های زیادی دارد ، رای می دهد.
خوب ، به مجموعه داده ما برگردید!
حتی اگر مدل ما متغیرهای زیادی نداشته باشد (در این حالت ، 3) ، من هنوز هم می خواستم ببینم که چگونه رگرسیون ریج و لاسو در مجموعه داده های من عمل می کند.
از sklea. linear_model واردات ریج ، لاسوریج = ریج (آلفا = 0. 001)ridge. fit(x_ir_gdp_uer، y_fx)y_fx_ridge = ridge. predict(x_ir_gdp_uer)print(ridge. score(x_ir_gdp_uer، y_fx))کمند = کمند (آلفا=0. 001)lasso. fit(x_ir_gdp_uer، y_fx)y_fx_lasso = lasso. predict(x_ir_gdp_uer)print(lasso. score(x_ir_gdp_uer، y_fx))
R-Squared of Ridge 88% و از Lasso 87% است. وقتی این اعداد را با رگرسیون خطی چندگانه (88. 9٪) مقایسه می کنیم، خیلی بد نیست. این ثابت می کند که بیش از حد به مدل ما نمی رسد!
وای! این مجموعه ای برای قسمت دوم این پروژه است! برای جذب خیلی زیاد است، اینطور نیست؟اما امیدوارم این مقاله آموزنده و کاربردی بوده باشد.
به طور خلاصه، ما خطی را پیدا کرده ایم که به بهترین وجه با مجموعه داده های ما مطابقت دارد و الگوی نرخ ارز را در طول سال ها توضیح می دهد! بعد چی؟
باز هم، به بخش پایانی پروژه من توجه کنید که چگونگی پیش بینی نرخ ارز در سال 2020 را با استفاده از خط رگرسیونی که به تازگی کشف کرده ایم، پوشش می دهد. در ضمن، اگر این را مفید می دانید، به من دست بزنید و می توانید برای مخزن کامل، Github من را در اینجا بررسی کنید:
کتاب آموزش بورس...
ما را در سایت کتاب آموزش بورس دنبال می کنید
برچسب : نویسنده : محمود استادمحمد بازدید : 24 تاريخ : پنجشنبه 19 مرداد 1402 ساعت: 17:19