AIAlpha: Sử dụng máy học để dự đoán cổ phiếu

AIAlpha: Sử dụng máy học để dự đoán cổ phiếu

AIAlpha: Sử dụng máy học để dự đoán cổ phiếu

Jewel Nguyen

Active Member
3,977
3,988
upload_2022-5-6_23-22-7.png

Máy học và học sâu đã tìm thấy vị trí của mình trong tổ chức tài chính vì sức mạnh của chúng trong việc dự đoán dữ liệu chuỗi thời gian với mức độ chính xác cao. Có rất nhiều nghiên cứu đang được tiến hành để cải thiện các mô hình để chúng có thể dự đoán dữ liệu sẽ có mức độ chính xác cao hơn. Bài đăng này là một bài viết về dự án AIAlpha của tôi , là một kiến trúc mạng thần kinh xếp chồng lên nhau dự đoán giá cổ phiếu của các công ty khác nhau. Dự án này cũng là một trong những ứng cử viên lọt vào vòng chung kết tại iNTUtion 2018, một cuộc thi hackathon dành cho sinh viên chưa tốt nghiệp tại Singapore.
Quy trình làm việc

Quy trình làm việc cho dự án này về cơ bản là theo các bước sau:
  1. Nhận dữ liệu giá chứng khoán
  2. Khử nhiễu dữ liệu bằng Wavelet Transform
  3. Trích xuất các tính năng bằng cách sử dụng Bộ mã tự động xếp chồng
  4. Đào tạo LSTM bằng các tính năng
  5. Mô hình kiểm tra độ chính xác của dự đoán
Trong bài đăng này, tôi sẽ đi qua các chi tiết cụ thể của từng bước và lý do tại sao tôi chọn đưa ra các quyết định nhất định.

Thu thập dữ liệu


Dữ liệu giá cổ phiếu dễ dàng có được nhờ pandas_datareaderAPI cho Yahoo Finance. Do đó, nó đã được thực hiện đơn giản với

stock_data = pdr.get_data_yahoo(self.ticker, self.start, self.end).

Denoising Data


Do sự phức tạp của động lực thị trường chứng khoán, dữ liệu giá cổ phiếu thường chứa đầy nhiễu có thể làm máy học phân tâm khỏi việc học xu hướng và cấu trúc. Do đó, lợi ích của chúng tôi là loại bỏ một số nhiễu, trong khi vẫn bảo toàn các xu hướng và cấu trúc trong dữ liệu. Lúc đầu, tôi muốn sử dụng Biến đổi Fourier (những người không quen nên đọc bài viết này ), nhưng tôi nghĩ Biến đổi Wavelet có thể là lựa chọn tốt hơn để bảo toàn yếu tố thời gian của dữ liệu, thay vì tạo ra đầu ra chỉ dựa trên tần số.

Biến đổi Wavelet


Biến đổi wavelet có liên quan rất chặt chẽ với Biến đổi Fourier, chỉ là hàm được sử dụng để biến đổi là khác và cách biến đổi này xảy ra cũng hơi khác nhau.

upload_2022-5-6_23-37-37.png


Quá trình diễn ra như sau: dữ liệu được biến đổi bằng cách sử dụng biến đổi Wavelet, sau đó loại bỏ các hệ số hơn độ lệch chuẩn hoàn toàn (trong số tất cả các hệ số) và biến đổi nghịch đảo các hệ số mới để có được dữ liệu bị biến đổi.
Dưới đây là một ví dụ về cách biến đổi wavelet biểu thị dữ liệu chuỗi thời gian:

upload_2022-5-6_23-22-59.png


Như bạn có thể thấy, nhiễu ngẫu nhiên xuất hiện trong tín hiệu ban đầu không có trong các phiên bản bị loại bỏ. Đây chính xác là những gì chúng tôi đang tìm cách làm với dữ liệu giá cổ phiếu của mình.
Đây là mã để làm thế nào để loại bỏ dữ liệu:

x = np.array (self.stock_data.iloc [i: i + 11, j])
(ca, cd) = pywt.dwt (x, "haar")
cat = pywt.threshold (ca, np.std (ca ), mode = "soft")
cdt = pywt.threshold (cd, np.std (cd), mode = "soft")
tx = pywt.idwt (cat, cdt, "haar")

Thư viện pywttuyệt vời cho các phép biến đổi wavelet đã làm giảm tải của tôi rất nhiều.

Tính năng giải nén


Trong bối cảnh học máy thông thường, việc trích xuất các tính năng sẽ yêu cầu kiến thức chuyên môn về miền. Đây là điều xa xỉ mà tôi không có được. Có lẽ tôi có thể thử sử dụng một số dạng chỉ báo kỹ thuật như đường trung bình động hoặc phân kỳ hội tụ trung bình động (MACD) hoặc các thước đo xung lượng, nhưng tôi cảm thấy rằng việc sử dụng nó một cách mù quáng có thể không tối ưu.

Tuy nhiên, việc khai thác tính năng tự động có thể đạt được bằng cách sử dụng các bộ mã tự động xếp chồng lên nhau hoặc các thuật toán học máy khác như máy Boltzmann bị hạn chế. Tôi đã chọn sử dụng các bộ mã tự động xếp chồng lên nhau do khả năng diễn giải của mã hóa so với xác suất từ các máy Boltzmann bị hạn chế.

Bộ mã tự động xếp chồng


Về bản chất, các bộ mã tự động xếp chồng lên nhau rất tốt trong việc nén dữ liệu và tái tạo dữ liệu trở lại. Điều chúng tôi quan tâm là phần nén, vì nó có nghĩa là thông tin cần thiết để tái tạo dữ liệu theo một cách nào đó được mã hóa ở dạng nén. Điều này cho thấy rằng theo một cách nào đó, những dữ liệu nén này có thể là đặc điểm của dữ liệu mà chúng tôi đang cố gắng trích xuất các tính năng từ đó. Sau đây là cấu trúc mạng của bộ mã tự động xếp chồng:
upload_2022-5-6_23-24-3.png


Dữ liệu đầu vào được nén thành bất kỳ số lượng nơ-ron nào mong muốn và mạng buộc phải xây dựng lại dữ liệu ban đầu bằng cách sử dụng tự động mã hóa. Điều này buộc mô hình phải trích xuất các yếu tố chính của dữ liệu, mà chúng ta có thể hiểu là các đặc trưng. Một điều quan trọng cần lưu ý là mô hình này thực sự nằm trong chế độ học không giám sát vì không có cặp đầu vào đầu ra, nhưng cả đầu vào và đầu ra đều giống nhau.

Chúng ta có thể sử dụng kerasđể xây dựng một mô hình như vậy và sẽ hữu ích hơn nếu sử dụng API chức năng thay vì mô hình tuần tự.

class AutoEncoder:
def __init __ (self, encoding_dim):
self.encoding_dim = encoding_dim def build_train_model (self, input_shape, encoded1_shape, encoded2_shape, decoded1_shape, decoded2_shape):
input_data = Input (shape = (1, input_shape)) encoded1 = Dense (encoded1_shape, activation = "relu", activity_regularizer = rules.l2 (0)) (input_data)
encoded2 = Dense (encoded2_shape, activation = "relu", activity_regularizer = rules.l2 (0)) (encoded1)
encoded3 = Dense (self.encoding_dim, activation = "relu", activity_regularizer = Regiarizers.l2 (0)) (encoded2)
decoded1 = Dense (decoded1_shape, activation = "relu", activity_regularizer = rules.l2 (0)) (encoded3)
decoded2 = Dense (decoded2_shape, activation = "relu", activity_regularizer = Regiarizers.l2 (0)) (decoded1)
decoded = Dense (input_shape, activation = "sigmoid", activity_regularizer = rules.l2 (0)) (decoded2) autoencoder = Mô hình (đầu vào = dữ liệu đầu vào, đầu ra = được giải mã) encoder = Model (input_data, encoded3) # Bây giờ đào tạo mô hình bằng cách sử dụng dữ liệu mà chúng tôi đã xử lý trước
autoencoder.compile (loss = "mean_squared_error", Optimizer = "adam") train = pd.read_csv ("tiền xử lý / rbm_train.csv", index_col = 0)
ntrain = np.array (train)
train_data = np.reshape (ntrain, (len (ntrain), 1, input_shape)) # print (train_data)
# autoencoder.summary ()
autoencoder.fit (train_data, train_data, epochs = 1000)

Tôi đã đào tạo tự động mã hóa với dữ liệu giá cổ phiếu bị biến đổi từ năm 2000 đến năm 2008. Sau khi đào tạo trong 1000 kỷ nguyên, RMSE giảm xuống còn khoảng 0,9. Sau đó, tôi sử dụng mô hình đó để mã hóa phần còn lại của dữ liệu giá cổ phiếu của mình thành các tính năng.

Mô hình LSTM


Mô hình LSTM không cần giới thiệu vì nó đã trở nên rất phổ biến và phổ biến trong việc dự đoán chuỗi thời gian. Nó có khả năng dự đoán đặc biệt từ sự tồn tại của trạng thái tế bào cho phép nó hiểu và tìm hiểu các xu hướng dài hạn trong dữ liệu. Điều này đặc biệt quan trọng đối với dữ liệu giá cổ phiếu của chúng tôi. Tôi sẽ thảo luận về một số khía cạnh của sự lựa chọn thiết kế mà tôi cảm thấy là quan trọng dưới đây.

Trình tối ưu hóa


Loại trình tối ưu hóa được sử dụng có thể ảnh hưởng lớn đến tốc độ hội tụ của thuật toán đến giá trị nhỏ nhất. Ngoài ra, điều quan trọng là phải có một số khái niệm ngẫu nhiên để tránh bị mắc kẹt trong mức tối thiểu cục bộ và không đạt mức tối thiểu toàn cầu. Có một vài thuật toán tuyệt vời, nhưng tôi đã chọn sử dụng trình tối ưu hóa Adam. Trình tối ưu hóa Adam kết hợp các đặc quyền của hai trình tối ưu hóa khác: ADAgrad và RMSprop.

Về cơ bản, trình tối ưu hóa ADAgrad sử dụng một tốc độ học tập khác nhau cho mọi tham số và mọi bước thời gian. Lý do đằng sau ADAgrad là các tham số không thường xuyên phải có tốc độ học tập lớn hơn trong khi các tham số thường xuyên phải có tốc độ học tập nhỏ hơn. Nói cách khác, bản cập nhật dốc nghiêng ngẫu nhiên cho ADAgrad trở thành

upload_2022-5-6_23-40-3.png


Tốc độ học tập được tính toán dựa trên các độ dốc trong quá khứ đã được tính toán cho mỗi tham số. Vì thế,

upload_2022-5-6_23-40-26.png


Trong đó G là ma trận tổng bình phương của các chuyển sắc trong quá khứ. Vấn đề với sự tối ưu hóa này là tỷ lệ học tập bắt đầu biến mất rất nhanh khi số lần lặp lại tăng lên.
RMSprop xem xét việc sửa chữa tốc độ học tập đang giảm dần bằng cách chỉ sử dụng một số điểm tốt nghiệp trước đó. Các bản cập nhật trở thành

upload_2022-5-6_23-40-57.png


Bây giờ chúng ta đã hiểu cách hoạt động của hai trình tối ưu hóa đó, chúng ta có thể xem xét cách hoạt động của Adam.

Ước tính thời điểm thích ứng, hay Adam, là một phương pháp khác tính toán tỷ lệ học tập thích ứng cho từng tham số bằng cách xem xét giá trị trung bình giảm dần theo cấp số nhân của các gradient bình phương trong quá khứ và trung bình giảm dần theo cấp số nhân của các gradient trong quá khứ. Điều này có thể được biểu diễn dưới dạng

upload_2022-5-6_23-41-38.png


v và m có thể được coi là ước lượng của thời điểm đầu tiên và thứ hai của các gradient tương ứng, do đó có tên là Ước tính Moment thích ứng. Khi điều này lần đầu tiên được sử dụng, các nhà nghiên cứu đã quan sát thấy rằng có một sự thiên vị cố hữu đối với 0 và họ phản đối điều này bằng cách sử dụng các ước tính sau:

upload_2022-5-6_23-42-15.png


Điều này dẫn chúng ta đến quy tắc cập nhật gradient cuối cùng

upload_2022-5-6_23-42-38.png


Đây là trình tối ưu hóa mà tôi đã sử dụng và những lợi ích được tóm tắt thành những điều sau:
  1. Tốc độ học tập là khác nhau đối với mọi tham số và mọi lần lặp.
  2. Việc học không giảm đi như với ADAgrad.
  3. Bản cập nhật gradient sử dụng các khoảnh khắc của sự phân bố trọng số, cho phép xác định rõ ràng hơn về mặt thống kê.
Qui tắc

Một khía cạnh quan trọng khác của việc huấn luyện mô hình là đảm bảo các trọng lượng không quá lớn và bắt đầu tập trung vào một điểm dữ liệu, do đó sẽ bị quá tải. Vì vậy, chúng ta nên luôn bao gồm một hình phạt đối với trọng lượng lớn (định nghĩa về trọng lượng lớn sẽ tùy thuộc vào loại thiết bị quản lý được sử dụng). Tôi đã chọn sử dụng chính quy Tikhonov, có thể coi đây là vấn đề giảm thiểu sau:

upload_2022-5-6_23-43-6.png


Thực tế là không gian hàm nằm trong Không gian Hilbert Kernel tái tạo (RKHS) đảm bảo rằng khái niệm chuẩn tồn tại. Điều này cho phép chúng tôi mã hóa khái niệm chuẩn mực vào cơ quan quản lý của chúng tôi.

Dropouts


Một phương pháp mới hơn để ngăn chặn việc ăn quá nhiều xem xét điều gì sẽ xảy ra khi một số tế bào thần kinh đột nhiên không hoạt động. Điều này buộc mô hình không được phụ thuộc quá mức vào bất kỳ nhóm tế bào thần kinh nào và xem xét tất cả chúng. Những người bỏ học đã tìm thấy công dụng của chúng trong việc làm cho các tế bào thần kinh mạnh mẽ hơn và do đó cho phép họ dự đoán xu hướng mà không cần tập trung vào bất kỳ tế bào thần kinh nào. Đây là kết quả của việc sử dụng học sinh bỏ học
upload_2022-5-6_23-25-16.png


Như bạn có thể nói, khi có lỗi bỏ qua, lỗi tiếp tục giảm trong khi không bỏ qua các cao nguyên lỗi.

Triển khai mô hình


Tất cả các phân tích ở trên có thể được thực hiện tương đối dễ dàng nhờ kerasvà API chức năng của chúng. Đây là mã cho mô hình (để xem toàn bộ mã, hãy xem GitHub: AlphaAI của tôi )

class NeuralNetwork:
def __init __ (self, input_shape, stock_or_return):
self.input_shape = input_shape
self.stock_or_return = stock_or_return def make_train_model (self):
input_data = kl.Input (shape = (1, self.input_shape))
lstm = kl.LSTM (5, input_shape = (1, self.input_shape), return_sequences = True, activity_regularizer = rules.l2 ( 0,003),
recurrent_regularizer = rules.l2 (0), bỏ học = 0,2, recurrent_dropout = 0,2) (input_data)
perc = kl.Dense (5, kích hoạt = "sigmoid", activity_regularizer = điều hòa.l2 (0,005)) (lstm)
lstm2
= kl
. Activity_regularizer = Regarizers.l2 (0,001)) (lstm2) model = Model (input_data, out)
model.compile (Optimizer = "adam", loss = "mean_squared_error", metrics = ["mse"]) # tải dữ liệu train = np.reshape (np.array (pd.read_csv ("features / autoencoded_train_data.csv", index_col = 0)),
(len (np.array (pd.read_csv ("features / autoencoded_train_data.csv"))), 1, self.input_shape))
train_y = np.array (pd.read_csv ("features / autoencoded_train_y.csv", index_col = 0))
# train_stock = np.array (pd.read_csv ("train_stock.csv")) # mô hình xe lửa model.fit (train, train_y, epochs = 2000)
Các kết quả

Đây là kết quả dự đoán của tôi cho các công ty khác nhau.
upload_2022-5-6_23-26-8.png

upload_2022-5-6_23-26-32.png

Rõ ràng là kết quả của việc sử dụng kiến trúc mạng nơ-ron này là khá tốt và có thể mang lại lợi nhuận nếu được thực hiện thành một chiến lược.

Học trực tuyến


Ngoài việc mô hình học hỏi từ dữ liệu lịch sử, tôi muốn làm cho mô hình luôn học hỏi, ngay cả từ các dự đoán. Do đó, tôi đã làm cho nó trở thành một mô hình trực tuyến có thể học hỏi và dự đoán. Nói cách khác, nó học qua dữ liệu lịch sử, dự đoán giá ngày mai và ngày mai, khi giá thực tế được biết, nó cũng học bằng cách sử dụng nó. Vì vậy mẫu mã luôn được cải tiến.
Ngoài việc sử dụng giá thực tế để cải thiện, tôi cũng đã xem xét việc tạo ra một mô hình thứ cấp sử dụng các giá trị cảm tính của tin tức và Twitter về công ty. Đầu tiên tôi sẽ phác thảo cách thu thập những dữ liệu đó.

Dữ liệu Twitter


Ngoài dữ liệu giá cổ phiếu, tôi muốn thử nghiệm với một số xử lý ngôn ngữ tự nhiên. Do đó, tôi đã thử nghiên cứu sử dụng dữ liệu tình cảm từ twitter và tin tức để cải thiện dự đoán chứng khoán.
Cuộc đấu tranh lớn đầu tiên là lấy được các tweet miễn phí, vì API Twitter để tìm nạp toàn bộ kho lưu trữ đã được trả tiền. Tuy nhiên, tôi đã tìm thấy một API cho phép tôi nhận các tweet trong 10 ngày qua và sau đó tôi có thể triển khai một số dạng NLP để trích xuất dữ liệu tình cảm từ các tweet. Điều này không tối ưu nhưng vẫn hữu ích cho mô hình học trực tuyến của tôi.
Api twitter đã được sử dụng để đánh giá trong 10 ngày qua và điểm tình cảm được tính bằng TextBlob và được tính trung bình trên nhiều tweet.

Dữ liệu Tin tức


Tương tự như Twitter, việc lấy dữ liệu tin tức vô cùng khó khăn. Tôi đã thử phân tích URL của các bài báo của Bloomberg nhưng nhận ra rằng việc loại bỏ các trang web theo cách thủ công từ năm 2000 là điều gần như không thể. Do đó, tôi đã giải quyết bằng API Aylien có một mô hình cạo khá mạnh mẽ.

Các bài báo được lọc với điều kiện chỉ bao gồm chứng khoán và tin tức tài chính, được lọc theo 150 trang web Alexa hàng đầu và điểm số cảm nhận được tính trung bình bằng cách sử dụng đường trung bình động có trọng số theo cấp số nhân để tính đến các tin tức gần đây hơn các tin tức cũ hơn.

Mô hình trực tuyến


Với điểm số cảm nhận của mình, tôi đã sử dụng thêm một lớp mạng nơ-ron để sửa lỗi dự đoán của mình nhiều hơn nữa. Tuy nhiên, kết quả của điều này không có sẵn tại thời điểm của bài viết này, vì phải mất một ngày để tạo ra một điểm dữ liệu.

Sự kết luận


Mạng nơ-ron rất thành thạo trong việc dự đoán dữ liệu chuỗi thời gian và khi kết hợp với dữ liệu cảm tính, nó thực sự có thể tạo ra một mô hình thực tế. Mặc dù kết quả ở đây rất ấn tượng, tôi vẫn đang tìm cách cải thiện nó và có thể thực sự phát triển một chiến lược giao dịch đầy đủ từ nó. Hiện tại, tôi đang xem xét việc sử dụng Học tăng cường để phát triển một đại lý giao dịch sử dụng kết quả từ mô hình dự đoán.

Nguồn:
Xem thêm chi tiết: https://medium.com/engineer-quant/alphaai-using-machine-learning-to-predict-stocks-79c620f87e53
 
 

Giới thiệu sách Trading hay
Phương Pháp Wyckoff Hiện Đại - Kỹ thuật Nhận diện Xu hướng Thị trường Tiềm năng

Phương pháp Wyckoff là một phương pháp price action kinh điển và đem lại thành công cho nhiều trader. Phương pháp này là nền tảng của nhiều phương pháp trading nổi tiếng khác
Chỉnh sửa lần cuối:

BÌNH LUẬN MỚI NHẤT

AdBlock Detected

We get it, advertisements are annoying!

Sure, ad-blocking software does a great job at blocking ads, but it also blocks useful features of our website. For the best site experience please disable your AdBlocker.

Back
Bên trên

Miễn trừ trách nhiệm

Tất cả nội dung trên website này đều vì mục đích cung cấp thông tin và không phải lời khuyên đầu tư.

Tại Việt Nam, giao dịch CFD forex có các rủi ro nhất định, trong đó bao gồm rủi ro về pháp lý. Độc giả nên tìm hiểu kỹ trước khi đưa ra quyết định tham gia.