카테고리

전체 (73)
허접한주식 (47)
허접한공부 (11)
잡다한글 (15)
혼자만의 공간 (0)
Total107,282
Today4
Yesterday20
Statistics Graph

달력

« » 2016.08
  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 31      

최근에 달린 댓글






엑셀 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

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

티스토리 툴바