커뮤니티

부탁드립니다 항상 감사합니다

프로필 이미지
윤호석
2025-09-14 14:58:59.0
76
글번호 193988
답변완료
import numpy as np import matplotlib.pyplot as plt np.random.seed(3) # 1) 가상의 OHLC 데이터 만들기 n = 120 base = 100 + np.cumsum(np.random.randn(n)*0.6) high = base + np.abs(np.random.randn(n)*0.5) low = base - np.abs(np.random.randn(n)*0.5) close = base.copy() # 2) 파라미터 length = 14 # 채널 길이 len2 = 6 # Exit 단기 길이 def rolling_max(x, w, i): s = max(0, i-w+1) return np.max(x[s:i+1]) def rolling_min(x, w, i): s = max(0, i-w+1) return np.min(x[s:i+1]) upper = np.zeros(n) lower = np.zeros(n) up = np.zeros(n) down = np.zeros(n) sup = np.zeros(n) sdown = np.zeros(n) for i in range(n): upper[i] = rolling_max(high, length, i) lower[i] = rolling_min(low , length, i) up[i] = rolling_max(high, length, i) down[i] = rolling_min(low , length, i) sup[i] = rolling_max(high, len2 , i) sdown[i] = rolling_min(low , len2 , i) # 3) Trend Line(K1): 최근 고점/저점 갱신 시점 비교 trend_line = np.zeros(n) k2 = np.zeros(n) # Exit Line(K2) last_high_idx = 0 last_low_idx = 0 for i in range(1, n): # 최근 고점/저점 갱신 판정 if high[i] >= up[i-1]: last_high_idx = i if low[i] <= down[i-1]: last_low_idx = i # i 시점의 추세 up_trend = last_high_idx >= last_low_idx # K1 선택: 상승이면 up, 하락이면 down trend_line[i] = up[i] if up_trend else down[i] # K2 선택: 상승이면 sdown(저점선=손절), 하락이면 sup(고점선=손절) k2[i] = sdown[i] if up_trend else sup[i] trend_line[0] = up[0] k2[0] = sdown[0] # 4) 신호 계산 (buy/sell) + 청산 buy_sig = np.zeros(n, dtype=bool) sell_sig = np.zeros(n, dtype=bool) buy_exit = np.zeros(n, dtype=bool) sell_exit = np.zeros(n, dtype=bool) for i in range(1, n): # 채널 돌파 신호 buy_sig[i] = (high[i] >= upper[i-1]) and (high[i-1] < upper[i-1]) sell_sig[i] = (low[i] <= lower[i-1]) and (low[i-1] > lower[i-1]) # 추세에 따른 Exit 판정 up_trend = trend_line[i] == up[i] # 간단 판별 if up_trend: buy_exit[i] = (low[i] <= sdown[i-1]) and (low[i-1] > sdown[i-1]) else: sell_exit[i] = (high[i] >= sup[i-1]) and (high[i-1] < sup[i-1]) # 5) 시각화 (규정: seaborn 미사용, 단일 플롯, 색상 지정 안 함) plt.figure(figsize=(13,6)) plt.plot(close, label="Price") plt.plot(upper, label="Upper") plt.plot(lower, label="Lower") plt.plot(trend_line, label="Trend Line (K1)") plt.plot(k2, label="Exit Line (K2)") # 텍스트 라벨: '수' / '도' / '청' for i in range(n): if buy_sig[i]: plt.text(i, low[i], "수") if sell_sig[i]: plt.text(i, high[i], "도") if buy_exit[i]: plt.text(i, low[i], "청") if sell_exit[i]: plt.text(i, high[i], "청") plt.title("Trend Line (K1) + Exit Line (K2) + ‘수/도/청’ 신호 예시") plt.xlabel("Bar Index") plt.ylabel("Price") plt.legend() plt.grid(True) plt.show() 전환부탁드립니다 감사합니다
지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-09-15 12:29:21.0

안녕하세요 예스스탁입니다. 올려주신 내용은 변환이 가능하지 않습니다. 수식에 사용자함수가 있는데 어떤 내용인지 알 수 없습니다. 즐거운 하루되세요 > 윤호석 님이 쓴 글입니다. > 제목 : 부탁드립니다 항상 감사합니다 > import numpy as np import matplotlib.pyplot as plt np.random.seed(3) # 1) 가상의 OHLC 데이터 만들기 n = 120 base = 100 + np.cumsum(np.random.randn(n)*0.6) high = base + np.abs(np.random.randn(n)*0.5) low = base - np.abs(np.random.randn(n)*0.5) close = base.copy() # 2) 파라미터 length = 14 # 채널 길이 len2 = 6 # Exit 단기 길이 def rolling_max(x, w, i): s = max(0, i-w+1) return np.max(x[s:i+1]) def rolling_min(x, w, i): s = max(0, i-w+1) return np.min(x[s:i+1]) upper = np.zeros(n) lower = np.zeros(n) up = np.zeros(n) down = np.zeros(n) sup = np.zeros(n) sdown = np.zeros(n) for i in range(n): upper[i] = rolling_max(high, length, i) lower[i] = rolling_min(low , length, i) up[i] = rolling_max(high, length, i) down[i] = rolling_min(low , length, i) sup[i] = rolling_max(high, len2 , i) sdown[i] = rolling_min(low , len2 , i) # 3) Trend Line(K1): 최근 고점/저점 갱신 시점 비교 trend_line = np.zeros(n) k2 = np.zeros(n) # Exit Line(K2) last_high_idx = 0 last_low_idx = 0 for i in range(1, n): # 최근 고점/저점 갱신 판정 if high[i] >= up[i-1]: last_high_idx = i if low[i] <= down[i-1]: last_low_idx = i # i 시점의 추세 up_trend = last_high_idx >= last_low_idx # K1 선택: 상승이면 up, 하락이면 down trend_line[i] = up[i] if up_trend else down[i] # K2 선택: 상승이면 sdown(저점선=손절), 하락이면 sup(고점선=손절) k2[i] = sdown[i] if up_trend else sup[i] trend_line[0] = up[0] k2[0] = sdown[0] # 4) 신호 계산 (buy/sell) + 청산 buy_sig = np.zeros(n, dtype=bool) sell_sig = np.zeros(n, dtype=bool) buy_exit = np.zeros(n, dtype=bool) sell_exit = np.zeros(n, dtype=bool) for i in range(1, n): # 채널 돌파 신호 buy_sig[i] = (high[i] >= upper[i-1]) and (high[i-1] < upper[i-1]) sell_sig[i] = (low[i] <= lower[i-1]) and (low[i-1] > lower[i-1]) # 추세에 따른 Exit 판정 up_trend = trend_line[i] == up[i] # 간단 판별 if up_trend: buy_exit[i] = (low[i] <= sdown[i-1]) and (low[i-1] > sdown[i-1]) else: sell_exit[i] = (high[i] >= sup[i-1]) and (high[i-1] < sup[i-1]) # 5) 시각화 (규정: seaborn 미사용, 단일 플롯, 색상 지정 안 함) plt.figure(figsize=(13,6)) plt.plot(close, label="Price") plt.plot(upper, label="Upper") plt.plot(lower, label="Lower") plt.plot(trend_line, label="Trend Line (K1)") plt.plot(k2, label="Exit Line (K2)") # 텍스트 라벨: '수' / '도' / '청' for i in range(n): if buy_sig[i]: plt.text(i, low[i], "수") if sell_sig[i]: plt.text(i, high[i], "도") if buy_exit[i]: plt.text(i, low[i], "청") if sell_exit[i]: plt.text(i, high[i], "청") plt.title("Trend Line (K1) + Exit Line (K2) + ‘수/도/청’ 신호 예시") plt.xlabel("Bar Index") plt.ylabel("Price") plt.legend() plt.grid(True) plt.show() 전환부탁드립니다 감사합니다