# 匯入所需的模組和函式
from .config import sample_data
from .context import pandas_ta
# 從 unittest 模組中匯入 TestCase 類
from unittest import TestCase
# 從 pandas 模組中匯入 Series 類
from pandas import Series
# 定義測試類 TestPerformace,繼承自 TestCase 類
class TestPerformace(TestCase):
# 在所有測試方法執行之前執行的設定方法
@classmethod
def setUpClass(cls):
# 從配置檔案中獲取示例資料
cls.data = sample_data
# 獲取示例資料中的 close 列作為測試資料
cls.close = cls.data["close"]
# 判斷 close 列是否大於其簡單移動平均值的 Series 物件,並轉換為整數型別
cls.islong = (cls.close > pandas_ta.sma(cls.close, length=8)).astype(int)
# 計算 close 列的非累積百分比收益率的 Series 物件
cls.pctret = pandas_ta.percent_return(cls.close, cumulative=False)
# 計算 close 列的非累積對數收益率的 Series 物件
cls.logret = pandas_ta.percent_return(cls.close, cumulative=False)
# 在所有測試方法執行之後執行的清理方法
@classmethod
def tearDownClass(cls):
# 清理示例資料、close 列、islong 列、pctret 列和 logret 列
del cls.data
del cls.close
del cls.islong
del cls.pctret
del cls.logret
# 設定測試方法前的準備工作,此處不需要執行任何操作,因此留空
def setUp(self): pass
# 設定測試方法後的清理工作,此處不需要執行任何操作,因此留空
def tearDown(self): pass
# 測試對數收益率計算的方法
def test_log_return(self):
# 呼叫對數收益率計算函式,獲取結果
result = pandas_ta.log_return(self.close)
# 斷言結果型別為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "LOGRET_1"
self.assertEqual(result.name, "LOGRET_1")
# 測試累積對數收益率計算的方法
def test_cum_log_return(self):
# 呼叫累積對數收益率計算函式,獲取結果
result = pandas_ta.log_return(self.close, cumulative=True)
# 斷言結果型別為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "CUMLOGRET_1"
self.assertEqual(result.name, "CUMLOGRET_1")
# 測試百分比收益率計算的方法
def test_percent_return(self):
# 呼叫百分比收益率計算函式,獲取結果
result = pandas_ta.percent_return(self.close, cumulative=False)
# 斷言結果型別為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "PCTRET_1"
self.assertEqual(result.name, "PCTRET_1")
# 測試累積百分比收益率計算的方法
def test_cum_percent_return(self):
# 呼叫累積百分比收益率計算函式,獲取結果
result = pandas_ta.percent_return(self.close, cumulative=True)
# 斷言結果的名稱為 "CUMPCTRET_1"
self.assertEqual(result.name, "CUMPCTRET_1")
.\pandas-ta\tests\test_indicator_statistics.py
# 從.config模組中匯入error_analysis,sample_data,CORRELATION,CORRELATION_THRESHOLD,VERBOSE變數
# 從.context模組中匯入pandas_ta模組
from .config import error_analysis, sample_data, CORRELATION, CORRELATION_THRESHOLD, VERBOSE
from .context import pandas_ta
# 從unittest模組中匯入skip,TestCase類
from unittest import skip, TestCase
# 匯入pandas的測試模組
import pandas.testing as pdt
# 從pandas模組中匯入DataFrame,Series類
from pandas import DataFrame, Series
# 匯入talib庫,並重新命名為tal
import talib as tal
# 定義測試Statistics類,繼承自TestCase類
class TestStatistics(TestCase):
# 類方法,用於設定測試類的初始狀態
@classmethod
def setUpClass(cls):
# 將sample_data賦值給類屬性data
cls.data = sample_data
# 將data的列名轉換為小寫
cls.data.columns = cls.data.columns.str.lower()
# 分別將open、high、low、close列賦值給對應的類屬性
cls.open = cls.data["open"]
cls.high = cls.data["high"]
cls.low = cls.data["low"]
cls.close = cls.data["close"]
# 如果data的列中包含volume列,則將volume列賦值給類屬性volume
if "volume" in cls.data.columns:
cls.volume = cls.data["volume"]
# 類方法,用於清理測試類的狀態
@classmethod
def tearDownClass(cls):
# 刪除類屬性open、high、low、close
del cls.open
del cls.high
del cls.low
del cls.close
# 如果類中有volume屬性,則刪除volume屬性
if hasattr(cls, "volume"):
del cls.volume
# 刪除類屬性data
del cls.data
# 空的setUp方法
def setUp(self): pass
# 空的tearDown方法
def tearDown(self): pass
# 測試entropy方法
def test_entropy(self):
# 呼叫pandas_ta模組中的entropy方法,計算close列的熵
result = pandas_ta.entropy(self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"ENTP_10"
self.assertEqual(result.name, "ENTP_10")
# 測試kurtosis方法
def test_kurtosis(self):
# 呼叫pandas_ta模組中的kurtosis方法,計算close列的峰度
result = pandas_ta.kurtosis(self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"KURT_30"
self.assertEqual(result.name, "KURT_30")
# 測試mad方法
def test_mad(self):
# 呼叫pandas_ta模組中的mad方法,計算close列的絕對平均偏差
result = pandas_ta.mad(self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"MAD_30"
self.assertEqual(result.name, "MAD_30")
# 測試median方法
def test_median(self):
# 呼叫pandas_ta模組中的median方法,計算close列的中位數
result = pandas_ta.median(self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"MEDIAN_30"
self.assertEqual(result.name, "MEDIAN_30")
# 測試quantile方法
def test_quantile(self):
# 呼叫pandas_ta模組中的quantile方法,計算close列的分位數
result = pandas_ta.quantile(self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"QTL_30_0.5"
self.assertEqual(result.name, "QTL_30_0.5")
# 測試skew方法
def test_skew(self):
# 呼叫pandas_ta模組中的skew方法,計算close列的偏度
result = pandas_ta.skew(self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"SKEW_30"
self.assertEqual(result.name, "SKEW_30")
# 測試stdev方法
def test_stdev(self):
# 呼叫pandas_ta模組中的stdev方法,計算close列的標準差(talib=False)
result = pandas_ta.stdev(self.close, talib=False)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"STDEV_30"
self.assertEqual(result.name, "STDEV_30")
# 嘗試使用tal.STDDEV方法計算close列的標準差
try:
# 期望的結果使用tal.STDDEV方法計算
expected = tal.STDDEV(self.close, 30)
# 斷言result與expected相等,忽略名稱檢查
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
try:
# 如果斷言失敗,計算result與expected之間的相關性
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
# 斷言相關性大於閾值CORRELATION_THRESHOLD
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,則呼叫error_analysis函式,並傳遞result,CORRELATION,異常資訊ex
error_analysis(result, CORRELATION, ex)
# 重新呼叫pandas_ta模組中的stdev方法,計算close列的標準差
result = pandas_ta.stdev(self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的名稱為"STDEV_30"
self.assertEqual(result.name, "STDEV_30")
# 測試 TOS_STDEVALL 函式
def test_tos_sdtevall(self):
# 呼叫 TOS_STDEVALL 函式,計算標準差
result = pandas_ta.tos_stdevall(self.close)
# 斷言結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言結果列名為 "TOS_STDEVALL"
self.assertEqual(result.name, "TOS_STDEVALL")
# 斷言結果列數為 7
self.assertEqual(len(result.columns), 7)
# 呼叫 TOS_STDEVALL 函式,計算長度為 30 的標準差
result = pandas_ta.tos_stdevall(self.close, length=30)
# 斷言結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言結果列名為 "TOS_STDEVALL_30"
self.assertEqual(result.name, "TOS_STDEVALL_30")
# 斷言結果列數為 7
self.assertEqual(len(result.columns), 7)
# 呼叫 TOS_STDEVALL 函式,計算長度為 30,標準差為 1 和 2 的標準差
result = pandas_ta.tos_stdevall(self.close, length=30, stds=[1, 2])
# 斷言結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言結果列名為 "TOS_STDEVALL_30"
self.assertEqual(result.name, "TOS_STDEVALL_30")
# 斷言結果列數為 5
self.assertEqual(len(result.columns), 5)
# 測試 Variance 函式
def test_variance(self):
# 呼叫 Variance 函式,計算方差
result = pandas_ta.variance(self.close, talib=False)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果列名為 "VAR_30"
self.assertEqual(result.name, "VAR_30")
try:
# 使用 Talib 計算期望結果
expected = tal.VAR(self.close, 30)
# 斷言結果與期望結果相等
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
try:
# 計算結果與期望結果的相關性
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
# 斷言相關性大於閾值
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 分析錯誤
error_analysis(result, CORRELATION, ex)
# 呼叫 Variance 函式,預設使用 Talib 計算,計算方差
result = pandas_ta.variance(self.close)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果列名為 "VAR_30"
self.assertEqual(result.name, "VAR_30")
# 測試 Z-Score 函式
def test_zscore(self):
# 呼叫 Z-Score 函式,計算 Z 分數
result = pandas_ta.zscore(self.close)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果列名為 "ZS_30"
self.assertEqual(result.name, "ZS_30")
.\pandas-ta\tests\test_indicator_trend.py
# 從相對路徑的config模組中匯入error_analysis、sample_data、CORRELATION、CORRELATION_THRESHOLD和VERBOSE變數
from .config import error_analysis, sample_data, CORRELATION, CORRELATION_THRESHOLD, VERBOSE
# 從context模組中匯入pandas_ta物件
from .context import pandas_ta
# 匯入TestCase類和skip函式從unittest模組中
from unittest import TestCase, skip
# 匯入pandas測試模組,並用pdt別名引用
import pandas.testing as pdt
# 從pandas模組中匯入DataFrame和Series類
from pandas import DataFrame, Series
# 匯入talib模組,並用tal別名引用
import talib as tal
# 定義TestTrend類,繼承自TestCase類
class TestTrend(TestCase):
# 在類方法setUpClass中設定測試所需的資料
@classmethod
def setUpClass(cls):
# 將sample_data賦值給cls.data,然後將列名轉換為小寫
cls.data = sample_data
cls.data.columns = cls.data.columns.str.lower()
# 將open列、high列、low列、close列分別賦值給cls.open、cls.high、cls.low、cls.close
cls.open = cls.data["open"]
cls.high = cls.data["high"]
cls.low = cls.data["low"]
cls.close = cls.data["close"]
# 如果資料中存在volume列,則將其賦值給cls.volume
if "volume" in cls.data.columns:
cls.volume = cls.data["volume"]
# 在類方法tearDownClass中清理測試所需的資料
@classmethod
def tearDownClass(cls):
# 刪除cls.open、cls.high、cls.low、cls.close四個變數的引用
del cls.open
del cls.high
del cls.low
del cls.close
# 如果cls中存在volume屬性,則刪除該屬性
if hasattr(cls, "volume"):
del cls.volume
# 刪除cls.data變數的引用
del cls.data
# 在setUp方法中初始化測試環境
def setUp(self): pass
# 在tearDown方法中清理測試環境
def tearDown(self): pass
# 定義測試ADX指標的方法
def test_adx(self):
# 呼叫pandas_ta.adx函式計算ADX指標,指定talib引數為False
result = pandas_ta.adx(self.high, self.low, self.close, talib=False)
# 斷言result物件為DataFrame型別
self.assertIsInstance(result, DataFrame)
# 斷言result物件的name屬性為"ADX_14"
self.assertEqual(result.name, "ADX_14")
# 嘗試使用tal.ADX函式計算預期結果,並斷言result的第一列與預期結果相等
try:
expected = tal.ADX(self.high, self.low, self.close)
pdt.assert_series_equal(result.iloc[:, 0], expected)
# 如果斷言失敗,則進行異常處理
except AssertionError:
# 嘗試計算result與預期結果的相關性,並與CORRELATION_THRESHOLD進行比較
try:
corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expected, col=CORRELATION)
self.assertGreater(corr, CORRELATION_THRESHOLD)
# 如果相關性計算出現異常,則呼叫error_analysis函式記錄異常資訊
except Exception as ex:
error_analysis(result, CORRELATION, ex)
# 再次呼叫pandas_ta.adx函式計算ADX指標
result = pandas_ta.adx(self.high, self.low, self.close)
# 斷言result物件為DataFrame型別
self.assertIsInstance(result, DataFrame)
# 斷言result物件的name屬性為"ADX_14"
self.assertEqual(result.name, "ADX_14")
# 定義測試AMAT指標的方法
def test_amat(self):
# 呼叫pandas_ta.amat函式計算AMAT指標
result = pandas_ta.amat(self.close)
# 斷言result物件為DataFrame型別
self.assertIsInstance(result, DataFrame)
# 斷言result物件的name屬性為"AMATe_8_21_2"
self.assertEqual(result.name, "AMATe_8_21_2")
# 測試 Aroon 指標計算函式
def test_aroon(self):
# 呼叫 pandas_ta 庫中的 aroon 函式計算 Aroon 指標
result = pandas_ta.aroon(self.high, self.low, talib=False)
# 斷言返回結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言返回結果的名稱為 "AROON_14"
# 嘗試使用 talib 庫計算 Aroon 指標
try:
expected = tal.AROON(self.high, self.low)
expecteddf = DataFrame({"AROOND_14": expected[0], "AROONU_14": expected[1]})
# 比較計算結果與預期結果是否一致
pdt.assert_frame_equal(result, expecteddf)
except AssertionError:
# 如果計算結果與預期結果不一致,進行錯誤分析
try:
aroond_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expecteddf.iloc[:, 0], col=CORRELATION)
self.assertGreater(aroond_corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,進行錯誤分析
error_analysis(result.iloc[:, 0], CORRELATION, ex)
try:
aroonu_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 1], expecteddf.iloc[:, 1], col=CORRELATION)
self.assertGreater(aroonu_corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,進行錯誤分析
error_analysis(result.iloc[:, 1], CORRELATION, ex, newline=False)
# 重新計算 Aroon 指標
result = pandas_ta.aroon(self.high, self.low)
# 斷言返回結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言返回結果的名稱為 "AROON_14"
# 測試 Aroon Oscillator 指標計算函式
def test_aroon_osc(self):
# 計算 Aroon Oscillator 指標
result = pandas_ta.aroon(self.high, self.low)
# 斷言返回結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言返回結果的名稱為 "AROON_14"
try:
expected = tal.AROONOSC(self.high, self.low)
# 比較計算結果與預期結果是否一致
pdt.assert_series_equal(result.iloc[:, 2], expected)
except AssertionError:
try:
aroond_corr = pandas_ta.utils.df_error_analysis(result.iloc[:,2], expected,col=CORRELATION)
self.assertGreater(aroond_corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,進行錯誤分析
error_analysis(result.iloc[:, 0], CORRELATION, ex)
# 測試 Chande Kroll Stop 指標計算函式
def test_chop(self):
# 計算 Chande Kroll Stop 指標
result = pandas_ta.chop(self.high, self.low, self.close, ln=False)
# 斷言返回結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言返回結果的名稱為 "CHOP_14_1_100"
result = pandas_ta.chop(self.high, self.low, self.close, ln=True)
# 斷言返回結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言返回結果的名稱為 "CHOPln_14_1_100"
# 測試 Chande Kroll Stop Points 指標計算函式
def test_cksp(self):
# 計算 Chande Kroll Stop Points 指標
result = pandas_ta.cksp(self.high, self.low, self.close, tvmode=False)
# 斷言返回結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言返回結果的名稱為 "CKSP_10_3_20"
# 測試 Chande Kroll Stop Points 指標計算函式(帶 True Volume 模式)
def test_cksp_tv(self):
# 計算 Chande Kroll Stop Points 指標(帶 True Volume 模式)
result = pandas_ta.cksp(self.high, self.low, self.close, tvmode=True)
# 斷言返回結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言返回結果的名稱為 "CKSP_10_1_9"
# 測試指數加權衰減移動平均函式
def test_decay(self):
# 使用預設引數計算指數加權衰減移動平均
result = pandas_ta.decay(self.close)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "LDECAY_5"
self.assertEqual(result.name, "LDECAY_5")
# 使用指數加權衰減移動平均模式引數計算指數加權衰減移動平均
result = pandas_ta.decay(self.close, mode="exp")
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "EXPDECAY_5"
self.assertEqual(result.name, "EXPDECAY_5")
# 測試判斷價格是否遞減函式
def test_decreasing(self):
# 使用預設引數判斷價格是否遞減
result = pandas_ta.decreasing(self.close)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "DEC_1"
self.assertEqual(result.name, "DEC_1")
# 使用指定長度和嚴格模式引數判斷價格是否遞減
result = pandas_ta.decreasing(self.close, length=3, strict=True)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "SDEC_3"
self.assertEqual(result.name, "SDEC_3")
# 測試雙重指數移動平均離差指標(DPO)函式
def test_dpo(self):
# 計算雙重指數移動平均離差指標(DPO)
result = pandas_ta.dpo(self.close)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "DPO_20"
self.assertEqual(result.name, "DPO_20")
# 測試判斷價格是否遞增函式
def test_increasing(self):
# 使用預設引數判斷價格是否遞增
result = pandas_ta.increasing(self.close)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "INC_1"
self.assertEqual(result.name, "INC_1")
# 使用指定長度和嚴格模式引數判斷價格是否遞增
result = pandas_ta.increasing(self.close, length=3, strict=True)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "SINC_3"
self.assertEqual(result.name, "SINC_3")
# 測試長期趨勢函式
def test_long_run(self):
# 計算長期趨勢
result = pandas_ta.long_run(self.close, self.open)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "LR_2"
self.assertEqual(result.name, "LR_2")
# 測試拋物線 SAR 函式
def test_psar(self):
# 計算拋物線 SAR
result = pandas_ta.psar(self.high, self.low)
# 斷言返回結果是一個 DataFrame 物件
self.assertIsInstance(result, DataFrame)
# 斷言結果 DataFrame 的名稱為 "PSAR_0.02_0.2"
self.assertEqual(result.name, "PSAR_0.02_0.2")
# 合併長期和短期 SAR 值為一個 SAR 值
psar = result[result.columns[:2]].fillna(0)
psar = psar[psar.columns[0]] + psar[psar.columns[1]]
psar.name = result.name
try:
# 嘗試與 talib 提供的 SAR 值進行比較
expected = tal.SAR(self.high, self.low)
# 斷言兩個 Series 物件相等
pdt.assert_series_equal(psar, expected)
except AssertionError:
try:
# 嘗試進行相關性分析
psar_corr = pandas_ta.utils.df_error_analysis(psar, expected, col=CORRELATION)
# 斷言相關性大於閾值
self.assertGreater(psar_corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 發生異常時輸出錯誤分析
error_analysis(psar, CORRELATION, ex)
# 測試 QStick 函式
def test_qstick(self):
# 計算 QStick 值
result = pandas_ta.qstick(self.open, self.close)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "QS_10"
self.assertEqual(result.name, "QS_10")
# 測試短期趨勢函式
def test_short_run(self):
# 計算短期趨勢
result = pandas_ta.short_run(self.close, self.open)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "SR_2"
self.assertEqual(result.name, "SR_2")
# 測試 TTM 趨勢函式
def test_ttm_trend(self):
# 計算 TTM 趨勢
result = pandas_ta.ttm_trend(self.high, self.low, self.close)
# 斷言返回結果是一個 DataFrame 物件
self.assertIsInstance(result, DataFrame)
# 斷言結果 DataFrame 的名稱為 "TTMTREND_6"
self.assertEqual(result.name, "TTMTREND_6")
# 測試垂直水平通道函式
def test_vhf(self):
# 計算垂直水平通道值
result = pandas_ta.vhf(self.close)
# 斷言返回結果是一個 Series 物件
self.assertIsInstance(result, Series)
# 斷言結果 Series 的名稱為 "VHF_28"
self.assertEqual(result.name, "VHF_28")
# 測試 Vortex 指標函式
def test_vortex(self):
# 呼叫 Vortex 指標函式,傳入高、低、收盤價資料,獲得結果
result = pandas_ta.vortex(self.high, self.low, self.close)
# 斷言結果是 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言結果的名稱為 "VTX_14"
self.assertEqual(result.name, "VTX_14")
.\pandas-ta\tests\test_indicator_volatility.py
# 從.config模組中匯入error_analysis,sample_data,CORRELATION,CORRELATION_THRESHOLD和VERBOSE變數
# 從.context模組中匯入pandas_ta
from .config import error_analysis, sample_data, CORRELATION, CORRELATION_THRESHOLD, VERBOSE
from .context import pandas_ta
# 從unittest模組中匯入TestCase和skip類
from unittest import TestCase, skip
# 匯入pandas測試工具模組,重新命名為pdt
import pandas.testing as pdt
# 從pandas模組中匯入DataFrame和Series類
from pandas import DataFrame, Series
# 匯入talib庫,重新命名為tal
import talib as tal
# 定義TestVolatility類,繼承自TestCase類
class TestVolatility(TestCase):
# 類方法,設定測試類的初始狀態
@classmethod
def setUpClass(cls):
# 將sample_data賦值給類屬性data
cls.data = sample_data
# 將data的列名轉換為小寫
cls.data.columns = cls.data.columns.str.lower()
# 將data的"open"列賦值給類屬性open
cls.open = cls.data["open"]
# 將data的"high"列賦值給類屬性high
cls.high = cls.data["high"]
# 將data的"low"列賦值給類屬性low
cls.low = cls.data["low"]
# 將data的"close"列賦值給類屬性close
cls.close = cls.data["close"]
# 如果data的列中包含"volume"列
if "volume" in cls.data.columns:
# 將data的"volume"列賦值給類屬性volume
cls.volume = cls.data["volume"]
# 類方法,清理測試類的狀態
@classmethod
def tearDownClass(cls):
# 刪除類屬性open
del cls.open
# 刪除類屬性high
del cls.high
# 刪除類屬性low
del cls.low
# 刪除類屬性close
del cls.close
# 如果類中存在volume屬性
if hasattr(cls, "volume"):
# 刪除類屬性volume
del cls.volume
# 刪除類屬性data
del cls.data
# 例項方法,設定每個測試用例的初始狀態
def setUp(self): pass
# 例項方法,清理每個測試用例的狀態
def tearDown(self): pass
# 測試aberration函式
def test_aberration(self):
# 呼叫pandas_ta.aberration函式,傳入self.high、self.low和self.close作為引數,返回結果賦值給result
result = pandas_ta.aberration(self.high, self.low, self.close)
# 斷言result的型別為DataFrame
self.assertIsInstance(result, DataFrame)
# 斷言result的name屬性等於"ABER_5_15"
self.assertEqual(result.name, "ABER_5_15")
# 測試accbands函式
def test_accbands(self):
# 呼叫pandas_ta.accbands函式,傳入self.high、self.low和self.close作為引數,返回結果賦值給result
result = pandas_ta.accbands(self.high, self.low, self.close)
# 斷言result的型別為DataFrame
self.assertIsInstance(result, DataFrame)
# 斷言result的name屬性等於"ACCBANDS_20"
self.assertEqual(result.name, "ACCBANDS_20")
# 測試atr函式
def test_atr(self):
# 呼叫pandas_ta.atr函式,傳入self.high、self.low、self.close和talib=False作為引數,返回結果賦值給result
result = pandas_ta.atr(self.high, self.low, self.close, talib=False)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的name屬性等於"ATRr_14"
self.assertEqual(result.name, "ATRr_14")
try:
# 使用talib庫計算ATR,期望結果賦值給expected
expected = tal.ATR(self.high, self.low, self.close)
# 斷言result與expected相等,不檢查名稱
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
try:
# 計算result與expected之間的相關性
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
# 斷言相關性大於CORRELATION_THRESHOLD
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 呼叫error_analysis函式,傳入result、CORRELATION和異常物件ex作為引數
error_analysis(result, CORRELATION, ex)
# 呼叫pandas_ta.atr函式,傳入self.high、self.low和self.close作為引數,返回結果賦值給result
result = pandas_ta.atr(self.high, self.low, self.close)
# 斷言result的型別為Series
self.assertIsInstance(result, Series)
# 斷言result的name屬性等於"ATRr_14"
self.assertEqual(result.name, "ATRr_14")
# 測試布林帶指標函式
def test_bbands(self):
# 呼叫布林帶指標函式,計算布林帶指標
result = pandas_ta.bbands(self.close, talib=False)
# 斷言結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言結果的名稱為 "BBANDS_5_2.0"
self.assertEqual(result.name, "BBANDS_5_2.0")
try:
# 使用 TA-Lib 計算布林帶指標的期望值
expected = tal.BBANDS(self.close)
# 將期望值轉換為 DataFrame
expecteddf = DataFrame({"BBU_5_2.0": expected[0], "BBM_5_2.0": expected[1], "BBL_5_2.0": expected[2]})
# 使用 Pandas 的 assert_frame_equal 函式比較結果和期望值
pdt.assert_frame_equal(result, expecteddf)
except AssertionError:
try:
# 計算結果與期望值的相關性
bbl_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 0], expecteddf.iloc[:,0], col=CORRELATION)
# 斷言相關性大於閾值
self.assertGreater(bbl_corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 執行錯誤分析函式
error_analysis(result.iloc[:, 0], CORRELATION, ex)
try:
bbm_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 1], expecteddf.iloc[:,1], col=CORRELATION)
self.assertGreater(bbm_corr, CORRELATION_THRESHOLD)
except Exception as ex:
error_analysis(result.iloc[:, 1], CORRELATION, ex, newline=False)
try:
bbu_corr = pandas_ta.utils.df_error_analysis(result.iloc[:, 2], expecteddf.iloc[:,2], col=CORRELATION)
self.assertGreater(bbu_corr, CORRELATION_THRESHOLD)
except Exception as ex:
error_analysis(result.iloc[:, 2], CORRELATION, ex, newline=False)
# 呼叫布林帶指標函式,設定自由度調整引數為 0
result = pandas_ta.bbands(self.close, ddof=0)
self.assertIsInstance(result, DataFrame)
self.assertEqual(result.name, "BBANDS_5_2.0")
# 呼叫布林帶指標函式,設定自由度調整引數為 1
result = pandas_ta.bbands(self.close, ddof=1)
self.assertIsInstance(result, DataFrame)
self.assertEqual(result.name, "BBANDS_5_2.0")
# 測試唐奇安通道函式
def test_donchian(self):
# 呼叫唐奇安通道函式,計算唐奇安通道
result = pandas_ta.donchian(self.high, self.low)
self.assertIsInstance(result, DataFrame)
self.assertEqual(result.name, "DC_20_20")
# 呼叫唐奇安通道函式,設定下界長度為 20,上界長度為 5,計算唐奇安通道
result = pandas_ta.donchian(self.high, self.low, lower_length=20, upper_length=5)
self.assertIsInstance(result, DataFrame)
self.assertEqual(result.name, "DC_20_5")
# 測試 Keltner 通道函式
def test_kc(self):
# 呼叫 Keltner 通道函式,計算 Keltner 通道
result = pandas_ta.kc(self.high, self.low, self.close)
self.assertIsInstance(result, DataFrame)
self.assertEqual(result.name, "KCe_20_2")
# 呼叫 Keltner 通道函式,設定移動平均模式為 "sma",計算 Keltner 通道
result = pandas_ta.kc(self.high, self.low, self.close, mamode="sma")
self.assertIsInstance(result, DataFrame)
self.assertEqual(result.name, "KCs_20_2")
# 測試梅斯線指標函式
def test_massi(self):
# 呼叫梅斯線指標函式,計算梅斯線指標
result = pandas_ta.massi(self.high, self.low)
self.assertIsInstance(result, Series)
self.assertEqual(result.name, "MASSI_9_25")
# 測試 NATR 指標函式
def test_natr(self):
# 呼叫 pandas_ta 庫中的 natr 函式計算 NATR 指標
result = pandas_ta.natr(self.high, self.low, self.close, talib=False)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "NATR_14"
self.assertEqual(result.name, "NATR_14")
try:
# 使用 TA-Lib 計算 NATR 指標的預期結果
expected = tal.NATR(self.high, self.low, self.close)
# 斷言結果與預期結果一致,不檢查名稱
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
try:
# 計算結果與預期結果之間的相關性
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
# 斷言相關性大於閾值
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 執行錯誤分析
error_analysis(result, CORRELATION, ex)
# 重新呼叫 pandas_ta 庫中的 natr 函式,不指定 TA-Lib
result = pandas_ta.natr(self.high, self.low, self.close)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "NATR_14"
self.assertEqual(result.name, "NATR_14")
# 測試 PDIST 指標函式
def test_pdist(self):
# 呼叫 pandas_ta 庫中的 pdist 函式計算 PDIST 指標
result = pandas_ta.pdist(self.open, self.high, self.low, self.close)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "PDIST"
self.assertEqual(result.name, "PDIST")
# 測試 RVI 指標函式
def test_rvi(self):
# 呼叫 pandas_ta 庫中的 rvi 函式計算 RVI 指標
result = pandas_ta.rvi(self.close)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "RVI_14"
# 呼叫 pandas_ta 庫中的 rvi 函式計算 RVI 指標,使用高低價
result = pandas_ta.rvi(self.close, self.high, self.low, refined=True)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "RVIr_14"
# 呼叫 pandas_ta 庫中的 rvi 函式計算 RVI 指標,使用三分法
result = pandas_ta.rvi(self.close, self.high, self.low, thirds=True)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "RVIt_14"
# 測試 THERMO 指標函式
def test_thermo(self):
# 呼叫 pandas_ta 庫中的 thermo 函式計算 THERMO 指標
result = pandas_ta.thermo(self.high, self.low)
# 斷言結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 斷言結果的名稱為 "THERMO_20_2_0.5"
# 測試 TRUE_RANGE 指標函式
def test_true_range(self):
# 呼叫 pandas_ta 庫中的 true_range 函式計算 TRUE_RANGE 指標
result = pandas_ta.true_range(self.high, self.low, self.close, talib=False)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "TRUERANGE_1"
try:
# 使用 TA-Lib 計算 TRUE_RANGE 指標的預期結果
expected = tal.TRANGE(self.high, self.low, self.close)
# 斷言結果與預期結果一致,不檢查名稱
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
try:
# 計算結果與預期結果之間的相關性
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
# 斷言相關性大於閾值
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 執行錯誤分析
error_analysis(result, CORRELATION, ex)
# 重新呼叫 pandas_ta 庫中的 true_range 函式,不指定 TA-Lib
result = pandas_ta.true_range(self.high, self.low, self.close)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "TRUERANGE_1"
# 測試 UI 指標函式
def test_ui(self):
# 呼叫 pandas_ta 庫中的 ui 函式計算 UI 指標
result = pandas_ta.ui(self.close)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "UI_14"
# 呼叫 pandas_ta 庫中的 ui 函式計算 UI 指標,包含 everget 引數
result = pandas_ta.ui(self.close, everget=True)
# 斷言結果為 Series 型別
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "UIe_14"
.\pandas-ta\tests\test_indicator_volume.py
# 從.config中匯入錯誤分析、示例資料、相關性、相關性閾值、詳細模式
from .config import error_analysis, sample_data, CORRELATION, CORRELATION_THRESHOLD, VERBOSE
# 從.context中匯入pandas_ta
from .context import pandas_ta
# 匯入TestCase和skip
from unittest import TestCase, skip
# 匯入pandas測試工具
import pandas.testing as pdt
# 匯入DataFrame和Series
from pandas import DataFrame, Series
# 匯入talib庫,並重新命名為tal
import talib as tal
# 定義測試Volume的測試類
class TestVolume(TestCase):
# 設定測試類的一些初始屬性
@classmethod
def setUpClass(cls):
cls.data = sample_data
# 將列名轉換為小寫
cls.data.columns = cls.data.columns.str.lower()
# 設定測試資料的open、high、low、close列
cls.open = cls.data["open"]
cls.high = cls.data["high"]
cls.low = cls.data["low"]
cls.close = cls.data["close"]
# 如果資料中包含volume列,則設定volume_
if "volume" in cls.data.columns:
cls.volume_ = cls.data["volume"]
# 清理測試類的一些屬性
@classmethod
def tearDownClass(cls):
del cls.open
del cls.high
del cls.low
del cls.close
# 如果存在volume屬性,則刪除
if hasattr(cls, "volume"):
del cls.volume_
del cls.data
# 設定測試方法的setUp方法
def setUp(self): pass
# 設定測試方法的tearDown方法
def tearDown(self): pass
# 測試ad方法
def test_ad(self):
# 呼叫pandas_ta中的ad方法,不使用talib
result = pandas_ta.ad(self.high, self.low, self.close, self.volume_, talib=False)
# 檢查返回結果是否為Series型別
self.assertIsInstance(result, Series)
# 檢查返回結果的名稱是否為"AD"
self.assertEqual(result.name, "AD")
# 嘗試使用talib計算AD指標並檢查結果是否一致,不檢查名稱
try:
expected = tal.AD(self.high, self.low, self.close, self.volume_)
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
# 如果結果不一致,則進行錯誤分析
try:
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
# 檢查相關性是否大於相關性閾值
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,則進行錯誤分析
error_analysis(result, CORRELATION, ex)
# 再次呼叫pandas_ta中的ad方法,不使用talib
result = pandas_ta.ad(self.high, self.low, self.close, self.volume_)
# 檢查返回結果是否為Series型別
self.assertIsInstance(result, Series)
# 檢查返回結果的名稱是否為"AD"
# 測試ad_open方法
def test_ad_open(self):
# 呼叫pandas_ta中的ad方法,不使用talib
result = pandas_ta.ad(self.high, self.low, self.close, self.volume_, self.open)
# 檢查返回結果是否為Series型別
self.assertIsInstance(result, Series)
# 檢查返回結果的名稱是否為"ADo"
# 測試adosc方法
def test_adosc(self):
# 呼叫pandas_ta中的adosc方法,不使用talib
result = pandas_ta.adosc(self.high, self.low, self.close, self.volume_, talib=False)
# 檢查返回結果是否為Series型別
self.assertIsInstance(result, Series)
# 檢查返回結果的名稱是否為"ADOSC_3_10"
# 嘗試使用talib計算ADOSC指標並檢查結果是否一致,不檢查名稱
try:
expected = tal.ADOSC(self.high, self.low, self.close, self.volume_)
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
# 如果結果不一致,則進行錯誤分析
try:
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
# 檢查相關性是否大於相關性閾值
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,則進行錯誤分析
error_analysis(result, CORRELATION, ex)
# 再次呼叫pandas_ta中的adosc方法,不使用talib
result = pandas_ta.adosc(self.high, self.low, self.close, self.volume_)
# 檢查返回結果是否為Series型別
self.assertIsInstance(result, Series)
# 檢查返回結果的名稱是否為"ADOSC_3_10"
# 測試aobv方法
def test_aobv(self):
# 呼叫pandas_ta中的aobv方法
result = pandas_ta.aobv(self.close, self.volume_)
# 檢查返回結果是否為DataFrame型別
self.assertIsInstance(result, DataFrame)
# 檢查返回結果的名稱是否為"AOBVe_4_12_2_2_2"
# 測試 CMF 指標計算函式
def test_cmf(self):
# 呼叫 pandas_ta 庫的 CMF 函式計算結果
result = pandas_ta.cmf(self.high, self.low, self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "CMF_20"
self.assertEqual(result.name, "CMF_20")
# 測試 EFI 指標計算函式
def test_efi(self):
# 呼叫 pandas_ta 庫的 EFI 函式計算結果
result = pandas_ta.efi(self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "EFI_13"
self.assertEqual(result.name, "EFI_13")
# 測試 EOM 指標計算函式
def test_eom(self):
# 呼叫 pandas_ta 庫的 EOM 函式計算結果
result = pandas_ta.eom(self.high, self.low, self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "EOM_14_100000000"
self.assertEqual(result.name, "EOM_14_100000000")
# 測試 KVO 指標計算函式
def test_kvo(self):
# 呼叫 pandas_ta 庫的 KVO 函式計算結果
result = pandas_ta.kvo(self.high, self.low, self.close, self.volume_)
# 斷言結果型別為 DataFrame
self.assertIsInstance(result, DataFrame)
# 斷言結果的名稱為 "KVO_34_55_13"
self.assertEqual(result.name, "KVO_34_55_13")
# 測試 MFI 指標計算函式
def test_mfi(self):
# 呼叫 pandas_ta 庫的 MFI 函式計算結果,指定不使用 talib
result = pandas_ta.mfi(self.high, self.low, self.close, self.volume_, talib=False)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "MFI_14"
self.assertEqual(result.name, "MFI_14")
try:
# 嘗試使用 talib 計算 MFI,並與 pandas_ta 計算結果進行比較
expected = tal.MFI(self.high, self.low, self.close, self.volume_)
# 檢查兩個 Series 是否相等
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
try:
# 如果計算結果不相等,則進行錯誤分析並檢查相關性
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,則進行錯誤分析
error_analysis(result, CORRELATION, ex)
# 重新使用 pandas_ta 計算 MFI 指標
result = pandas_ta.mfi(self.high, self.low, self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "MFI_14"
self.assertEqual(result.name, "MFI_14")
# 測試 NVI 指標計算函式
def test_nvi(self):
# 呼叫 pandas_ta 庫的 NVI 函式計算結果
result = pandas_ta.nvi(self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "NVI_1"
self.assertEqual(result.name, "NVI_1")
# 測試 OBV 指標計算函式
def test_obv(self):
# 呼叫 pandas_ta 庫的 OBV 函式計算結果,指定不使用 talib
result = pandas_ta.obv(self.close, self.volume_, talib=False)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "OBV"
self.assertEqual(result.name, "OBV")
try:
# 嘗試使用 talib 計算 OBV,並與 pandas_ta 計算結果進行比較
expected = tal.OBV(self.close, self.volume_)
# 檢查兩個 Series 是否相等
pdt.assert_series_equal(result, expected, check_names=False)
except AssertionError:
try:
# 如果計算結果不相等,則進行錯誤分析並檢查相關性
corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
self.assertGreater(corr, CORRELATION_THRESHOLD)
except Exception as ex:
# 如果出現異常,則進行錯誤分析
error_analysis(result, CORRELATION, ex)
# 重新使用 pandas_ta 計算 OBV 指標
result = pandas_ta.obv(self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "OBV"
self.assertEqual(result.name, "OBV")
# 測試 PVI 指標計算函式
def test_pvi(self):
# 呼叫 pandas_ta 庫的 PVI 函式計算結果
result = pandas_ta.pvi(self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "PVI_1"
self.assertEqual(result.name, "PVI_1")
# 測試 PVOL 指標計算函式
def test_pvol(self):
# 呼叫 pandas_ta 庫的 PVOL 函式計算結果
result = pandas_ta.pvol(self.close, self.volume_)
# 斷言結果型別為 Series
self.assertIsInstance(result, Series)
# 斷言結果的名稱為 "PVOL"
self.assertEqual(result.name, "PVOL")
# 測試 Price Volume Ratio (PVR) 指標函式
def test_pvr(self):
# 計算 PVR 指標
result = pandas_ta.pvr(self.close, self.volume_)
# 確保返回結果為 Series 型別
self.assertIsInstance(result, Series)
# 確保返回結果的名稱為 "PVR"
self.assertEqual(result.name, "PVR")
# 樣本指標值來自於 SPY
self.assertEqual(result[0], 1)
self.assertEqual(result[1], 3)
self.assertEqual(result[4], 2)
self.assertEqual(result[6], 4)
# 測試 Price Volume Trend (PVT) 指標函式
def test_pvt(self):
# 計算 PVT 指標
result = pandas_ta.pvt(self.close, self.volume_)
# 確保返回結果為 Series 型別
self.assertIsInstance(result, Series)
# 確保返回結果的名稱為 "PVT"
self.assertEqual(result.name, "PVT")
# 測試 Volume Price (VP) 指標函式
def test_vp(self):
# 計算 VP 指標
result = pandas_ta.vp(self.close, self.volume_)
# 確保返回結果為 DataFrame 型別
self.assertIsInstance(result, DataFrame)
# 確保返回結果的名稱為 "VP_10"
self.assertEqual(result.name, "VP_10")