程式
在 Python 中計算線性加權移動平均線
通常稱為 WMA。此處定義的權重是線性的(與指數相反):移動平均,加權。我嘗試在 python 函式中實現這一點,如下所示。結果是一個值列表。我的問題是:結果對嗎?而且速度也很慢…
我從 pandas 輸入了一個數據框,其中包含一個名為“close”的列
def wma(df): n = 20 k = (n * (n + 1)) / 2.0 wmas = [] for i in range(0, len(df) - n + 1): product = [df['close'][i + n_i] * (n_i + 1) for n_i in range(0, n)] wma = sum(product) / k wmas.append(wma) return wmas
任何幫助,將不勝感激。謝謝。
儘管您的程式碼已經為您提供了正確的結果,但我幾乎為您感到難過,因為您必須等待 5 秒才能獲得如此少量的數據。您的程式碼很慢,因為您是在重新發明輪子,而不是使用一些內置的 pandas 和 numpy 功能。例如,
product
在wma
您的程式碼中,可以使用 numpy 的內積函式 ( ) 組合和完成,該函式通過連結 pandas和np.dot
匿名函式以滾動方式應用於整個列.rolling()``.apply()
方法。尋找現成的解決方案總是更好,因為這些功能在幕後進行了優化。我在我的機器上執行了你的程式碼,5200 個值的結果大約需要 2 秒。嘗試這樣的事情(我添加了一些基本功能作為範例讓您思考):import pandas as pd import numpy as np def wma(df, column='close', n=20, add_col=False): weights = np.arange(1, n + 1) wmas = df[column].rolling(n).apply(lambda x: np.dot(x, weights) / weights.sum(), raw=True).to_list() if add_col == True: df[f'{column}_WMA_{n}'] = wmas return df else: return wmas
上面的函式將採用您正在使用的相同數據幀並以與您相同的方式返回相同的列表 - 只需呼叫
wma(df)
. 此外可以更改列名、週期值,您可以選擇不返回列表,而是將值作為新列添加到您最初傳入的數據框中。它也在我的機器上執行大約 20 毫秒——幾乎比原始程式碼快 100 倍…