برنامه نویسی

استفاده از ML و AI برای پیش بینی قیمت سهام

به سفر دیگری به AI (که هنوز هم بسیار کافئین دار است – چای یورکسشایر بهترین مارک چای است) خوش آمدید. اگر اولین مقاله هوش مصنوعی من را نخوانده اید ، توصیه می کنم این کار را در اینجا انجام دهید. در غیر این صورت ، TL ؛ DR این است که من برای کل چیز توسعه هوش مصنوعی کاملاً جدید هستم و سعی می کنم تا پایان سال یک مقاله تحقیقاتی منتشر کنم. من به تازگی آموخته ام که چگونه Pytorch ، Numpy و برخی از ریاضیات هوش مصنوعی کار می کنند ، بنابراین می خواهم اصول اولیه ای را که در مقاله آخر به آن رفتم ، پرش کنم. در پایان وبلاگ ، من یک مدل OCR کار کردم. در این مقاله ، امیدواریم که برای پیش بینی سهام ، یک مدل حافظه کوتاه مدت کوتاه مدت (LSTM) داشته باشیم.

بنابراین ، مدل LSTM چیست؟

LSTM نوعی شبکه عصبی مکرر (RNN) است. این بدان معنی است که قبل از اینکه بتوانم توضیح دهم که LSTM چیست ، من باید چند قدم به عقب بردارم و توضیح دهم که یک مدل RNN چیست. RNN نوعی مدل AI است که برای استفاده از داده های پی در پی (داده هایی که در یک دنباله سازماندهی می شوند ، که در آن ترتیب مهم است) طراحی شده است ، مانند جملات ، اندازه گیری سنسور ، توالی ژن ، و شما آن را حدس زده اید ، قیمت سهام. RNN ها یکی از معدود مدل هایی هستند که نوعی حافظه دارند. حافظه موجود در RNN یک حالت پنهان نامیده می شود و این از طریق یک حلقه تغذیه می شود.

درک این ممکن است کمی سخت باشد ، بنابراین بیایید این را به عنوان مثال بیان کنیم. بیایید بگوییم که ما در حال خواندن یک جمله هستیم.

کلمه اول به مدل RNN منتقل می شود و مدل یک حالت پنهان ایجاد می کند. (برای ساده کردن زندگی ، فقط به یک حالت پنهان به عنوان خلاصه ای از آنچه که تاکنون در معرض آن قرار گرفته است فکر کنید.)

در مرحله بعد ، کلمه زیر به مدل RNN ، همراه با حالت پنهان که توسط کلمه قبلی تولید شده است ، داده می شود. یک حالت پنهان به روز/جدید ایجاد می شود.

سپس این مدل همچنان از طریق این جمله حلقه می زند و از حالت پنهان قبلی عبور می کند.

اگر علاقه مند هستید ، این فرایند می تواند به عنوان یک نشان داده شود

کجا:

  • (x_t) = ورودی فعلی (به عنوان مثال ، یک کلمه در زمان
  • (H_ {T-1}) = حالت پنهان قبلی (حافظه از آخرین مرحله)
  • (w ، u ، b) = پارامترهای آموخته شده (وزن و تعصب)
  • (f) = عملکرد فعال سازی (معمولاً tanh یا ReLU)

اگر ریاضیات را نمی فهمید ، این مهم نیست. من آن را برای کسانی که علاقه مند هستند ، باقی مانده است. من خوشحالم که آن را در مورد Discord طی کردم ، اما بیش از حد نگران آن نباشید.

نکته منفی مدل های RNN این است که آنها گاهی اوقات می توانند چیزها را فراموش کنند. این “مشکل شیب ناپدید شده” نامیده می شود. با توجه به اینکه این مدل داده های بیشتری را به خود اختصاص می دهد ، وزن داده های قبلی کاهش می یابد. در نهایت می تواند به حدی کاهش یابد که دیگر قابل توجه نباشد. این امر به این دلیل است که شیب ها در هنگام انتشار عقب به صورت نمایی کوچک می شوند.

یکی از اصلی ترین مزایای LSTM این است که مشکل شیب ناپدید شده را برطرف می کند. LSTM ها از ساختاری به نام سلول حافظه استفاده می کنند که به آنها امکان می دهد اطلاعات را در دوره های طولانی به یاد داشته باشند یا فراموش کنند. سلولهای حافظه دارای سه دروازه هستند.

  • دروازه را فراموش کنید: تصمیم می گیرد که کدام اطلاعات را برای دور کردن از حالت سلول دور کنید.

این دروازه تصمیم می گیرد که بخش هایی از حالت سلول قبلی باید باشد
نگه داشته یا دور ریخته شده است. این حالت پنهان قبلی و جریان را می گیرد
برای هر مقدار در سلول یک عدد بین 0 تا 1 را وارد کرده و خروجی می کند
دولت اگر عدد به یکی نزدیکتر باشد ، نگهداری می شود. اگر نزدیکتر باشد
صفر ، فراموش شده است.

  • دروازه ورودی: تعیین می کند که چه اطلاعات جدیدی باید به حالت سلول اضافه شود.
  • دروازه خروجی: کنترل چه اطلاعاتی از حالت سلول باید به عنوان خروجی استفاده شود.

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

اولین چیز جدید ساخت یک DataFrame است. LSTM ها به داده های پی در پی نیاز دارند ، بنابراین ما باید یک جدول درست کنیم که قیمت های بسته شدن را به عقب برگردانیم. من تصمیم گرفته ام این کار را یک هفته به طور همزمان انجام دهم.

def prepare_dataframe_for_lstm(df, n_steps):
    df = dc(df)
    df.set_index('Date', inplace=True)
    for i in range(1, n_steps + 1):
        df[f'Close(t-{i})'] = df['Close'].shift(i)
    df.dropna(inplace=True)
    return df
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این خروجی را ایجاد می کند که به نظر می رسد. (این خروجی کامل نیست ، اما تلاش برای قالب بندی بلوک های کد سخت است. شما این ایده را می گیرید.)

               Close  Close(t-1)  Close(t-2)  Close(t-3)  Close(t-4)
Date                                                                
1997-05-27  0.079167    0.075000    0.069792    0.071354    0.081771
1997-05-28  0.076563    0.079167    0.075000    0.069792    0.071354
1997-05-29  0.075260    0.076563    0.079167    0.075000    0.069792
1997-05-30  0.075000    0.075260    0.076563    0.079167    0.075000
1997-06-02  0.075521    0.075000    0.075260    0.076563    0.079167
1997-06-03  0.073958    0.075521    0.075000    0.075260    0.076563
1997-06-04  0.070833    0.073958    0.075521    0.075000    0.075260
1997-06-05  0.077083    0.070833    0.073958    0.075521    0.075000
1997-06-06  0.082813    0.077083    0.070833    0.073958    0.075521
1997-06-09  0.084375    0.082813    0.077083    0.070833    0.073958
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پس از این ، ما باید داده ها را عادی کنیم. با عادی سازی داده ها ، ما حداقل مقدار -1 و حداکثر مقدار 1 را می سازیم. این کار همگرایی را سرعت می بخشد. قیمت سهام می تواند به تعداد گسترده ای برسد ، که منجر به شیب های بزرگ می شود ، چه کند شدن همگرایی یا ایجاد آموزش ناپایدار (تغییرات بزرگ یا سریع در شیب ها یا عملکرد از دست دادن به جای کاهش).

چند مرحله بعدی کسل کننده است ، بنابراین ما فقط بر روی آنها مسواک خواهیم کرد: تبدیل همه چیز به numpy ، تقسیم داده ها به x وت حرف، تغییر شکل داده ها ، و سپس تبدیل آن به Tensors. سرانجام ، ما داده ها را به مجموعه های آزمایش و آموزش تقسیم می کنیم. 95 ٪ اول داده ها برای آموزش استفاده می شود و 5 ٪ آخر برای آزمایش استفاده می شود.

اکنون برای قسمت سرگرم کننده – ایجاد مدل. ساخت LSTM با Pytorch به طرز شگفت آور ساده است. کلاس ما در چهار ویژگی قرار می گیرد: اندازه ورودی ، اندازه پنهان ، تعداد لایه ها و اندازه خروجی. ما از اندازه ورودی 1 استفاده می کنیم ، بنابراین ما یک ردیف جدول را همزمان می پردازیم. اندازه پنهان 4 ، به این معنی که ما در هر LSTM از چهار گره استفاده می کنیم. و یک لایه ، به این معنی که ما از یک مدل LSTM واحد استفاده می کنیم. این امر به این دلیل است که یک مشکل ساده است – چسباندن چندین LSTM در کنار هم می تواند منجر به افزایش بیش از حد شود. این همچنین دلیل استفاده از گره های چندانی است. (“بیش از حد به معنای ایجاد مدلی است که مطابق با (یادآوری) مجموعه آموزش چنان از نزدیک باشد که مدل نتواند پیش بینی های صحیح در مورد داده های جدید انجام دهد” – دوره Crash Google Developer). سرانجام ، فقط یک خروجی وجود دارد ، زیرا تنها داده هایی که می خواهیم از مدل بگیریم ، قیمت آینده سهام است.

class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(LSTM, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        batch_szie = x.size(0)
        h0 = torch.zeros(self.num_layers, batch_szie, self.hidden_size).to(device)
        c0 = torch.zeros(self.num_layers, batch_szie, self.hidden_size).to(device)
        out, _ = self.lstm(x, (h0, c0))
        out = self.fc(out[:, -1, :])
        return out

model = LSTM(1,4,1,1).to(device)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

عملکرد بعدی عملکرد رو به جلو است. اولین مورد ، اولیه سازی حافظه (سلولهای پنهان و حالت) با صفر است. برای هر دسته از حلقه آموزش ، داده های قبلی وجود ندارد ، بنابراین اگر ما یک تانسور صفر ایجاد نکردیم ، رایانه از مقادیر تصادفی از حافظه سیستم استفاده می کند. این منجر به تعصب در داده ها می شود.

مرحله بعدی عبور در دسته فعلی و حافظه به LSTM است. این مرحله دو چیز را برمی گرداند: یک تانسور با مقادیر خروجی و حافظه در حالت نهایی. ما به مقادیر حافظه احتیاج نداریم ، بنابراین ما آن را به خلاء می اندازیم (آن را به یک متغیر _ اختصاص می دهیم ، که یک کنوانسیون در پایتون است تا داده های بلااستفاده یا غیر ضروری را نشان دهد). سپس آخرین بار از تانسور ، آخرین بار از تانسور خارج و استخراج می کنیم. سرانجام ، داده های استخراج شده به یک لایه کاملاً متصل منتقل می شوند و منجر به خروجی قیمت سهام یک ارزش ما می شوند.

این مدل از طریق چندین حلقه آموزشی (همچنین در مقاله آخر توضیح داده شده است) می رود ، و سپس داده های پیش بینی شده خود را با داده های واقعی مقایسه می کنیم. به نظر می رسد این مدل نسبتاً دقیق است.

تصاویر پیش بینی

اکنون برای قسمت سرگرم کننده. ثروتمند شدن سریع من این کد استراتژی تجارت خام را دارم.

initial_cash = 1000
cash = initial_cash
shares = 0
portfolio_value = []

buy_threshold = 1.01  # Buy if the predicted price is 1% higher than current
sell_threshold = 0.99  # Sell if 1% lower
position_size = 0.1  # Allocate 10% of cash per trade

for i in range(1, len(new_y_test)):
    current_price = new_y_test[i]
    predicted_price = test_predictions[i]

    if predicted_price > current_price * buy_threshold and cash >= current_price:
        shares_to_buy = (cash * position_size) // current_price
        shares += shares_to_buy
        cash -= shares_to_buy * current_price
    elif predicted_price < current_price * sell_threshold and shares > 0:
        cash += shares * current_price
        shares = 0

    portfolio_value.append(cash + shares * current_price)

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

حالا ، آیا این کد می تواند بهتر باشد؟ بله ، اما هدف این پروژه جنبه هوش مصنوعی بود. به طور خلاصه ، ما به ارزش فعلی و ارزش آینده پیش بینی شده خود نگاه می کنیم. اگر 1 ٪ بالاتر باشد ، سهام خریداری می کنیم. اگر مقدار آینده 1 ≥ کمتر باشد ، سهام را می فروشیم. اکنون برای اطلاعات کمی که همه می خواهند: این سود چقدر حاصل شد؟

با دادن آن (جعلی) 1000 دلار و اجازه دادن به آن بین سالهای 2021-12-08 و 2023-04-05 (با سرعت در زمان شبیه سازی) ، سود کل 22.99 USD حاصل شد.

حالا ، آیا این یک موفقیت است؟

Kinda من با موفقیت یک مدل LSTM کار ایجاد کرده ام که سود را ایجاد می کند. با این حال ، اگر شما همان 1000 دلار را در ISA 4.4 ٪ قرار داده بودید ، 59 دلار سود کسب می کردید. اما سلام ، این کمتر سرگرم کننده است.

اگر از وبلاگ لذت بردید ، برای دریافت به روزرسانی و بحث در مورد مقالات ، به Discord یا Reddit بپیوندید. یا فید RSS را دنبال کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا