Files
quantconnect--lean/Tests/TestData/generate_reference_data_from_talipp.py
T
2026-07-13 13:02:50 +08:00

227 lines
8.5 KiB
Python

import numpy as np
import pandas as pd
from pathlib import Path
import talipp
from talipp.indicators import ZLEMA, McGinleyDynamic # SISO
from talipp.ohlcv import OHLCVFactory
from talipp.indicators import VWMA, ChaikinOsc, CHOP, ForceIndex, IBS, KVO, SOBV, RogersSatchell # MISO
from talipp.indicators import StochRSI, KST # SIMO
from talipp.indicators import ChandeKrollStop, SFX, TTM, VTX, ZigZag # MIMO
def main():
fname = "spy_ppo.txt"
datetime_fmt = "%m/%d/%Y %I:%M:%S %p"
df = pd.read_csv(fname)
df["Date"] = pd.to_datetime(df["Date"], format=datetime_fmt)
df = df.set_index("Date")
def generate_reference_data_for_siso_indicator(
indicator_type, parameters, output_name, fname_stem
):
df_in = df["Close"]
indicator = indicator_type(**parameters, input_values=df["Close"].values)
output_values = {output_name: list(indicator)}
df_out = pd.concat([df_in, pd.DataFrame(output_values, index=df.index)], axis=1)
df_out.index = df_out.index.strftime(datetime_fmt)
df_out.to_csv(Path("out") / f"{fname_stem}.csv")
def generate_reference_data_for_miso_indicator(
indicator_type, parameters, output_name, fname_stem
):
df_in = df[["Open", "High", "Low", "Close", "Volume"]]
input_values = OHLCVFactory.from_dict(
{
"open": df.Open,
"high": df.High,
"low": df.Low,
"close": df.Close,
"volume": df.Volume,
}
)
indicator = indicator_type(**parameters, input_values=input_values)
output_values = {output_name: list(indicator)}
df_out = pd.concat([df_in, pd.DataFrame(output_values, index=df.index)], axis=1)
df_out.index = df_out.index.strftime(datetime_fmt)
df_out.to_csv(Path("out") / f"{fname_stem}.csv")
def generate_reference_data_for_simo_indicator(
indicator_type, parameters, output_names, fname_stem
):
df_in = df["Close"]
indicator = indicator_type(**parameters, input_values=df["Close"].values)
output_values = {output_name: [] for output_name in output_names}
raw_output_values = list(indicator)
for raw_output_value in raw_output_values:
if raw_output_value is None:
for output_name in output_names:
output_value_for_name = np.nan
output_values[output_name].append(output_value_for_name)
else:
for output_name in output_names:
output_value_for_name = getattr(raw_output_value, output_name)
output_values[output_name].append(output_value_for_name)
df_out = pd.concat([df_in, pd.DataFrame(output_values, index=df.index)], axis=1)
df_out.index = df_out.index.strftime(datetime_fmt)
df_out.to_csv(Path("out") / f"{fname_stem}.csv")
def generate_reference_data_for_mimo_indicator(
indicator_type, parameters, output_names, fname_stem
):
df_in = df[["Open", "High", "Low", "Close", "Volume"]]
input_values = OHLCVFactory.from_dict(
{
"open": df.Open,
"high": df.High,
"low": df.Low,
"close": df.Close,
"volume": df.Volume,
}
)
indicator = indicator_type(**parameters, input_values=input_values)
output_values = {output_name: [] for output_name in output_names}
raw_output_values = list(indicator)
for raw_output_value in raw_output_values:
if raw_output_value is None:
for output_name in output_names:
output_value_for_name = np.nan
output_values[output_name].append(output_value_for_name)
else:
for output_name in output_names:
output_value_for_name = getattr(raw_output_value, output_name)
output_values[output_name].append(output_value_for_name)
df_out = pd.concat([df_in, pd.DataFrame(output_values, index=df.index)], axis=1)
df_out.index = df_out.index.strftime(datetime_fmt)
df_out.to_csv(Path("out") / f"{fname_stem}.csv")
def generate_reference_data_for_zigzag_indicator(
indicator_type, parameters, fname_stem
):
input_values = OHLCVFactory.from_dict(
{
"open": df.Open,
"high": df.High,
"low": df.Low,
"close": df.Close,
"volume": df.Volume,
}
)
output_names = ["ohlcv", "type"]
indicator = indicator_type(**parameters, input_values=input_values)
output_values = {output_name: [] for output_name in output_names}
raw_output_values = list(indicator)
for raw_output_value in raw_output_values:
if raw_output_value is None:
for output_name in output_names:
output_value_for_name = np.nan
output_values[output_name].append(output_value_for_name)
else:
for output_name in output_names:
output_value_for_name = getattr(raw_output_value, output_name)
output_values[output_name].append(output_value_for_name)
df_out = pd.DataFrame(output_values)
df_out["open"] = df_out["ohlcv"].map(lambda cdl: cdl.open)
df_out["high"] = df_out["ohlcv"].map(lambda cdl: cdl.high)
df_out["low"] = df_out["ohlcv"].map(lambda cdl: cdl.low)
df_out["close"] = df_out["ohlcv"].map(lambda cdl: cdl.close)
df_out.index.name = "Id"
del df_out["ohlcv"]
df_out.to_csv(Path("out") / f"{fname_stem}.csv")
# SISO
generate_reference_data_for_siso_indicator(
ZLEMA, {"period": 5}, "ZLEMA5", "spy_with_zlema"
)
generate_reference_data_for_siso_indicator(
McGinleyDynamic, {"period": 14}, "McGinleyDynamic14", "spy_with_McGinleyDynamic"
)
# MISO
generate_reference_data_for_miso_indicator(
VWMA, {"period": 20}, "VWMA20", "spy_with_vwma"
)
generate_reference_data_for_miso_indicator(
ChaikinOsc,
{"fast_period": 5, "slow_period": 7},
"ChaikinOsc5_7",
"spy_with_ChaikinOsc",
)
generate_reference_data_for_miso_indicator(
CHOP, {"period": 14}, "CHOP14", "spy_with_chop"
)
generate_reference_data_for_miso_indicator(
ForceIndex, {"period": 20}, "ForceIndex20", "spy_with_ForceIndex"
)
generate_reference_data_for_miso_indicator(IBS, {}, "IBS", "spy_with_ibs")
generate_reference_data_for_miso_indicator(
KVO, {"fast_period": 5, "slow_period": 10}, "KVO5_10", "spy_with_kvo"
)
generate_reference_data_for_miso_indicator(
SOBV, {"period": 20}, "SOBV20", "spy_with_sobv"
)
generate_reference_data_for_miso_indicator(
RogersSatchell, {"period": 9}, "RSVolat9", "spy_with_rsvolat"
)
# SIMO
generate_reference_data_for_simo_indicator(
StochRSI,
{
"rsi_period": 14,
"stoch_period": 14,
"k_smoothing_period": 3,
"d_smoothing_period": 3,
},
["k", "d"],
"spy_with_StochRSI",
)
generate_reference_data_for_simo_indicator(
KST,
{
"roc1_period": 5,
"roc1_ma_period": 5,
"roc2_period": 10,
"roc2_ma_period": 5,
"roc3_period": 15,
"roc3_ma_period": 5,
"roc4_period": 25,
"roc4_ma_period": 10,
"signal_period": 9,
},
["kst", "signal"],
"spy_with_kst",
)
# MIMO
generate_reference_data_for_mimo_indicator(
ChandeKrollStop,
{"atr_period": 5, "atr_mult": 2.0, "period": 3},
["short_stop", "long_stop"],
"spy_with_ChandeKrollStop",
)
generate_reference_data_for_mimo_indicator(
SFX,
{"atr_period": 12, "std_dev_period": 12, "std_dev_smoothing_period": 3},
["atr", "std_dev", "ma_std_dev"],
"spy_with_sfx",
)
generate_reference_data_for_mimo_indicator(
TTM,
{"period": 20, "bb_std_dev_mult": 2.0, "kc_atr_mult": 2.0},
["squeeze", "histogram"],
"spy_with_ttm",
)
generate_reference_data_for_mimo_indicator(
VTX, {"period": 14}, ["plus_vtx", "minus_vtx"], "spy_with_vtx"
)
# Other MIMO (ZigZag)
generate_reference_data_for_zigzag_indicator(
ZigZag, {"sensitivity": 0.05, "min_trend_length": 3}, "spy_with_ZigZag"
)
if __name__ == "__main__":
main()