Python tính EMA như thế nào?
Trong bài đầu tiên của loạt bài Hộp công cụ giao dịch tài chính (Xây dựng Hộp công cụ giao dịch tài chính bằng Python. Đường trung bình động đơn giản), chúng ta đã thảo luận cách tính đường trung bình động đơn giản, thêm nó vào biểu đồ chuỗi giá và sử dụng nó cho các quyết định đầu tư và giao dịch. Đường trung bình động đơn giản chỉ là một trong số các đường trung bình động có sẵn có thể được áp dụng cho chuỗi giá để xây dựng hệ thống giao dịch hoặc khung quyết định đầu tư. Trong số đó, hai đường trung bình động khác thường được sử dụng trong thị trường tài chính Show
Trong bài viết này, chúng ta sẽ tìm hiểu cách tính hai giá trị trung bình đó và cách đảm bảo rằng kết quả khớp với các định nghĩa mà chúng ta cần triển khai Khối lượng di chuyển trung bìnhTrong một số ứng dụng, một trong những hạn chế của đường trung bình động đơn giản là nó mang lại trọng số bằng nhau cho từng mức giá hàng ngày có trong cửa sổ. e. g. , trong đường trung bình động 10 ngày, ngày gần đây nhất có cùng trọng số với ngày đầu tiên trong cửa sổ. mỗi giá nhận được trọng số 10% So với Đường trung bình động đơn giản, Đường trung bình động có trọng số tuyến tính (hoặc đơn giản là Đường trung bình động có trọng số, WMA), mang lại nhiều trọng lượng hơn cho giá gần đây nhất và giảm dần khi chúng ta nhìn lại thời gian. Trên bình quân gia quyền của 10 ngày, giá của ngày thứ 10 sẽ được nhân với 10, giá của ngày thứ 9 nhân với 9, ngày thứ 8 nhân với 8, v.v. Tổng số sau đó sẽ được chia cho tổng trọng số (trong trường hợp này. 55). Trong ví dụ cụ thể này, giá gần đây nhất nhận được khoảng 18. 2% tổng trọng lượng, lần thứ hai gần đây hơn 16. 4%, v.v. cho đến khi giá cũ nhất trong cửa sổ nhận được 0. 02% trọng lượng Hãy áp dụng điều đó vào thực tế với một ví dụ trong Python. Ngoài gấu trúc và Matplotlib, chúng tôi sẽ sử dụng NumPy import pandas as pd Chúng tôi áp dụng một phong cách cho các biểu đồ của chúng tôi. Nếu bạn đang sử dụng Jupyter, bạn nên thêm hướng dẫn plt.style.use('fivethirtyeight') 4 (và bỏ qua plt.style.use('fivethirtyeight') 5 khi tạo biểu đồ)plt.style.use('fivethirtyeight') Đối với các ví dụ tiếp theo, chúng tôi sẽ sử dụng dữ liệu giá từ StockCharts. com bài viết. Đó là một bài viết giáo dục tuyệt vời về đường trung bình động và tôi khuyên bạn nên đọc nó. Chuỗi giá được sử dụng trong bài viết đó có thể thuộc về bất kỳ cổ phiếu hoặc công cụ tài chính nào và sẽ phục vụ mục đích minh họa của chúng tôi Tôi đã sửa đổi trang tính Excel ban đầu bằng cách bao gồm các tính toán cho WMA 10 ngày vì tính toán cho EMA đã được bao gồm. Bạn có thể truy cập tệp Google Trang tính của tôi và tải xuống dữ liệu ở định dạng CSV tại đây Khi lập mô hình dữ liệu, luôn luôn là một phương pháp hay để bắt đầu với việc triển khai mô hình đơn giản mà chúng ta có thể sử dụng để đảm bảo rằng kết quả từ việc triển khai cuối cùng của chúng ta là chính xác Chúng tôi bắt đầu bằng cách tải dữ liệu vào khung dữ liệu datafile = 'cs-movavg.csv'data = pd.read_csv(datafile, index_col = 'Date') Bây giờ chúng ta sẽ chỉ xem xét các cột Giá và WMA 10 ngày và chuyển sang EMA sau Khi nói đến các đường trung bình động có trọng số tuyến tính, thư viện gấu trúc không có phương pháp sẵn có để tính toán chúng. Tuy nhiên, nó cung cấp một phương pháp rất mạnh mẽ và linh hoạt. plt.style.use('fivethirtyeight') 6 Phương pháp này cho phép chúng tôi tạo và chuyển bất kỳ chức năng tùy chỉnh nào sang cửa sổ cuộn. đó là cách chúng tôi sẽ tính toán Đường trung bình động có trọng số của mình. Để tính WMA 10 ngày, chúng tôi bắt đầu bằng cách tạo một mảng trọng số - các số nguyên từ 1 đến 10weights = np.arange(1,11) #this creates an array with integers 1 to 10 includedweights trông như thế nào array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) Tiếp theo, bằng cách sử dụng phương pháp plt.style.use('fivethirtyeight') 6, chúng tôi chuyển hàm của chính mình (hàm lambda) để tính tích vô hướng của trọng số và giá trong cửa sổ cuộn của chúng tôi (giá trong cửa sổ sẽ được nhân với trọng số tương ứng, sau đó tính tổng), sau đó chia cho wma10 = data['Price'].rolling(10).apply(lambda prices: np.dot(prices, weights)/weights.sum(), raw=True)wma10.head(20) cái nào mang lại Bây giờ, chúng tôi muốn so sánh WMA của chúng tôi với WMA thu được từ bảng tính. Để làm như vậy, chúng tôi có thể thêm cột 'WMA 10 ngày của chúng tôi' vào khung dữ liệu. Để so sánh trực quan dễ dàng hơn, chúng ta có thể làm tròn chuỗi WMA thành ba số thập phân bằng cách sử dụng phương pháp plt.style.use('fivethirtyeight') 8 từ NumPy. Sau đó, chúng tôi chọn các cột giá và WMA sẽ được hiển thịdata['Our 10-day WMA'] = np.round(wma10, decimals=3)data[['Price', '10-day WMA', 'Our 10-day WMA']].head(20) Đang hiển thị Hai cột WMA trông giống nhau. Có một vài sự khác biệt ở vị trí thập phân thứ ba, nhưng chúng tôi có thể coi đó là lỗi làm tròn và kết luận rằng việc triển khai WMA của chúng tôi là chính xác. Trong một ứng dụng thực tế, nếu muốn chặt chẽ hơn, chúng ta nên tính toán sự khác biệt giữa hai cột và kiểm tra xem chúng có quá lớn không. Hiện tại, chúng tôi giữ mọi thứ đơn giản và chúng tôi có thể hài lòng với việc kiểm tra trực quan Sẽ rất thú vị khi so sánh trong một biểu đồ WMA mới được tạo của chúng tôi với SMA quen thuộc sma10 = data['Price'].rolling(10).mean()plt.figure(figsize = (12,6))plt.plot(data['Price'], label="Price") Màn trình diễn này Như chúng ta có thể thấy, cả hai đường trung bình đều làm dịu biến động giá. Đường WMA phản ứng mạnh hơn và theo sát giá hơn đường SMA. chúng tôi hy vọng rằng vì WMA mang lại nhiều trọng lượng hơn cho các quan sát giá gần đây nhất. Ngoài ra, cả hai chuỗi trung bình động bắt đầu vào ngày 10. ngày đầu tiên có đủ dữ liệu để tính giá trị trung bình Đường trung bình động có trọng số có thể ít được biết đến hơn so với người anh em theo cấp số nhân của nó. Tuy nhiên, nó có thể là một mục bổ sung trong hộp công cụ của chúng tôi khi chúng tôi cố gắng xây dựng các giải pháp ban đầu. Việc triển khai WMA trong Python buộc chúng tôi phải tìm cách tạo các đường trung bình động tùy chỉnh bằng cách sử dụng plt.style.use('fivethirtyeight') 6. kỹ thuật này cũng có thể được sử dụng để triển khai các đường trung bình động mới và ban đầuĐường trung bình động hàm mũTương tự như Đường trung bình động có trọng số, Đường trung bình động hàm mũ (EMA) gán trọng số lớn hơn cho các quan sát giá gần đây nhất. Mặc dù nó gán trọng số thấp hơn cho dữ liệu trong quá khứ, nhưng nó dựa trên công thức đệ quy bao gồm trong tính toán của nó tất cả dữ liệu trong quá khứ trong chuỗi giá của chúng tôi EMA tại thời điểm t được tính bằng giá hiện tại nhân với hệ số làm mịn alpha (số dương nhỏ hơn 1) cộng với EMA tại thời điểm 𝑡−1 nhân với 1 trừ alpha. Về cơ bản, nó là một giá trị giữa EMA trước đó và giá hiện tại Hệ số làm mịn 𝛼 ( alpha ) được định nghĩa là trong đó 𝑛 là số ngày trong khoảng thời gian của chúng ta. Do đó, đường EMA 10 ngày sẽ có hệ số làm mịn Pandas bao gồm một phương pháp tính toán đường trung bình động EMA của bất kỳ chuỗi thời gian nào. datafile = 'cs-movavg.csv'data = pd.read_csv(datafile, index_col = 'Date')0 Liệu phương pháp này có đáp ứng nhu cầu của chúng tôi và tính toán giá trị trung bình phù hợp với định nghĩa của chúng tôi không? ema10 = data['Price'].ewm(span=10).mean()ema10.head(10) cái nào mang lại Chúng tôi muốn so sánh chuỗi EMA này với chuỗi thu được trong bảng tính data['Our 10-day EMA'] = np.round(ema10, decimals=3)data[['Price', '10-day EMA', 'Our 10-day EMA']].head(20) Kết quả nào Như bạn đã nhận thấy, chúng tôi có một vấn đề ở đây. đường EMA 10 ngày mà chúng tôi vừa tính không tương ứng với đường EMA được tính trong bảng tính đã tải xuống. Một bắt đầu vào ngày 10, trong khi một bắt đầu vào ngày 1. Ngoài ra, các giá trị không khớp chính xác Là tính toán của chúng tôi sai? . hai chuỗi đó tương ứng với hai định nghĩa khác nhau về EMA. Cụ thể hơn, công thức được sử dụng để tính EMA là như nhau. Những gì thay đổi chỉ là việc sử dụng các giá trị ban đầu Nếu chúng ta xem xét kỹ định nghĩa về Đường trung bình trượt hàm mũ trên StockCharts. trang web com chúng ta có thể nhận thấy một chi tiết quan trọng. họ bắt đầu tính toán đường trung bình động 10 ngày vào ngày thứ 10, bỏ qua những ngày trước đó và thay thế giá vào ngày 10 bằng SMA 10 ngày của nó. Đó là một định nghĩa khác với định nghĩa được áp dụng khi chúng tôi tính toán EMA trực tiếp bằng phương pháp datafile = 'cs-movavg.csv'data = pd.read_csv(datafile, index_col = 'Date')1 Các dòng mã sau đây tạo ra một chuỗi giá sửa đổi mới trong đó 9 giá đầu tiên (khi SMA không khả dụng) được thay thế bằng NaN và giá vào ngày thứ 10 trở thành SMA 10 ngày của nó plt.style.use('fivethirtyeight') 0Chúng ta có thể sử dụng chuỗi giá sửa đổi này để tính toán phiên bản thứ hai của EWM. Bằng cách xem tài liệu, chúng ta có thể lưu ý rằng phương thức datafile = 'cs-movavg.csv'data = pd.read_csv(datafile, index_col = 'Date')1 có một tham số điều chỉnh mặc định là True. Tham số này điều chỉnh các trọng số để giải thích cho sự mất cân bằng trong các giai đoạn đầu (nếu bạn cần biết thêm chi tiết, hãy xem phần Cửa sổ có trọng số theo cấp số nhân trong phần ) Nếu chúng tôi muốn mô phỏng EMA như trong bảng tính của mình bằng cách sử dụng chuỗi giá đã sửa đổi, thì chúng tôi không cần điều chỉnh này. Sau đó, chúng tôi đặt datafile = 'cs-movavg.csv'data = pd.read_csv(datafile, index_col = 'Date')3 plt.style.use('fivethirtyeight') 1EMA mới được tính này có khớp với đường được tính trong bảng tính không? plt.style.use('fivethirtyeight') 2Bây giờ, chúng tôi đang làm tốt hơn nhiều. Chúng tôi đã nhận được một chuỗi EMA khớp với chuỗi được tính toán trong bảng tính Chúng tôi đã kết thúc với hai phiên bản EMA khác nhau trong tay
Cái nào là tốt nhất để sử dụng? . nó phụ thuộc vào những gì chúng tôi cần cho ứng dụng của chúng tôi và để xây dựng hệ thống của chúng tôi. Nếu chúng ta cần một chuỗi EMA bắt đầu từ ngày đầu tiên, thì chúng ta nên chọn chuỗi đầu tiên. Mặt khác, nếu chúng ta cần sử dụng mức trung bình của mình kết hợp với các mức trung bình khác không có giá trị cho những ngày đầu tiên (chẳng hạn như SMA), thì mức thứ hai có lẽ là mức tốt nhất EMA thứ hai được sử dụng rộng rãi trong số các nhà phân tích thị trường tài chính. nếu chúng ta cần triển khai một hệ thống đã có sẵn, chúng ta cần cẩn thận sử dụng định nghĩa chính xác. Nếu không, kết quả có thể không như chúng tôi mong đợi và có thể đặt dấu hỏi về tính chính xác của tất cả công việc của chúng tôi. Trong mọi trường hợp, sự khác biệt về số giữa hai mức trung bình đó là tối thiểu, với tác động đến hệ thống quyết định đầu tư hoặc giao dịch của chúng tôi chỉ giới hạn trong những ngày đầu tiên Hãy xem xét tất cả các đường trung bình động mà chúng ta đã sử dụng cho đến nay trong biểu đồ plt.style.use('fivethirtyeight') 3Trong tất cả các đường trung bình động, đường WMA có vẻ phản ứng nhanh hơn và gắn giá chặt chẽ hơn, trong khi đường SMA là đường phản hồi chậm hơn. Hai phiên bản của EMA có xu hướng trùng nhau, chủ yếu vào những ngày cuối năm Tôi hy vọng bạn tìm thấy bài viết này hữu ích. Việc giới thiệu Đường trung bình động có trọng số đã giúp chúng tôi tìm hiểu và triển khai mức trung bình tùy chỉnh dựa trên một định nghĩa cụ thể. Làm việc với Đường trung bình trượt hàm mũ đã cho chúng tôi cơ hội để làm nổi bật tầm quan trọng của việc đảm bảo rằng bất kỳ chức năng nào chúng tôi đang sử dụng để hoạt động trên chuỗi giá đều khớp với định nghĩa mà chúng tôi có cho bất kỳ nhiệm vụ cụ thể nào Lưu ý từ các biên tập viên của Hướng tới Khoa học Dữ liệu. Mặc dù chúng tôi cho phép các tác giả độc lập xuất bản các bài viết theo các quy tắc và nguyên tắc của chúng tôi, nhưng chúng tôi không xác nhận đóng góp của từng tác giả. Bạn không nên dựa vào tác phẩm của tác giả mà không tìm kiếm lời khuyên chuyên nghiệp. Xem Điều khoản độc giả của chúng tôi để biết chi tiết Python tính toán đường trung bình động như thế nào?Phương pháp 1. Sử dụng Numpy
. Có thể tính trung bình động bằng cách chia tổng số phần tử tích lũy cho kích thước cửa sổ .
EMA được tính như thế nào?Cuối cùng, công thức sau được sử dụng để tính EMA hiện tại. EMA = Giá đóng cửa x hệ số + EMA (ngày trước) x (1 hệ số)
Đường trung bình động hàm mũ trong python là gì?Đường trung bình động hàm mũ (EMA) là một loại Đường trung bình động . Nó giúp người dùng lọc tiếng ồn và tạo ra một đường cong mượt mà. Trong Đường trung bình động 2 rất phổ biến. Đường trung bình động đơn giản chỉ tính toán giá trị trung bình bằng cách thực hiện thao tác trung bình trên dữ liệu đã cho nhưng nó thay đổi từ khoảng này sang khoảng khác.
Làm cách nào để tính trung bình động hàm mũ kép trong Python?Chỉ có bốn bước để tính toán này. . Chọn bất kỳ khoảng thời gian xem lại nào, chẳng hạn như năm giai đoạn, 15 giai đoạn hoặc 100 giai đoạn Tính EMA cho khoảng thời gian đó. Đây là EMA(n) Áp dụng EMA có cùng thời gian xem lại cho EMA(n). Điều này tạo ra một EMA được làm mịn Nhân hai lần EMA(n) và trừ đi EMA được làm mịn |