乔治理工大学计算投资公开课第五周作业 市场仿真器
2013-10-06 03:27
417 查看
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
相关文章推荐
- 佐治亚理工学院 计算投资公开课第五周作业 市场仿真器
- 佐治亚理工学院 计算投资公开课第六周作业 投资策略分析平台
- 佐治亚理工学院 计算投资公开课第六周作业 投资策略分析平台
- 第五周 北理公开课的编程作业题
- 菜鸟之路【计算导论与C基础】练习1 计算概论第五周 B-04作业
- coursera 中计算概论的第五周 B-04作业
- 第五周项目(4)计算函数值并输出
- 料件库位各期异动统计量计算作业(aimp620)
- Haskell作业1(1)|实现分数的常用运算(2)|计算平方根的Newton-Raphson公式
- Ng机器学习课程第五周神经网络反向传播算法课后作业初学者的理解
- 第二次作业:search.csdn.net 改版产品市场说明书
- 结课作业:云计算在物联网中的应用发展
- 北大程序设计实习公开课编程作业,魔兽世界之二:装备
- 第五周项目二(3)计算工资
- Linux内核分析作业第五周
- Python入门学习第五周:字符串·作业
- 第五周作业——Dijkstra算法的实现
- 第五周作业——1有向图邻接表表示及反向图构造
- 第五周作业——有向图邻接表表示及反向图构造
- 第二次作业计算题