MCPcopy Create free account
hub / github.com/DVampire/FinAgent / cal_factor

Function cal_factor

finagent/processor/processor.py:61–195  ·  view source on GitHub ↗
(df, level="day")

Source from the content-addressed store, hash-verified

59
60
61def cal_factor(df, level="day"):
62 # intermediate values
63 df['max_oc'] = df[["open", "close"]].max(axis=1)
64 df['min_oc'] = df[["open", "close"]].min(axis=1)
65 df["kmid"] = (df["close"] - df["open"]) / df["close"]
66 df['kmid2'] = (df['close'] - df['open']) / (df['high'] - df['low'] + 1e-12)
67 df["klen"] = (df["high"] - df["low"]) / df["open"]
68 df['kup'] = (df['high'] - df['max_oc']) / df['open']
69 df['kup2'] = (df['high'] - df['max_oc']) / (df['high'] - df['low'] + 1e-12)
70 df['klow'] = (df['min_oc'] - df['low']) / df['open']
71 df['klow2'] = (df['min_oc'] - df['low']) / (df['high'] - df['low'] + 1e-12)
72 df["ksft"] = (2 * df["close"] - df["high"] - df["low"]) / df["open"]
73 df['ksft2'] = (2 * df['close'] - df['high'] - df['low']) / (df['high'] - df['low'] + 1e-12)
74 df.drop(columns=['max_oc', 'min_oc'], inplace=True)
75
76 window = [5, 10, 20, 30, 60]
77 for w in window:
78 df['roc_{}'.format(w)] = df['close'].shift(w) / df['close']
79
80 for w in window:
81 df['ma_{}'.format(w)] = df['close'].rolling(w).mean() / df['close']
82
83 for w in window:
84 df['std_{}'.format(w)] = df['close'].rolling(w).std() / df['close']
85
86 for w in window:
87 df['beta_{}'.format(w)] = (df['close'].shift(w) - df['close']) / (w * df['close'])
88
89 for w in window:
90 df['max_{}'.format(w)] = df['close'].rolling(w).max() / df['close']
91
92 for w in window:
93 df['min_{}'.format(w)] = df['close'].rolling(w).min() / df['close']
94
95 for w in window:
96 df['qtlu_{}'.format(w)] = df['close'].rolling(w).quantile(0.8) / df['close']
97
98 for w in window:
99 df['qtld_{}'.format(w)] = df['close'].rolling(w).quantile(0.2) / df['close']
100
101 for w in window:
102 df['rank_{}'.format(w)] = df['close'].rolling(w).apply(my_rank) / w
103
104 for w in window:
105 df['imax_{}'.format(w)] = df['high'].rolling(w).apply(np.argmax) / w
106
107 for w in window:
108 df['imin_{}'.format(w)] = df['low'].rolling(w).apply(np.argmin) / w
109
110 for w in window:
111 df['imxd_{}'.format(w)] = (df['high'].rolling(w).apply(np.argmax) - df['low'].rolling(w).apply(np.argmin)) / w
112
113 for w in window:
114 shift = df['close'].shift(w)
115 min = df["low"].where(df["low"] < shift, shift)
116 max = df["high"].where(df["high"] > shift, shift)
117 df["rsv_{}".format(w)] = (df["close"] - min) / (max - min + 1e-12)
118

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected