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

  • Đường trung bình động có trọng số [WMA]
  • Đường trung bình động hàm mũ [EMA]

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ình

Trong 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
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

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']
data.index = pd.to_datetime[data.index]
# We can drop the old index column:
data = data.drop[columns='Unnamed: 0']
data

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 10

weights = 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"]
plt.plot[wma10, label="10-Day WMA"]
plt.plot[sma10, label="10-Day SMA"]
plt.xlabel["Date"]
plt.ylabel["Price"]
plt.legend[]
plt.show[]

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']
data.index = pd.to_datetime[data.index]
# We can drop the old index column:
data = data.drop[columns='Unnamed: 0']
data
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']
data.index = pd.to_datetime[data.index]
# We can drop the old index column:
data = data.drop[columns='Unnamed: 0']
data
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']
0

Chú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']
data.index = pd.to_datetime[data.index]
# We can drop the old index column:
data = data.drop[columns='Unnamed: 0']
data
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']
data.index = pd.to_datetime[data.index]
# We can drop the old index column:
data = data.drop[columns='Unnamed: 0']
data
3

plt.style.use['fivethirtyeight']
1

EMA 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']
2

Bâ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

  1. datafile = 'cs-movavg.csv'data = pd.read_csv[datafile, index_col = 'Date']
    data.index = pd.to_datetime[data.index]
    # We can drop the old index column:
    data = data.drop[columns='Unnamed: 0']
    data
    4. Phiên bản này sử dụng phương pháp
    datafile = 'cs-movavg.csv'data = pd.read_csv[datafile, index_col = 'Date']
    data.index = pd.to_datetime[data.index]
    # We can drop the old index column:
    data = data.drop[columns='Unnamed: 0']
    data
    1 đơn giản, bắt đầu từ đầu lịch sử giá của chúng tôi nhưng không khớp với định nghĩa được sử dụng trong bảng tính
  2. datafile = 'cs-movavg.csv'data = pd.read_csv[datafile, index_col = 'Date']
    data.index = pd.to_datetime[data.index]
    # We can drop the old index column:
    data = data.drop[columns='Unnamed: 0']
    data
    6. Phiên bản này bắt đầu vào ngày thứ 10 [với giá trị ban đầu bằng SMA 10 ngày] và khớp với định nghĩa trên bảng tính của chúng tôi

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']
3

Trong 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

Chủ Đề