PandasTA 原始碼解析(二十一)

绝不原创的飞龙發表於2024-04-15

.\pandas-ta\tests\test_indicator_performance.py

# 匯入所需的模組和函式
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")

相關文章