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()
전환부탁드립니다 감사합니다