선물 tick 데이터를 연속으로 받는 중 발견한 오류입니다.

tick 데이터는 msec 해상도를 가지는데, msec까지 같은 경우가 가끔 있습니다. 그런데 연속 조회시 마지막 데이터와 다음 조회시에 받을 데이터가 같은 msec인 경우에 연속 조회시 받을 수 있는 두가지 오류가 발견되었습니다.

 

일단 원 데이터를 보겠습니다.

아래는 2024년 1월 29일 선물 tick 데이터입니다. 09:39:36초에 총 4번의 거래가 발생하였음을 알 수 있습니다.

 

첫 번째 오류는 최근에 받은 tick 자료에 msec이 같은 tick이 더 있는 경우에 발생하는 오류입니다. 

아래 자료 중 밑에 있는 것은 이전에 받은 tick 정보입니다. 09:39:36초에 2건의 거래가 있었음을 알려줍니다. querycnt 값이 차서 이 상태로 돌려줍니다. 이때 cts_time 정보는 0939363755가 돌아옵니다. API ref를 보면 돌려주는 cts_time 정보를 다음 연속 query할 때 입력으로 사용하라고 명시되어 있습니다.  다음 query의 결과값은 0939363755 보다 큰 값을 가진 tick 정보를 돌려주는 방식입니다. 이 가정에서 오류가 발생하는데요.

 

앞에서 설명하였듯이 09:39:36초에는 총 4건의 거래가 있습니다. 다음 query에서는 이 전에 몇 건을 보냈는 정보를 관리하지 않아서 무조건 cts_time보다 큰 값을 가진 tick을 돌려줍니다. 따라서 미처 받지 못한 2건은 사라지게 됩니다.

 

ebest api를 수정할 방법은 없으니 회피 방법을 찾아봅니다.

 

cts_time을 전달할 때 query에서 준 값이 아닌 tick 정보 중 최근 값보다 큰 값을 전달하면 될 듯합니다. 기본 가정은 최신 tick 시간에는 중복된 데이타가 있다고 가정을 하는 것이죠. 이렇게 해보니 msec이 중복된 tick 정보는 모두 받을 수 있는데  또 한가지 처리하여할 문제가 발생합니다. 바로 중복 저장 문제입니다.

 

수정한 방식으로 연속 query를 하면 아래와 같이 09:39:36초 데이터가 중복으로 받아집니다. api 입장에서는 0939363755 틱을 이전에 받았는지 알 수가 없는 것이죠. 그래서 중복된 모든 tick 정보를 다시 전달해줍니다. 

 

이 또한 어쩔 수 없는 것이므로, 중복된 tick을 제거하는 방식으로 처리하여야합니다.

 

방법은 간단한데요. 이전에 받은 자료 중 같은 시간에 해당하는 tick의 수를 계산해서 이번에 받은 자료에서 그 만큼 차감하여 저장하면 됩니다. 이렇게 하면 아래와 같이 중복된 자료가 사라짐을 알 수 있습니다.

 

결과적으로 msec이 같은 tick 정보를 모두 받을 수 있고, 중복된 tick 정보도 제거할 수 있었습니다.

 

이런 과정없이 tick을 저장하신 분들이 msec이 같은 경우에 이빨이 빠져있을 수 있으니 이점 참고하시기 바랍니다.

 

반응형

설정

트랙백

댓글

TradingView에서 인기 높은 지표 중의 하나가 Super Trend입니다. 추세의 시작 시점과 끝을 알려주는 지표로 많은 사랑을 받고 있습니다.

 

https://www.tradingview.com/v/r6dAP7yi/

 

SuperTrend — KivancOzbilgic tarafından gösterge

SuperTrend is one of the most common ATR based trailing stop indicators. In this version you can change the ATR calculation method from the settings. Default method is RMA, when the alternative method is SMA. The indicator is easy to use and gives an accur

tr.tradingview.com

 

Apple 차트에 대한 SuperTrend signal입니다. Apple이 추세를 잘 그리는 종목이라 진입 시점이 잘 맞는 것 같습니다.

 

 

SuperTrend의 pine script는 아래와 같습니다.

https://www.tradingview.com/v/r6dAP7yi/
//@version=4
study("Supertrend", overlay = true, format=format.price, precision=2, resolution="")

Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1

plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")

 

TradingView를 사용한다면 SuperTrend를 바로 사용할 수 있지만 본인이 직접 자동매매를 하는 경우에는 pine script를 본인이 사용하는 컴퓨터 언어로 변환작업을 해야합니다.

 

이에 SuperTrend 지표를 python으로 변환하는 과정을 정리하고자 합니다.

다음 편에서는 SuperTrend 지표를 만드는 방법에 대하여 정리하면서 해당하는 python code를 함께 정리하도록 하겠습니다.

 

반응형

설정

트랙백

댓글

예스트레이더(이하 예트)에서 시스템을 만들기 위해서는 언어의 한 종류인 YesLanguage를 배워야합니다. YesLanguage 로 원하는 수식을 자유롭게 만들기 위해서는 많은 공부가 필요합니다.

 

다행히 QnA 란에 질문하면 관리자가 친절하게 답변을 해 줍니다만, 매번 그렇게 하는 것도 어렵습니다. 스스로 공부를 많이 해서 불편함 없이 사용을 할 수 있다면 좋겠죠?

 

이번에 돌파 전략인 던키안 4주 채널 전략에 대한 백테스를 하게 되었는데, 제가 개발한 결과가 맞는지 검증하기 위하여 예트를 이용하기로 했습니다. 오랜만에 접속을 해보니 사용법이 가물가물하는군요.

 

이전 글 다시 읽어보면서 감을 찾은 후 YesLanguage를 열었습니다. 하지만 제가 원하는 바를 YesLanguage로 표현하는게 쉽지가 않더군요. 그래서 혹시나 하는 마음에 이와 유사한 수식이 있는 인터넷에서 찾아보았습니다.

 

다행히 제가 원했던 예제가 있었습니다. 

https://blog.naver.com/chartist/222633747003

 

 

주식시장을 이긴 전략들에 나오는 전략을 모두 YesLanguage로 만들어 올려놓으셨더군요. 덕분에 YesLanguage를 더 잘 이해할 수 있게 될 듯 합니다. 감사!!

 

이 글에 나오는 전략을 예트에서 실행하기 위한 절차를 자세하게 설명합니다.

 

이 post에 나오는 전략을 사용하기 위해서는 한가지 선행해야할 것이 있습니다. 바로 전략에서 사용하는 사용자 함수를 미리 복사를 해야하는 것인데요.

 

아래 글에 가서 WeekHigh.yfu, WeekLow.yfu를 다운 받은 후 YesTrader가 설치된 곳에 가서 복사를 해야합니다.

 

https://blog.naver.com/chartist/222633688599

 

설치 위치를 변경하지 않았다면 C 드라이브 밑 아래 위치에 복사하시면 됩니다.

C:\예스트레이더(x64)\YesLang\Functions

 

그리고 각 전략을 설명한 page에 있는 .ysg 파일을 아래 폴더에 복사하시면 됩니다.

 

이제 던키안의 4주 채널을 시뮬해볼 수 있는 준비가 마무리되었습니다.

 

YesTrader를 실행한 후 YesLanguage를 실행하면 방금 복사한 전략/함수들을 가져올 것인지 물어봅니다. Yes를 하시면 됩니다.

 

다음은 시스템 트레이딩을 실행하는 절차입니다.

1.시스템트레이딩 밑에 있는 시뮬레이션 차트를 누른다.

2. 원하는 종목/기간/봉 종류를 선택한다.

3. 빨간색을 표시된 시스템적용을 누른 후 좀전에 추가한 시스템을 선택한다.

4. 시뮬한 결과가 차트에 표시가 됨

5. 시스템 성능 보고서를 열어서 성과를 확인한다.

 

 

결과를 보면 원글에 나오는 성과보고서와 조금 차이가 나는데요.

원글은 평가 기간이 21/12/30일까지인 반면에 제가 돌려본 기간은 23/10월까지 입니다.

원글은 국내 지수에 대한 수익 그래프입니다(아래 왼쪽 그래프).

나스닥에 대하여 어떻 결과가 나올지 궁금하여 돌려본 결과는 오른쪽에 있습니다.

 

나스닥 상승시에는 수익그래프도 아주 이쁘게 우상향하고 있습니다만, 최근까지 반영한 시뮬 결과는 혼조 그자체이군요.

그 이유는 2022년 부터 나스닥이 하락을 했기 때문입니다.

결국 던키안4주채널 전략은 상승장에서 상승, 하락장에서는 하락하는 특징을 가지고 있다고 보시면 될 것 같습니다.

대부분의 추세 돌파 전략의 경우에는 이러한 단점을 가지고 있기 때문에 상승장에서만 적용하는 필터를 적용하는 경우가 많이 있습니다.

 

전략마다 통하는 시점이 있기 때문에 언제 어떤 전략을 돌려야 하는지를 선택하는 것 또한 중요한 전략인 듯 합니다.

 

반응형

설정

트랙백

댓글

지난 7편에서 수익이 나는 시뮬결과를 올렸습니다. 그 결과를 바탕으로 실제 거래를 위하여 개발을 진행했습니다.

그런데 지난 번 시뮬결과와는 전혀 다른 결과가 나왔습니다.

 

그 이유는 아래와 같습니다.

 

이전 시뮬에서는 특정 call/put pair의 조합으로 진행하였습니다. 따라서 특정 call/put 조합에서 손실이 나면 해당 일은 거래 종료하였는데요. 실제 거래에서는 시간 순으로 거래할 수 있는 pair 순서가 존재합니다. 이전 시뮬에서는 그 순서를 무시하고 임의의 순서로 처리가 되었습니다.

 

예를들어 지난 시뮬에서 2023/01/09을 보면 1번 거래하고 손실이 났으므로 거래를 종료했습니다. 하지만 실제 동작하는 시뮬을 만들어보니 거래가 종료되기 전에 거래 쌍을 여러 개 진입하게 됩니다(설정된 최대 값 만큼 진입). 그러다보니 1번 손실보고 마감하는 경우는 없다고 보시면 됩니다. 그래서 이전 시뮬에 비하여 손실은 늘어나는 구조일 수 밖에 없습니다.

 

실제 매매와 최대한 비슷하게 시뮬한 결과입니다.

조건은 이전 글과 거의 비슷하게 하였습니다. 차이가 있다면 최소 거래 pair를 2로 설정했다는 점입니다.

 

전략명 : 양매도 진입 제한(전략1)
거래대상 : 정규옵션 2/09일 만기
거래행사가쌍 :  285-342
거래일 : 2023/01/09 - 2/9
진입 : 거래 쌍 양합 이평 5/20 데드 크로스 나는 시점
청산 : 익절(90,000), 손절(-90,000) 혹은 이평 이평 60/120일 골드크로스
슬리피지 : 2.5 tick (양매도 한쌍 기준)
계약 수 : 콜/풋 각 1개
동시 진입 쌍 : 최소 2개 이상

승률은 50% 나왔지만 손익비가 나쁜 상황입니다. 결과론적으로 큰 손실입니다.

 

이런 저런 전략을 추가하면서 손실 금액을 낮추는 방법을 고민하고 있는데요.

우선 적용한 것은 거래 pair 별 손절 뿐 아니라 현재 진입 중인 모든 거래의 수익을 기준으로 손절하는 기능을 추가해보았습니다. 그리고 손절 금액도 -50,000원으로 줄였습니다.

전략명 : 양매도 진입 제한(전략2)
거래대상 : 정규옵션 2/09일 만기
거래행사가쌍 :  285-342
거래일 : 2023/01/09 - 2/9
진입 : 거래 쌍 양합 이평 5/20 데드 크로스 나는 시점
청산 : 
   - pair별 : 익절(90,000), 손절(-50,000) 혹은 이평 이평 60/120일 골드크로스
   - 거래쌍 수익 합 : 익절(200,000), 손절(-50,000)
슬리피지 : 2.5 tick (양매도 한쌍 기준)
계약 수 : 콜/풋 각 1개
동시 진입 쌍 : 최소 2개 이상

 

 

손실이 좀 줄었군요. 그렇다고 이전 시뮬 같이 수익은 아니므로, 실전에 투입하기에는 부족한 상태입니다.

 

과연 장중 양매도가 수익이 나는 전략인지 고민하지 않을 수 없는 상태입니다.

반응형

설정

트랙백

댓글

시뮬레이션 방식을 바꾸었더니 (실제 매매와 비슷하게) 수익률이 -로 바뀌었습니다. (7) 글은 무시하시고 아래 (8)글 보세요.

https://money-expert.tistory.com/90

 

[시스템트레이딩] 수익나는 옵션 매도 전략(8)

지난 7편에서 수익이 나는 시뮬결과를 올렸습니다. 그 결과를 바탕으로 실제 거래를 위하여 개발을 진행했습니다. 그런데 지난 번 시뮬결과와는 전혀 다른 결과가 나왔습니다. 그 이유는 아래와

money-expert.tistory.com

이하 글은 무시하세요. ㅠㅠ

 

지난 글에서 2023년 1월 정규옵션 시뮬 결과를 정리했습니다. 손실금이 상당히 크게 나와서 더 이상 현 상태로 시뮬하는 것은 큰 의미가 없을 것 같아서, 수익나는 모델로 upgrade하여 다시 시뮬해보았습니다.

전략명 : 양매도 진입 제한(전략1)
거래대상 : 정규옵션 2/09일 만기
거래행사가쌍 :  285-342
거래일 : 2023/01/09 - 2/9
진입 : 거래 쌍 양합 이평 5/20 데드 크로스 나는 시점
	이전 거래가 손실이었으면 당일 더 이상 거래하지 않음
	이전 거래가 수익이었으면 거래 계속
청산 : 익절(90,000), 손절(-90,000) 혹은 이평 이평 60/120일 골드크로스
슬리피지 : 2.5 tick (양매도 한쌍 기준)
계약 수 : 콜/풋 각 1개

 

 

일자별 시뮬 결과입니다.

 

손실나는 경우에는 깔끔하게 한번만 거래하고 끝, 수익이 나는 경우에는 계속 거래한 결과입니다.

 

지난 글에서 정리했던 것을 기본 전략이라고 정의하고, 이번에 시뮬한 전략은 전략I 이라고 부르겠습니다. 

 

진입 조건 추가함에 따라 승률과 손익비가 아주 좋아졌습니다. 기본적으로 좋은 전략이었기 때문에 가능한 것 같습니다.

트레이딩의 기본인 손절은 빨리 수익은 길게..  이 방식이 적용된 아주 좋은 전략으로 보입니다.

 

드디어 수익나는 옵션 양매도 전략을 만들었습니다!!

 

아직 확인하고 싶은 사항들이 몇 있으나, 이 정도면 수익나는 전략으로 보입니다.따라서 지금부터는 실전을 위한 자동매매 개발을 시작합니다.

 

다음에는 실전 결과를 공유하도록 하겠습니다.

 

 

반응형

설정

트랙백

댓글

제목과는 달리 아직은 수익이 나지 않는군요 ㅠㅠ.  

수익나는 전략이 나올 때 까지  Go Go!!

 

------------------------------------

위클리 옵션 기준으로 최근 5주 데이터를 이용한 시뮬 결과입니다. 

 

거래대상 : Weekly 옵션 03/16 - 4/27일

거래행사가쌍 :  [295 - 337] 중 콜/풋 가격 차이가 0.7배 - 1.3배 사이

진입 : 거래 쌍 양합 이평 5/20 데드 크로스 나는 시점

청산 : 익절(90,000), 손절(-90,000) 혹은 이평 이평 60/120일 골드크로스

슬리피지 : 2.5 tick (양매도 한쌍 기준)

계약 수 : 콜/풋 각 1개

 

지난 글에서는 익절/손절을 너무 높게 잡아서 거의 종가에 청산이 되었으나, 장중 최대 수익권을 분석한 결과 9만원 정도가 적당한 것으로 판단되어 9만원으로 설정함. 앞으로 적절한 익절 가격에 대한 통계 데이터도 꾸준히 모아서 적절하게 변경하는 것이 수익률에 도움이 될 듯 합니다.

 

3/16일 부터 주별로 시뮬 결과입니다. 

 

단 3/16 - 4/06 자료에서는 옵션 행사가 322, 325, 327이 빠진 상태의 시뮬결과입니다. 따라서 수익이 난 날은 더 났을 것이고, 손실이 난 날은 손실이 더 났을 것이니 이 점 감안하고 보시기 바랍니다.

 

시뮬결과는 그렇게 좋지 않습니다. 큰 손실로 마감하는 경우가 가끔씩 나와서 전체적으로 손실입니다.

 

시뮬 내용을 좀 더 자세하게 분석해보겠습니다.

크게 손실이 난 경우가 며칠있습니다. 이 날은 코스피 변동폭이 상당히 컸던 날입니다. 단순 양매도로는 무조건 손실이 날 수 밖에 없는 시기입니다. 코스피 변동성이 큰 날 어떻게 대응하느냐가 양매도 전략의 수익을 결정한다고 보시면 됩니다.

 

손실이 가장 컸었던 4/25일 시뮬 결과를 좀 더 자세히 살펴보겠습니다. 

당시 코스피는 -1.83%(저가대비) -1.27%(종가대비) 빠졌습니다.

 

 

코스피가 큰폭으로 하락하다보니 양매도 들어가기만 하면 손실로 마무리됩니다. 9시 초반에 들어간 5건의 양매도가 모두 loss cut에 걸려서 청산되었는데, 이런 경우에는 더 이상 신규 매도 진입을 하지 않는 것이 좋을 듯 합니다. 

 

그리고 profit cut이 낮은 경우에는 장중 익절 후 다시 진입하는 경우가 있습니다. 이런 경우에는 손절이나 약이익으로 마감하는 경우가 많았습니다.

 

따라서 아래와 같이 전략을 개선해보겠습니다.

 

전략 개선 방안

- 당일 손실이 일정 금액 이상이면 loss cut 후 매매 종료

  그동안 전략 당 loss cut을 좀 높게 잡고 있었는데, 해당 일 전체 매도 분에 대한 총 손실도 loss cut 기준으로 설정

- 당일 특정 pair가 익절이 되면 해당 pair는 매매 종료

- 거래 쌍 추가시 손실시에는 추가하지 않는다. 최대 동시 진입 거래쌍 제한. 수익이 나고 있으면 계속 추가함.

 

 

예상한대로 단순한 기계적 양매도는 평상시 약수익, 가끔 큰손실로 마감합니다. 손실 리스크를 줄이기 위하여 양매도 청산 전략의 한계점으로 보입니다. 

하지만 손실 발생시 잘 대응하는 전략을 추가한다면 손실을 어느 정도 제한할 수 있을 것 같습니다. 그리고 진입 시점/동시 진입 pair 수 조절 등등 손실을 최소화할 수 있는 다양한 방법이 있으므로 이에 대한 시뮬을 좀 더 해보도록 하겠습니다.

 

---------------------------

앞으로 작업할 내용은 다음과 같습니다.

1. weekly option 대상 다양화 : 완료

2. 정규 옵션 back test

3. 최대 수익이 나는 익절과 손절 값 찾아보기 (현재는 익절 70,000원, 손절 -70,000원) : 완료

4. 특정 양매도 조합에서 청산 후 다시 진입하는 것이 유리한지 여부

5. 시간적인 관점에서 다양한 양매도 진입 시점(현재는 등가 +- 5%) 

     장시작, 장 시작 후 30분, 40분, 1시간, 2시간 이후 등등 

6. 가격적인 관점에서 다양한 양매도 진입  시점 (현재는 장 중 등가 +- 5% 시점)

    선물이 급격하게 움직일 때, 장기간 횡보할 때 등등

7. 매도에 적절한 옵션가격 : 

     2.50 이하 혹은 0.8이상 등등

8. 손절 대신 한 호가 위 혹은 아래 옵션 매수 본전 선에서 익절 ( 가치성장님 아이디어 )

9. ma 5/20 데드크로스시 진입, ma60/120 골드크로스시 청산 : 완료

10. 당일 손실이 일정 금액 이상이면 loss cut 후 매매 종료

11. 당일 특정 pair가 익절이 되면 해당 pair는 매매 종료

12. 거래 쌍 추가시 손실시에는 추가하지 않는다. 최대 동시 진입 거래쌍 제한. 수익이 나고 있으면 계속 추가함.

반응형

설정

트랙백

댓글

1편에 이어서 향후 해야할 일들 3번에 나오는 최적의 익절/손절 값을 찾아보겠습니다.

프로그램으로 백테스트를 하면 이런 식으로 파라미터를 조절하면서 확인하는 것이 용이합니다. 물론 추가 개발이 필요합니다만, 한번 개발하면 계속 사용할 수 있기 때문에 투자할 만 합니다.

 

익절 : 20,000 ~ 100,000원

손절 : -20,000 ~ -100,000원

 

손절이 익절보다 큰 경우는 제외하였습니다.

 

 

결과를 간단하게 정리해보겠씁니다.

23일은 양매도는 손실이 발생하는 날입니다. 어떤 조합도 손실을 막을 수는 없습니다. 이런 날은 빨리 손절하고 쉬는 것이 정신 건강에 좋습니다.

 

24일은 대부분 수익이 나는 날인데요. 얼마나 수익을 내느냐는 파라미터에 따라서 차이가 많이 납니다.

  • - 최저 -27,000부터 최고 363,000원까지 다양
  • 손실이 나는 구간도 익절/손절 금액을 높이면 익절이 남. 양매도는 시간과의 싸움이라 적당한 시간을 기다려주는 것이 수익률에 도움이 되는 것을 알 수 있음.
  • 일반적으로 익절/손절 범위가 넓을수록 그리고 최대 옵션 가격도 2.6 정도로 확장하였을 때 수익이 최대가 됨

 

단 하루 검정을 하였기 때문에 이 값이 최적이라고는 볼 수 없지만 느낌 상으로도 범위를 넓혀야 손절하지 않고 익절할 수 있는 기회가 생기는 것 같습니다. 그리고 갑자기 변동성이 증가할 때 적절한 손실이 자주 발생합니다. 이때 잘 견디면 프리가 다시 빠지면서 수익 전환하는 경험이 많았던 것으로 보아, 익절/손절 폭은 넓힐수록  유리한 듯 합니다.

 

참고로 수익에 나오는 값은 slipage 2 tick, 수수료까지 감안한 수치입니다.

 

앞으로 작업할 내용은 다음과 같습니다.

1. weekly option 대상 다양화

2. 정규 옵션 back test

3. 최대 수익이 나는 익절과 손절 값 찾아보기 (현재는 익절 70,000원, 손절 -70,000원) : 완료

4. 특정 양매도 조합에서 청산 후 다시 진입하는 것이 유리한지 여부

5. 시간적인 관점에서 다양한 양매도 진입 시점(현재는 등가 +- 5%) 

     장시작, 장 시작 후 30분, 40분, 1시간, 2시간 이후 등등 

6. 가격적인 관점에서 다양한 양매도 진입  시점 (현재는 장 중 등가 +- 5% 시점)

    선물이 급격하게 움직일 때, 장기간 횡보할 때 등등

7. 매도에 적절한 옵션가격 : 

     2.50 이하 혹은 0.8이상 등등

8. 손절 대신 한 호가 위 혹은 아래 옵션 매수 본전 선에서 익절 ( 가치성장님 아이디어 )

반응형

설정

트랙백

댓글

그동안 옵션 매수로 수익나는 방법에 대하여 고민을 많이 해 보았으나, 시간가치 감소를 이기고 수익을 내기가 상당히 힘들었습니다. 그래서 요 며칠 장 중 양매도를 해보니 수익이 조금씩 나는 것 같아서 그동안 가지고 있던 양매도에 대한 부정적인 이미지를 버리고 양매도 전략으로 수익을 내는 방법을 찾아보기로 하였습니다.

 

시장 중립형으로 비교적 안정적인 매도 방법을 찾는 것이 이번 연구의 목표입니다.

 

일단 생각한 방식으로는 

1. 당일 청산

2. 콜풋 동일 가격 양매도

3. 장 중 청산 후 다시 조건이 발생하면 재 진입

 

보통 옵션 매도는 차월 먼 외가 양매도 후 1달 정도 가져가면서 시간 감소 수익을 취하는 경우가 많은데, 가끔씩 터지는 큰 손실에 대한 두려움으로 당일 청산을 목표로 합니다. 과연 당일 청산을 하고도 수익이 날 수 있을지 확인해보겠습니다.

 

우선 장 중 변동성이 큰 weekly 옵션을 대상으로 back test를 진행해보았습니다.

시뮬 기간 동안 kospi200 가격표입니다.

3/28일을 제외하고는 큰 등락이 없었군요. 시뮬 결과입니다.

 

다행히 수익이 나왔습니다. 그런데 장 중 재진입시 손실이 나는 경우가 많았습니다. 좀 더 많은 경우에 대하여 수익 여부를 확인할 예정입니다.

 

수익금액도 중요하지만 수익률도 중요하겠죠. 수익률에 대하여 살펴보겠습니다.

양매도는 증거금이 많이 들기 때문에 실제 투입금액을 증거금을 기준으로 하여야 하지만, 채권이나 주식 대용도 가능하기 때문에 계산의 편의를 위하여 1 point당 250,000원 기준으로 수익률을 계산해보았습니다.

평균 하루에 서로 다른 행사가로 3set 정도 동시에 양매도가 들어가는 경우에 투입금액 약 4.4백만원이며, 위와 같이 일주일에 230,000원 정도 수익이 나온다면 연 270% 정도 수익률이 나옵니다.

 

물론 좀 더 다른 조합과 상황에서 돌려보아야겠지만 손절을 잘 한다는 가정하에서 장 중 양매도는 생각만큼 위험하지 않은 것 같습니다. 다만 장중 양매도를 하기 때문에 하루 수익금이 크지는 않습니다. 

 

앞으로 작업할 내용은 다음과 같습니다.

1. weekly option 대상 다양화

2. 정규 옵션 back test

3. 최대 수익이 나는 익절과 손절 값 찾아보기 (현재는 익절 70,000원, 손절 -70,000원)

4. 특정 양매도 조합에서 청산 후 다시 진입하는 것이 유리한지 여부

5. 시간적인 관점에서 다양한 양매도 진입 시점(현재는 등가 +- 5%) 

     장시작, 장 시작 후 30분, 40분, 1시간, 2시간 이후 등등 

6. 가격적인 관점에서 다양한 양매도 진입  시점 (현재는 장 중 등가 +- 5% 시점)

    선물이 급격하게 움직일 때, 장기간 횡보할 때 등등

7. 매도에 적절한 옵션가격 : 

     2.50 이하 혹은 0.8이상 등등

 

마지막으로 본 아이디어를 주신 파생인의 쉼터 API 대화방 분들과 특히 관심을 가져주신 구피님께 감사를 전합니다.

반응형

설정

트랙백

댓글

일전에 시뮬레이션 결과를 차트로 그리는 방법에 대한 글을 썼었는데요.

https://money-expert.tistory.com/36?category=781442

 

[시스템트레이딩] 전략 시뮬레이션(4) - 차트에 문자열 출력하기

LW 전략을 돌려본 후 mdd, 수익률 등등을 보면서 성과가 얼마나 나왔는지 확인이 가능합니다. 그런데 전략을 개선하기 위해서는 언제 수익이 났고 언제 손실이 발생하였는지를 chart 그래프로 확인

money-expert.tistory.com

 

오랜만에 전략 시물레이션 결과를 보려고 이전 글을 보니, 많이 복잡합니다. 

그래서 간단하게 다시 정리하였습니다.

추가로 candle 차트 뿐 아니라 추세선을 그리는 것도 포함하였습니다.

 

본인이 만든 전략이 잘 동작하는지 파이썬으로 개발하면 좋겠지만, 개발 실력이 부족한 경우에는 excel로 simulation을 해야합니다. excel로 전략에 사용할 지표도 계산하고, 매수/매도 시점과 수량 등을 표기할 수 있습니다. 이렇게 정리한 excel 문서를 candle 차트로 그려볼 수 있다면 전략이 잘 동작하는 한눈에 볼 수 있습니다.

 

이번 글에서는 순수하게 excel을 이용하여 전략에 사용할 지표를 만들고, 매수/매도 시점을 표기해 놓기만 하면 차트와 추세선을 그려주는 파이썬 프로그램을 공개합니다.

 

제가 만든 예는 2022년 4월 미니선물 10분 봉을 기반으로 MA7, MA24를 계산한 후 cross가 발생한 경우에 매수/매도를 반복하는 전략입니다. 수익이 나는지 보다는 어떻게 활용하는지 관점에서 보시기 바랍니다.

 

excel 파일에서 반드시 포함되어야 하는 문구 및 내용은 아래와 같습니다.

1. datetime : 일자와 시간을 숫자로만 표기합니다. 일자와 시간을 구분하기 위하여 중간에 T를 사용합니다만, 공백도 가능하고, 없어도 됩니다. 다만 일자와 숫자에는 다른 문자가 있으면 안됩니다. 순수하게 숫자T숫자 이렇게 기록하시면 됩니다. 2020년 4월 1일 9시 10분은 이렇게 표기하시면 됩니다. 20220401T091000

2. 지표 : 본인이 그래프에 그리고 싶은 지표를 계산합니다. 예제에서는 ma7, ma24를 사용합니다.

지표의 경우에는 사용하고자 하는 컬럼의 이름을 python source 코드에서 변경해 주어야 합니다. 방법은 아래에 설명합니다.

3. action : 매수 혹은 매도할 자리입니다. buy/sell로 표기합니다.

4. qty : 매수 혹은 매도할 수량

5. balance : 잔고수량

6. close : 종가. 만약 다른 값을 사용하고 싶으면 파이썬 코드를 수정하시면 됩니다. 혹은 close라는 컬럼에 원하는 값을 넣으셔도 됩니다. 예를들어 low, high 중간값을 사용한다면 기존 close는 close_org로 변경하고, close라는 컬럼을 새로 만들어서 low, high 중간값을 계산하여 넣으면 됩니다.

 

아래 excel 예제에서와 같이 노란색으로 표기한 부분은 예제에 나오는 이름을 유지하셔야 합니다. 파란색으로 표기한 부분은 전략에 따라 이름이 변경될 수 있으므로 원하는 이름으로 바꾸시고, 파이썬 source 코드에도 변경해주어야 합니다.

 

지표를 파이썬 코드에서 변경하는 방법입니다.

현재 코드상에는 아래와 같이 표기되어 있습니다.

 

excel 파일에 있는 컬럼의 title 값이 적혀있습니다. excel에 있는 값과 파이썬 코드에 있는 값을 서로 일치시키면 됩니다. 예를들어 RSI를 사용한다고 하면 excel 파일에도 RSI, 파이썬 코드에서도 data.RSI라고 기술하면 됩니다.

 

동작 결과입니다.

excel 예제는 ma7, ma24를 구한 후 ma7이 ma24를 돌파하면 매수 그 반대면 매도를 하는 간단한 전략입니다.

 

전략에 맞게 action에 buy/sell을 기록하고 수량은 1개로 통일했습니다. 이렇게 만들어진 excel 파일을 github에 함께 올려놓았습니다. 여러분이 만드시는 전략에 맞게 지표 계산하시고, 매수/매도 시점 표기하고 잔고 표기하시면 됩니다.

 

위 엑셀 예제에서 보면 diff 값이 -에서 +로 변경되는 시점에 1개 매수한다라고 표기한 예입니다.

 

전 구간에 대하여 action을 기록한 후 github에 있는 프로그램을 돌려보면 아래와 같이 정확하게 cross하는 구간에서 매수/매도를 반복하고 있습니다. 그래프 상에서 S는 매도 S 위에 있는 숫자는 (매매수량,잔고) 입니다. B는 매수입니다.

그래프를 보니 뭔가 개선할 점이 마구 보이시죠? 그런 부분을 보완해서 전략을 발전시켜나가시면 됩니다.

 

----------------------

 

실행결과 수익이 나는지 궁금하시죠. 수익여부도 함께 알려줍니다.

 

실행시 나오는 결과입니다. 잔고가 0이 되는 시점에 누적 수익을 출력해주다가 마지막에 summary를 보여줍니다. 현재 이 전략은 -8.7 pt 손실이군요.

 

+가 나오는 전략이 나온다면 이를 바탕으로 파이썬 프로그램을 직접 개발하거나 개발자에게 의뢰하여 운용을 하시면 될 것 같습니다. 수익이 날 것 같은데 실제로 돌려보면 손실인 경우가 너무 많습니다. 

 

쉽지 않은 길이지만 언젠가는 그 길을 찾을 것이라는 희망을 품고,, 오늘도 전략을 생각해봅니다.

 

마지막으로 excel 파일에 대하여 주의할 사항이 있습니다. 전략은 excel 통합문서 형태로 만드셔야 합니다. 그래야 수식을 적용할 수 있습니다. 전략에서 사용할 추세선, action 등등을 모두 완성한 후  simulation으로 돌려볼 떄는 csv 파일로 저장한 후 사용하세요. 통합문서를 csv 파일로 변경하는 불편함이 있지만 현재 프로그램 상태는 csv 파일만 읽고 있습니다. 

 

소스코드와 예제 excel 통합문서 파일, csv 파일은 아래 github에 있습니다.

https://github.com/multizone-quant/drawing_chart

 

GitHub - multizone-quant/drawing_chart

Contribute to multizone-quant/drawing_chart development by creating an account on GitHub.

github.com

 

위 프로그램을 실행하기 위해서는 아래 두 패키지가 설치되어 있어야 합니다.

pip install plotly

pip install pandas

 

 

 

반응형

설정

트랙백

댓글

시스템 트레이딩을 개발하다보면 거래소 API가 없으면 자동매매할 수가 없습니다.

 

하지만 사용자가 사용하는 패턴을 기록하였다가 자동으로 마우스/키보드 입력을 할 수 있다면 어떤 HTS에서도 자동 주문이 가능합니다. 

 

파이썬을 이용하여 자동으로 마우스/키보드 입력을 할 수 간단한 방법을 알아보겠습니다.

 

파이썬에서 이런 기능을 제공하는 패키지로는 pyautogui이 있습니다. 관련 문서는 아래 공식 사이트에서 확인이 가능합니다.

 

https://pyautogui.readthedocs.io/en/latest/

 

Welcome to PyAutoGUI’s documentation! — PyAutoGUI documentation

Welcome to PyAutoGUI’s documentation! PyAutoGUI lets your Python scripts control the mouse and keyboard to automate interactions with other applications. The API is designed to be simple. PyAutoGUI works on Windows, macOS, and Linux, and runs on Python 2

pyautogui.readthedocs.io

 

첫 번째로 pyautogui 패키지를 설치합니다.

 

pip install pyautogui

 

다음으로는 원하는 버튼과 입력창의 마우스 좌표 값을 읽어야합니다.

사용하고자 하는 HTS가 full screen이면 동작 프로그램을 볼 수 없으므로, 멀티 모니터를 사용하거나, HTS 화면 크기를 조금 줄여서 사용하기를 권합니다. 

 

아래 github주소에서 마우스 위치를 구하는 프로그램을 실행시켜서 원하는 좌표를 기록합니다.

 

https://github.com/multizone-quant/steemmonsters/blob/main/AutoGUI%20-%20GET%20-%20MOUSE%20-%20POSITION.py

이 상태에서 지정된 가격으로 자동으로 주문하는 방법을 알아보겠습니다.

 

구해야할 좌표는 아래와 같습니다.

 

1. 매수 가격 창의 좌표 : 현재가 이미 표시된 경우가 있으므로 숫자가 있는 곳의 좌표 확인

2. 수량 창의 좌표

3. 매수 버튼 좌표

4. 매수 확인 버튼 좌표

5. 매수 완료 버튼 좌표

 

다음으로는 아래 프로그램을 down받아서 방금 구한 좌표값과 매수가격/수량을 입력합니다.

 

https://github.com/multizone-quant/steemmonsters/blob/main/upbit-auto-buy.py

 

GitHub - multizone-quant/steemmonsters

Contribute to multizone-quant/steemmonsters development by creating an account on GitHub.

github.com

 

소스 파일에서 아래 변수 값을 본인의 화면에서 찾은 좌표값으로 변경합니다.

 

price   = [993, 584]  # 가격 입력 창
qty     = [1085, 640]  # 수량 입력 창
order   = [939, 906]  # 주문 버튼
confirm = [719, 634]  # 주문 확인 버튼
done    = [715, 473]  # 닫기 버튼

 

원하는 가격과 수량도 정의하세요.
order_price = 48000000
order_qty = 0.001

 

이 상태에서 실행을 하면 프로그램이 알아서 자동으로 매수 주문을 해 줍니다.

 

실제로 실행을 해보니, HTS 프로그램의 위치를 잘 기억하고 있어야 하더군요. full screen 상태에서는 큰 문제가 없지만(멀티 모니터 사용) 그렇지 않은 경우에는 HTS 크기를 조절하는 상태를 잘 기억해야 다음 실행시에도 정상적으로 동작합니다.

 

현재 상태에서 매수/매도 선택하는 부분만 추가한다면 원하는 가격과 수량에 자동으로 매수/매도할 수 있습니다.

 

 

 

 

반응형

설정

트랙백

댓글