ジョーガバナンス工大学計算投資公開課第5週作業市場シミュレータ

5462 ワード

Computational Investing, Part I  by Dr. Tucker Balch
数週間前の宿題は簡単だったので、出していませんでした.今回は、orderに基づいて各日の口座金額を与える市場シミュレータを要求しました.
それ以外に、相応の投資案の各種パラメータを分析することができて、例えば日平均収益率など、時間の関係のためしていません.
この問題では、次のような明るいパスパラメータを使用する必要があります.
python marketsim.py 1000000 orders.csv values.csv
sysモジュールのargvを使用すればよい.
また、QSTKのcloseは実はAdjusted Closeであり、actual_closeはactual closeです.
ここでの調整は配当、株式分割などについて調整します.
プログラムの内容は次のとおりです.
import pandas as pd

import numpy as np

import math

import copy

import QSTK.qstkutil.qsdateutil as du

import datetime as dt

import QSTK.qstkutil.DataAccess as da

import QSTK.qstkutil.tsutil as tsu

import QSTK.qstkstudy.EventProfiler as ep





#get order

#sys.argv to get comman parameter

na_data = np.loadtxt('orders2.csv',dtype=np.str,delimiter=',')

#dtype={'names':('year','month','day','equity','buorsell','count'),    'formats':('i4','i4','i4','S5','S5','i4')},

na_dates=np.int_(na_data[:,0:3])

order=na_data[:,3:6]

ls_symbols=set(order[:,0])



#get equity price

dt_start = dt.datetime(2011, 1, 1)

dt_end = dt.datetime(2011, 12, 31)

ldt_timestamps = du.getNYSEdays(dt_start, dt_end, dt.timedelta(hours=16))



dataobj = da.DataAccess('Yahoo')



#why close?

#close for Adjusted Close ;actual_close for actual close

ls_keys = 'close'#['open', 'high', 'low', 'close', 'volume', 'actual_close']

ldf_data = dataobj.get_data(ldt_timestamps, ls_symbols, ls_keys)



#calc portfolio

currentCash=1000000

currentEquity=dict()

byOrSellDict={'Buy':1,'Sell':-1}



#dateInd=0

#currentDate=dt.datetime(na_dates[dateInd,0],na_dates[dateInd,1],na_dates[dateInd,2])+dt.timedelta(hours=16)

#orders=[dt.datetime(na_dates[dateInd,0],na_dates[dateInd,1],na_dates[dateInd,2])+dt.timedelta(hours=16),

#    [order[dateInd,0],order[dateInd,1],int(order[dateInd,2])] for dateInd in range(na_data.shape[0])]

orders={}

for dateInd in range(na_data.shape[0]):

    tmpDate=dt.datetime(na_dates[dateInd,0],na_dates[dateInd,1],na_dates[dateInd,2])+dt.timedelta(hours=16)

    if tmpDate in orders.keys():

        orders[tmpDate].append([order[dateInd,0],order[dateInd,1],int(order[dateInd,2])])

    else:orders[tmpDate]=[[order[dateInd,0],order[dateInd,1],int(order[dateInd,2])]]







for i in ldt_timestamps:

    if i in orders.keys():

        for singleOrder in orders[i]:

            equity=singleOrder[0]

            byOrSell=singleOrder[1]

            count=singleOrder[2]

            if equity in currentEquity.keys():

                currentEquity[equity]+=count*byOrSellDict[byOrSell]

            else:currentEquity[equity]=count*byOrSellDict[byOrSell]

            currentCash+=-ldf_data[equity][i]*count*byOrSellDict[byOrSell]

    

            print '----------------------',i,equity,byOrSell,count

            print currentEquity

            

            #dateInd+=1

            #currentDate=dt.datetime(na_dates[dateInd,0],na_dates[dateInd,1],na_dates[dateInd,2])+dt.timedelta(hours=16)

    

    #calc portfolia value

    portfValue=currentCash

    for tmpEqui in currentEquity.keys():

        portfValue+=ldf_data[tmpEqui][i]*currentEquity[tmpEqui]

    print i,portfValue

    


タイトル要求は:
Overview In this project you will create a basic market simulator that accepts trading orders and keeps track of a portfolio's value and saves it to a file. You will also create another program that assesses the performance of that portfolio. To Do Part 1: Create a market simulation tool, marketsim.py that takes a command line like this: python marketsim.py 1000000 orders.csv values.csv Where the number represents starting cash and orders.csv is a file of orders organized like this: Year Month Day Symbol BUY or SELL Number of Shares For example: 2008, 12, 3, AAPL, BUY, 130 2008, 12, 8, AAPL, SELL, 130 2008, 12, 5, IBM, BUY, 50 Your simulator should calculate the total value of the portfolio for each day using adjusted closing prices (cash plus value of equities) and print the result to the file values.csv. The contents of the values.csv file should look something like this: 2008, 12, 3, 1000000 2008, 12, 4, 1000010 2008, 12, 5, 1000250 ... Part 2: Create a portfolio analysis tool, analyze.py, that takes a command line like this: python analyze.py values.csv\$SPX The tool should read in the daily values (cumulative portfolio value) from values.csv and plot them. It should use the symbol on the command line as a benchmark for comparison (in this case $SPX). Using this information, analyze.py should: Plot the price history over the trading period. Your program should also output: Standard deviation of daily returns of the total portfolio Average daily return of the total portfolio Sharpe ratio (Always assume you have 252 trading days in an year. And risk free rate = 0) of the total portfolio Cumulative return of the total portfolio