python实现证券量化策略回测平台的模拟交易功能

如题python实现证券量化策略回测平台的模拟交易功能

20200114写了份作业,以下是需要作业需要完成的功能:

采用面向对象程序设计的思想,设计并完成证券量化策略回测平台的模拟交易功能:
设计交易账户,在创建之初指定初始资产;
根据策略产生的交易指令(见指令文档)和当天的市场行情数据,进行买入、卖出操作,
记录每条交易记录的详细信息
(交易日期、交易类型、标的、价格、数量、佣金、契税、总费用),
能以一个文件形式进行输出;
能记录并输出账户每日证券市值、剩余现金、总资产。
用到的库文件

pandas库、numpy库、csv库。

读入文件就用了pandas库的read_csv函数,pd.read_csv(‘文件路径’)就可以读取文件:

dt = pd.read_csv('../ldays/2016-01-04.csv')

要输出文件我是在其他大佬的博客上面学到的:
具体格式如下,其中writerow的意思是输出的时候有四列(ABCD),第一个open函数里面newline=""的意思就是输出的时候不要多输出一行新的行,删掉这个就会发现你输出的东西是间隔一行写的。而且有时候需要在open里面加一个参数(encoding=“utf8”,具体的解码方式按照具体情况,用不用也要看当时的电脑环境,我用了输出的东西反倒是乱码)

f = open('x.csv', 'w', newline="")
mr = csv.writer(f)
mr.writerow(["A", "B", "C", "D"])

在python类里面新建一个对象初始化要用固定的__init__()函数:

def __init__(self, num):  # 初始化账户金额
        self.remainingCash = num

而且类里面的所有函数如果用到了类里面的成员变量,都必须加一个self变量,就跟上面的初始化一样,写在最前面,不过最后每个函数都这么写叭,免得忘记了又不知道哪里出了问题。

上学期学了c++,里面的this指针感觉跟这个self有一些共同之处,有兴趣的可以去了解一下。

按照功能的不同,我设计了三个类:

  • class taccount(个人账户)
  • class torder(交易指令)
  • class istocks(查询个股)
class taccount:
    remainingCash = 1000000
    def __init__(self, num):  # 初始化账户金额
        self.remainingCash = num
    def buy(self, day, code, amount):  # 买入
    def sell(self, day, code):  # 卖出
    def marketvalue(self, day):
    def total(self, day):

买卖的函数都在account类里面,day就是买入的时间,code就股票代码,amount就是数量。具体函数如下:

def buy(self, day, code, amount):
        for iNum in range(self.numLen):
            if (self.code[iNum] == code):
                shares = findprice(day, code)
                turnover = shares * amount
                commission = max(5, turnover * 0.0003)
                self.rCash -= (turnover + commission)
                self.num[iNum] += amount
                information.writerow \
                    ([day, "BUY", code, shares, amount, commission, 0, commission])
                break
        return

def sell(self, day, code):
    for iNum in range(self.numLen):
        if self.code[iNum] == code:
            if self.num[iNum] == 0:
                return
            shares = findprice(day, code)
            turnover = self.num[iNum] * shares
            commission = max(5, turnover * 0.0003)
            stampDuty = 0.001 * turnover
            self.rCash += (turnover - commission - stampDuty)
            self.num[iNum] = 0
            information.writerow([day, "SELL", code, shares, amount, commission, stampDuty, commission + stampDuty])
            break
    return

emmm还有一个就是我在读取每日股票价格的时候用到的方法:

#查询当日股价的函数
def findprice(self, day, name1):
        filename = '../ldays/' + day + '.csv'
        #先把文件名用python自带的字符串拼接方式拼好然后再读取
        info = pd.read_csv(filename)
        for i in range(info.__len__()):
            if info['ts_code'][i] == name1:
                return info['close_adj'][i]

想到什么再补充什么把
有问题可以发送邮件交流讨论
gan88588@163.com

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值