zoukankan      html  css  js  c++  java
  • 乔治理工大学计算投资公开课第五周作业 市场仿真器

    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
  • 相关阅读:
    jQuery实现返回顶部
    css position全解析
    css选择器优先级全解析
    java算法(二)
    java实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
    用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
    java输出任意两个日期之间有多少天
    假如现在有一堆长度大于3小于9的电话号码,用座机呼叫,如果出现这样的号码【123和12345】那么12345将永远不会被拨出,因为拨到123的时候电话已经呼出了,试写一个函数输出所有不能被呼出的电话号码(java实现)
    解如下方程(java实现)
    统计第一个空字符前面的字符长度(java实现)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3353202.html
Copyright © 2011-2022 走看看