This commit is contained in:
dsyoon
2025-08-23 18:18:03 +09:00
parent 62771d068c
commit 865a5c8680
28 changed files with 256 additions and 81 deletions

View File

@@ -131,8 +131,46 @@ class Monitor:
)
return normalized_data
def inverse_data(self, data: pd.DataFrame) -> pd.DataFrame:
"""원본 data 가격 시계를 상하 대칭(글로벌 min/max 기준)으로 반전하여 하락↔상승 트렌드를 뒤집는다."""
price_cols = ['Open', 'High', 'Low', 'Close']
inv = data.copy()
global_min = data[price_cols].min().min()
global_max = data[price_cols].max().max()
# 축 기준은 global_mid = (max+min), so transformed = max+min - price
for col in price_cols:
inv[col] = global_max + global_min - data[col]
# Volume은 그대로 유지
inv['Volume'] = data['Volume']
# 지표 다시 계산
inv = self.normalize_data(inv)
inv['MA5'] = inv['Close'].rolling(window=5).mean()
inv['MA20'] = inv['Close'].rolling(window=20).mean()
inv['MA40'] = inv['Close'].rolling(window=40).mean()
inv['MA120'] = inv['Close'].rolling(window=120).mean()
inv['MA200'] = inv['Close'].rolling(window=200).mean()
inv['MA240'] = inv['Close'].rolling(window=240).mean()
inv['MA720'] = inv['Close'].rolling(window=720).mean()
inv['MA1440'] = inv['Close'].rolling(window=1440).mean()
inv['Deviation5'] = (inv['Close'] / inv['MA5']) * 100
inv['Deviation20'] = (inv['Close'] / inv['MA20']) * 100
inv['Deviation40'] = (inv['Close'] / inv['MA40']) * 100
inv['Deviation120'] = (inv['Close'] / inv['MA120']) * 100
inv['Deviation200'] = (inv['Close'] / inv['MA200']) * 100
inv['Deviation240'] = (inv['Close'] / inv['MA240']) * 100
inv['Deviation720'] = (inv['Close'] / inv['MA720']) * 100
inv['Deviation1440'] = (inv['Close'] / inv['MA1440']) * 100
inv['golden_cross'] = (inv['MA5'] > inv['MA20']) & (inv['MA5'].shift(1) <= inv['MA20'].shift(1))
inv['MA'] = inv['Close'].rolling(window=20).mean()
inv['STD'] = inv['Close'].rolling(window=20).std()
inv['Upper'] = inv['MA'] + (2 * inv['STD'])
inv['Lower'] = inv['MA'] - (2 * inv['STD'])
return inv
def calculate_technical_indicators(self, data: pd.DataFrame) -> pd.DataFrame:
data = self.normalize_data(data)
data['MA5'] = data['Close'].rolling(window=5).mean()
data['MA20'] = data['Close'].rolling(window=20).mean()
data['MA40'] = data['Close'].rolling(window=40).mean()
@@ -154,6 +192,7 @@ class Monitor:
data['STD'] = data['Close'].rolling(window=20).std()
data['Upper'] = data['MA'] + (2 * data['STD'])
data['Lower'] = data['MA'] - (2 * data['STD'])
return data
# ------------- Strategy -------------