도메인/금융공학

첫번째 시뮬레이션 - 골드크로스의 실제 타당성 여부 검사

늘근이 2015. 4. 26. 22:33

제대로된 자동매매프로그램을 만들기 전에, 실제 금융에 대한 논문을 쓰면서 주식시장이 실제로 어떻게 

돌아가고 있나 살펴보기로 한다.


일단 계속해서 언급했던 것처럼 파이썬과 장고 프레이임워크 이용해서 프로그래밍을 했다. 파이썬을 이용한 이유는, 추후에 자동매매 프로그램을 개발할때 DLL혹은 COM 객체가 필요하며, 파이썬은 상당히 여러가지를 쫌맬수 있는 강점이 존재하기 때문이다. 개인적으로 스칼라로 프로그램을 구축하고 싶었으나, google이나 yahoo finance 정보를 쉽게 따올수 있는 걸 제공하는 파이썬의 학문관련 패키지가 굉장히 좋아보였기 때문이다. 


전체적으로 파이썬의 강점은 쉽고 평범한 문법과 동적타입, 그리고 패키지 기능이 아닌가 싶다.

그렇지만, 객체를 만드는 과정이 살짝은 지저분하기도 하고 Indention은 특히나 짜증나는 기능이 아닌가 싶다. 사실 가독성의 측면에서 Indention이 일종의 교과서처럼 쓰이는건 사실이지만, 아예 이러한 기능을 문법화 해버렸기 때문에, 문장을 예외처리 한다거나 for문안에 삽입시킨다거나 하는 기능은 그다지 좋아보이지 않는다. 


여기서 검증할 이론은 바로 '골드크로스'와 '데드크로스'의 신빙성이다. 

단기평균선이 장기평균선을 치고 올라가면, 상향추세가 있다고 판단하고 그 반대면 하향추세가 있다고 판단하는 전략이다. 

5일선과 120일선을 기준으로 계속 매매를 했을경우, 이러한 이론이 맞다면 그 시장이 강세시장이든 약세시장이든 어느정도의 수익률을 보장해야 한다는 것이다. 


일단 코드는 다음과 같다.


def calc(request):

print("----start--------------------")

print(datetime.datetime.now())

print("----------------------------")


tpl = loader.get_template('list.html')

beg = datetime.datetime(2005,1,1)

end = datetime.datetime(2015,4,1)


for targetStock in stockNumber:

try:

print(targetStock)


targetStock = targetStock + '.KS'

data = web.DataReader(targetStock,"yahoo",beg,end) # Samsung Electronics

data['mean5'] = panda.stats.moments.rolling_mean(data['Adj Close'], 5)

data['mean10'] = panda.stats.moments.rolling_mean(data['Adj Close'], 10)

data['mean20'] = panda.stats.moments.rolling_mean(data['Adj Close'], 20)

data['mean60'] = panda.stats.moments.rolling_mean(data['Adj Close'], 60)

data['mean120'] = panda.stats.moments.rolling_mean(data['Adj Close'], 120)

data['diff'] = data['mean5']-data['mean120']

data['status'] = ""

data['cash'] = 0

# data['stock'] = 0

data['asset'] = 0


starttime = datetime.datetime.now()


print("----end rolling calc----------------")

print(datetime.datetime.now())

print("--------------------------------")


i = 0 # loop initial value

cash = 0

stock = 0

asset = 0

temp = 0

flag = False

stockList = []

resultList = []

status = ""

adjc = 0

initial_flag = True # 초기 투자비용 계산용

initial_price = 0

rate = 0.00



while i < len(data):

diff = data['diff'].ix[i]

adjc = data['Adj Close'].ix[i] 

val = diff * temp 



if val < 0 and temp > 0 : ### buy

cash = cash - adjc # buying stock, 

stock = stock + adjc

flag = True

status = "BUY"


if initial_flag == True:

initial_price = adjc


elif val < 0 and temp <= 0: ### sell

cash = cash + adjc # selling stock, 

stock = 0

flag = False

status = "SELL"


else :

status = ""


#adjusting data

if flag == True:

stock = adjc


asset = cash + stock


if initial_price == 0 :

rate = 0

else :

rate = asset / initial_price * 100



# stockList.append(Stock(data.index[i],adjc,cash,stock,asset,rate,status))

realRate = (adjc-initial_price) / initial_price * 100

resultList.append(Result(targetStock, "" ,initial_price, adjc, realRate, rate))



temp = diff

i = i + 1 # no iterator, thus manual index increasing


print("----end looping------------------")

print(datetime.datetime.now())

print("------------------------------------")

except :

print("exception occurred")


# h = data.to_html(escape=False)

# ctx = Context({'data' : data,  'htmlData' : h, 'stockList' : stockList})


ctx = Context({'ResultList' : ResultList})



endtime = datetime.datetime.now()

timespent = endtime - starttime 

print("------total spent-----------------")

print(timespent)

print("------total spent---------------------")


return HttpResponse(tpl.render(ctx)) 


이제 template은 다음과 같다.



<table>


<tr>

    <th>targetStock</th>

    <th>desc</th>

    <th>initial_price</th>

    <th>adjc</th>

    <th>realRate</th>

    <th>rate</th>

</tr>


{% for result in resultList %}


<tr>

<td>index : {{result.targetStock}}</td>

<td>adjc : {{result.desc}}</td>

<td>cash : {{result.initial_price}}</td>

<td>stock : {{result.adjc}}</td>

<td>asset : {{result.realRate}}</td>

<td>rate : {{result.rate}} % </td>

</tr>


{% endfor %}


</table>


{% block content %}

{{htmlData|safe}}


{% endblock %}

 


그런데 LG전자를 파싱하던 도중 프로그램이 죽었다.