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


    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
  • 相关阅读:
    [MySql]insert...select 8/10
    秀出Administrator帳戶6/27
    Love
    讀取Gridview的隱藏欄8/22
    水晶報表公式換行8/2
    MySql.Data.MySqlClient.MySqlException 7/9
    mysql的錯誤日誌爆满7/24
    从汇编看c++中的const常量
    可见性和生命期的区别
    比较烦
  • 原文地址:https://www.cnblogs.com/riskyer/p/3353202.html
Copyright © 2020-2023  润新知