제대로된 자동매매프로그램을 만들기 전에, 실제 금융에 대한 논문을 쓰면서 주식시장이 실제로 어떻게
돌아가고 있나 살펴보기로 한다.
일단 계속해서 언급했던 것처럼 파이썬과 장고 프레이임워크 이용해서 프로그래밍을 했다. 파이썬을 이용한 이유는, 추후에 자동매매 프로그램을 개발할때 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전자를 파싱하던 도중 프로그램이 죽었다.
'도메인 > 금융공학' 카테고리의 다른 글
최신 상장주식회사 목록 2015-05 (0) | 2015.05.05 |
---|---|
이동평균선의 통계적 근거 (0) | 2015.04.28 |
이동평균 데이터 분석하기 (0) | 2015.04.25 |
Python Data 다루기 (0) | 2015.04.22 |
파이썬 시작, Xing API 이용하기 (7) - Xing API (0) | 2015.04.19 |