乔治理工大学计算投资公开课第五周作业 市场仿真器

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
原文地址:https://www.cnblogs.com/riskyer/p/3353202.html