Spaces:
Runtime error
Runtime error
import os | |
import sys | |
import pandas as pd | |
from finta import TA | |
def add_time_feature(df, symbol, dt_col_name="time"): | |
"""read csv into df and index on time | |
dt_col_name can be any unit from minutes to day. time is the index of pd | |
must have pd columns [(time_col),(asset_col), Open,close,High,Low,day] | |
data_process will add additional time information: time(index), minute, hour, weekday, week, month,year, day(since 1970) | |
use StopLoss and ProfitTaken to simplify the action, | |
feed a fixed StopLoss (SL = 200) and PT = SL * ratio | |
action space: [action[0,2],ratio[0,10]] | |
rewards is point | |
add hourly, dayofweek(0-6, Sun-Sat) | |
Args: | |
file (str): file path/name.csv | |
""" | |
df["symbol"] = symbol | |
df["dt"] = pd.to_datetime(df[dt_col_name]) | |
df.index = df["dt"] | |
df["minute"] = df["dt"].dt.minute | |
df["hour"] = df["dt"].dt.hour | |
df["weekday"] = df["dt"].dt.dayofweek | |
df["week"] = df["dt"].dt.isocalendar().week | |
df["month"] = df["dt"].dt.month | |
df["year"] = df["dt"].dt.year | |
df["day"] = df["dt"].dt.day | |
# df = df.set_index('dt') | |
return df | |
# 'macd', 'boll_ub', 'boll_lb', 'rsi_30', 'dx_30','close_30_sma', 'close_60_sma' | |
def tech_indictors(df): | |
df["macd"] = TA.MACD(df).SIGNAL | |
df["boll_ub"] = TA.BBANDS(df).BB_UPPER | |
df["boll_lb"] = TA.BBANDS(df).BB_LOWER | |
df["rsi_30"] = TA.RSI(df, period=30) | |
df["dx_30"] = TA.ADX(df, period=30) | |
df["close_30_sma"] = TA.SMA(df, period=30) | |
df["close_60_sma"] = TA.SMA(df, period=60) | |
# fill NaN to 0 | |
df = df.fillna(0) | |
print( | |
f"--------df head - tail ----------------\n{df.head(3)}\n{df.tail(3)}\n---------------------------------" | |
) | |
return df | |
def split_timeserious(df, key_ts="dt", freq="W", symbol=""): | |
"""import df and split into hour, daily, weekly, monthly based and | |
save into subfolder | |
Args: | |
df (pandas df with timestamp is part of multi index): | |
spliter (str): H, D, W, M, Y | |
""" | |
freq_name = { | |
"H": "hourly", | |
"D": "daily", | |
"W": "weekly", | |
"M": "monthly", | |
"Y": "Yearly", | |
} | |
for count, (n, g) in enumerate(df.groupby(pd.Grouper(level=key_ts, freq=freq))): | |
p = f"./data/split/{symbol}/{freq_name[freq]}" | |
os.makedirs(p, exist_ok=True) | |
# fname = f'{symbol}_{n:%Y%m%d}_{freq}_{count}.csv' | |
fname = f"{symbol}_{n:%Y}_{count}.csv" | |
fn = f"{p}/{fname}" | |
print(f"save to:{fn}") | |
g.reset_index(drop=True, inplace=True) | |
g.drop(columns=["dt"], inplace=True) | |
g.to_csv(fn) | |
return | |
""" | |
python ./neo_finrl/data_processors/fx.py GBPUSD W ./data/raw/GBPUSD_raw.csv | |
symbol="GBPUSD" | |
freq = [H, D, W, M] | |
file .csv, column names [time, Open, High, Low, Close, Vol] | |
""" | |
if __name__ == "__main__": | |
symbol, freq, file = sys.argv[1], sys.argv[2], sys.argv[3] | |
print(f"processing... symbol:{symbol} freq:{freq} file:{file}") | |
try: | |
df = pd.read_csv(file) | |
except Exception: | |
print(f"No such file or directory: {file}") | |
exit(0) | |
df = add_time_feature(df, symbol=symbol, dt_col_name="time") | |
df = tech_indictors(df) | |
split_timeserious(df, freq=freq, symbol=symbol) | |
print(f"Done!") | |