227 lines
8.5 KiB
Python
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()
|