카테고리

전체 (73)
허접한주식 (47)
허접한공부 (11)
잡다한글 (15)
혼자만의 공간 (0)
Total67,888
Today37
Yesterday35
Statistics Graph

달력

« » 2014.09
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

최근에 달린 댓글






엑셀 2007로 만들었습니다.

총 200일치의 데이터를 뽑으며, 봉 차트로 표현됩니다.

봉 한개당 12개의 데이터를 뽑아서, 시가, 종가, 저가, 고가를 파악하여 출력하네요.

변동성은 15%로, 무위험 이자율은 3%로 잡았습니다.

빨간선은 5일 단순 종가 이평선, 파란선이 20일, 녹색선이 60일 이평선 입니다.

코드는 다음과 같습니다.


Option Explicit


Private Function Cal_Val(ByVal S As Double) As Double

    Dim r As Double
    Dim v As Double
    Dim aw As Object
    Dim vvt As Double
    Dim t As Double
   
    t = 1 / 365 / 12
       
    Set aw = Application.WorksheetFunction
    r = 0.03
    v = 0.15
    vvt = v * v * t
   
    Cal_Val = Format(S * Exp(r * t - 0.5 * vvt) * Exp(Sqr(vvt) * aw.NormSInv(Rnd())), "0.00")

End Function


Sub Creat_Click()

    Application.ScreenUpdating = False
   
    Dim cnt As Integer
    Dim Val(3)
    Dim Temp_Val(9)
    Dim Max_Val As Double
    Dim Min_val As Double
    Dim aw As Object
    Dim i As Byte
   
    Set aw = Application.WorksheetFunction
     
    Val(3) = 200
       
    For cnt = 1 To 200
   
        Val(0) = Cal_Val(Val(3))
        Temp_Val(0) = Cal_Val(Val(0))
        Max_Val = Temp_Val(0)
        Min_val = Temp_Val(0)
       
        For i = 0 To 8
            Temp_Val(i + 1) = Cal_Val(Temp_Val(i))
           
            If Temp_Val(i + 1) > Max_Val Then
                Max_Val = Temp_Val(i + 1)
            ElseIf Temp_Val(i + 1) < Min_val Then
                Min_val = Temp_Val(i + 1)
            End If
        Next i
       
        Val(3) = Cal_Val(Temp_Val(9))
        Val(1) = aw.Max(Val(0), Val(3), Max_Val)
        Val(2) = aw.Min(Val(0), Val(3), Min_val)
       
        Sheet1.Range(Cells(cnt, 1), Cells(cnt, 4)) = Val
   
    Next cnt
   
    Application.ScreenUpdating = True

End Sub


코드를 설명 하자면,


Option Explicit

Private Function Cal_Val(ByVal S As Double) As Double '주가를 계산하는 함수

    Dim r As Double '무위험 이자율
    Dim v As Double '변동성
    Dim aw As Object 'Application.WorksheetFunction
    Dim vvt As Double '변동성*변동성*시간간격
    Dim t As Double '시간간격 (△t)
    
    t = 1 / 365 / 12 '일봉을 만들며, 그 일봉은 12개의 데이터로 이루어져 있기때문에 1년 / 356일 / 12회
       
    Set aw = Application.WorksheetFunction 'Application.WorksheetFunction를 짧게 쓸 수 있기 위한 작업
    r = 0.03 '무위험 이자율에 3% 할당
    v = 0.15 '변동성에 15% 할당
    vvt = v * v * t
   
    Cal_Val = Format(S * Exp(r * t - 0.5 * vvt) * Exp(Sqr(vvt) * aw.NormSInv(Rnd())), "0.00")
   '다음과 같은 공식에 따라 주가를 계산뒤 리턴.

 


뮤 값이 없기 때문에 r 로 대체하였습니다.


End Function


Sub Creat_Click() '실행 버튼에 연동

    Application.ScreenUpdating = False '처리 속도를 올리기 위해서 스크린 업데이트 중지
   
    Dim cnt As Integer
    Dim Val(3) 'Val(0) : 시가, Val(3) : 종가, Val(1) : 고가, Val(2) : 저가
    Dim Temp_Val(9) '총 12개의 데이터를 뽑으니, 시가+종가 2개를 제외한 10개의 데이터를 임시로 넣어둘 변수
    Dim Max_Val As Double '고가를 넣을 변수
    Dim Min_val As Double '저가를 넣을 변수
    Dim aw As Object 'Application.WorksheetFunction
    Dim i As Byte
   
    Set aw = Application.WorksheetFunction
     
    Val(3) = 200 '최초로 시작할 값을 200으로
        
    For cnt = 1 To 200 '200일 만큼의 데이터를 추출
    
        Val(0) = Cal_Val(Val(3)) '시가 계산
        Temp_Val(0) = Cal_Val(Val(0)) '시가 직후의 값
        Max_Val = Temp_Val(0) '시가 직후의 값을 넣어서 최대값 변수 초기화
        Min_val = Temp_Val(0) '시가 직후의 값을 넣어서 최소값 변수 초기화
        
        For i = 0 To 8 '9개의 데이터 추출(3번째 ~ 11번째)
            Temp_Val(i + 1) = Cal_Val(Temp_Val(i)) '주가를 계산하는 부분
            
            If Temp_Val(i + 1) > Max_Val Then '2번째 ~ 11번째 데이터중 최대값을 골라내는 부분
                Max_Val = Temp_Val(i + 1)
            ElseIf Temp_Val(i + 1) < Min_val Then '2번째 ~ 11번째 데이터중 최소값을 골라내는 부분
                Min_val = Temp_Val(i + 1)
            End If
        Next i
       
        Val(3) = Cal_Val(Temp_Val(9)) '종가 계산
        Val(1) = aw.Max(Val(0), Val(3), Max_Val) '시가, 2~11번째 데이터중 최대값, 종가중 최대값을 구해서 입력
        Val(2) = aw.Min(Val(0), Val(3), Min_val) '시가, 2~11번째 데이터중 최대값, 종가중 최소값을 구해서 입력

        Sheet1.Range(Cells(cnt, 1), Cells(cnt, 4)) = Val '출력
   
    Next cnt
   
    Application.ScreenUpdating = True '다 끝났으면 스크린 업데이트를 정지시킨걸 다시 해제

End Sub


엑셀파일 첨부합니다.


저작자 표시 비영리
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 3x3x3

댓글을 달아 주세요

  1. 2010/05/08 21:38  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2010/05/09 22:58  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 2010/05/10 00:09 Favicon of http://3x3x3.tistory.com 3x3x3  댓글주소  수정/삭제

      넵.ㅎ
      시가에서만 변동성을 크게 주는 방법도 하나의 방법일텐데,
      그러기에는 변동성을 얼마나 조절해야 실제 주가처럼 될련지.. 참 애매하네요.

  3. 2010/08/28 12:57 저기  댓글주소  수정/삭제  댓글쓰기

    이웃을 하고 싶은데...네이버나 다음블로그가 아니시니...난감하네요ㅜㅜ
    네이버블로그로 오시면 안되여?

  4. 2010/11/09 06:25 bellpjd  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다. 아주 유용한 정보네요

  5. 2011/02/01 11:12 천부미르  댓글주소  수정/삭제  댓글쓰기

    우연히 본 게시물을 알게 됐습니다. 사용법을 모르겠는데, 이 파일을 어떻게 활용할 수 있는지요? ^_^;;;

    • 2011/02/02 01:02 Favicon of http://3x3x3.tistory.com 3x3x3  댓글주소  수정/삭제

      사용법은..
      랜덤2_2.xlsm 파일을 받으신 이후,
      보안경고 '매크로를 사용할 수 없도록 설정했습니다' 옆에 있는 옵션을 누르시고,
      '이 콘텐츠 사용' 앞에 있는 라디오 버튼을 선택후, 확인.
      이후에, 시트1에 있는 실행 버튼을 누르면 시뮬레이션을 합니다.

  6. 2012/01/24 03:42 노재환  댓글주소  수정/삭제  댓글쓰기

    잠 유용한 정보제공 감사드립니다. 주식때문에 엑셀 공부하려고 하는데 엑셀 참 어렵구나라는 생각하게 됩니다.
    질문드려도 될까요? 선물의 종가와 거래량을 만들어서 시스템트레이딩을 해보려고 하는데 당일청산에서 걸리네요.
    좀 배워도 될까요? ^^

    • 2012/01/25 12:50 Favicon of http://3x3x3.tistory.com 3x3x3  댓글주소  수정/삭제

      Boolean형의 전역변수를 하나 만드시고, 초기화를 False로 한뒤, 한번 매매를 하면 True가 입력되게 바꾸시고요.
      매수할때, if문을 사용해서 선언한 Boolean형의 변수가 False일때만 매수가 되도록 하시면 됩니다.

  7. 2012/01/25 20:33 노재환  댓글주소  수정/삭제  댓글쓰기

    감사드립니다. 얼릉 해봐야겠네요. ^^ 지난 데이터가 없지만 어차피 랜덤워크니 님이 만드신것으로 함 해봐야겠네요
    거듭 감사드려요 ^^

  8. 2012/02/12 13:02 노재환  댓글주소  수정/삭제  댓글쓰기

    다시 또 질문드립니다. ^^;
    엑셀로 봉데이터를 누적했는데 제 시스템이 이평선베이스라서 갭보정이 필요합니다.
    일단은 10일치 데이터로 나누어서 처음 10일 -> sheet1, 다음 10일 -> sheet2 ... 이렇게 저장 되어 있는데
    한번에 갭보정 하는 방법 좀 문의드립니다.
    감사합니다.^^

    • 2012/02/16 15:15 Favicon of http://3x3x3.tistory.com 3x3x3  댓글주소  수정/삭제

      갭보정 이동평균선의 알고리즘은 다음 포스팅을 참고하길 바랍니다.
      http://3x3x3.tistory.com/entry/%EA%B0%AD%EB%B3%B4%EC%A0%95-%EC%9D%B4%EB%8F%99-%ED%8F%89%EA%B7%A0%EC%84%A0-YT

      다른 시트를 참조할때는 Sheet1, Sheet2 이렇게 사용을 해도 되지만 Worksheets("시트명") 으로 사용을 하셔도 됩니다. 다음과 같이 하면 Sheet3의 A1셀에 "아아"라는 문자가 입력됩니다.

      Sub test()
      Dim i As Integer
      i = 3
      Worksheets("Sheet" + CStr(i)).Range("A1").Value = "아아"
      End Sub

      참조해서 하시면 될것 같습니다.

티스토리 툴바