美文网首页
先进先出匹配交易

先进先出匹配交易

作者: 黄yy家的jby | 来源:发表于2023-10-11 13:49 被阅读0次


class Item(object):
    """单笔交易对象,存储购买日期和数量 可能是买入也可能是卖出"""
    def __init__(self, time, num):

        if type(time) is int or type(time) is str:
            self.time = datetime.datetime.strptime(str(time),'%Y%m%d')
        else:
            self.time = time

        if type(num) is str:
            self.num = int(num)
        else:
            self.num = num


class Position(object):
    """头寸对象,存储某人员对于某股票的全部头寸 以队列模式先进先出"""
    def __init__(self, stock_name, person_name):
        self.items = []
        self.stock_name = stock_name
        self.person_name = person_name

    def is_empty(self):
        return self.items == []

    def buy(self, item):
        """有买入则在items列表里追加此次交易记录"""
        self.items.append(item)

    def sell(self, item, limit):
        """根据卖出的交易记录更新本头寸 返回可能存在的相关交易信息(以元组的列表返回)"""
        related = []
        # 首次记录先是卖的,则pass
        if len(self.items) == 0 :
            return related
        else:
            # 不断根据卖出数量抵消买入记录,时间最久远的先被抵消,完全抵消后离开队列,卖出数量抵完为止
            while item.num > 0:
                # 判断此次抵消的买入记录是否和卖出记录的日期差≤limit天
                if (item.time.date() - self.items[0].time.date()).days <= limit:
                    # 发现相关交易,将相关信息打包为元组,放入列表related
                    info = (self.person_name, self.stock_name, self.items[0].time,
                            self.items[0].num,
                            item.time,
                            min(item.num,self.items[0].num),
                            (item.time.date() - self.items[0].time.date()).days)
                    related.append(info)
                # 判断最远的一次买入是否能完全抵消剩余卖出数量(临界值稍微注意,和不能一样也需要删除队列头)
                if item.num >= self.items[0].num:
                    # 不能,则先用最远的买入抵消部分卖出,剩余的卖出数量继续被后面的买入抵消
                    item.num -= self.items[0].num
                    # 最远的买入记录离开队列,循环继续
                    del (self.items[0])
                    if len(self.items) == 0:  # 如果卖的比买的多,直接跳出循环
                        return related
                else:
                    # 能,则最远的买入记录完全消化剩余卖出数量,并留有余量,下一次循环会停止
                    self.items[0].num -= item.num
                    item.num = 0
            return related



def FIFO(df,col_people,col_stock,col_time,col_num,col_type,limit=1e4):
    df = df.sort_values(by=col_time)

    # dic 以人员,股票为索引存储所有头寸的字典
    dic = {}
    relate = []
    for row in df.iterrows():
        name = row[1][col_people]
        date = row[1][col_time]
        stock = row[1][col_stock]
        num = row[1][col_num]
        type = row[1][col_type]

        index = name + ','+stock
        if index not in dic:
            dic[index] = Position(person_name=name, stock_name=stock)

        if type == '买入':
            dic[index].buy(Item(date, num))

        else:
            #卖出交易返回信息
            relate += (dic[index].sell(Item(date,num),limit))
        print(name,date,stock,type)
    result = pd.DataFrame(relate)
    result.columns = ['PERSON','INSTRUMENT_CODE','BUY_TIME','BUY_VOLUME_CUMSUM','SELL_TIME','SELL_VOLUME','INTERVAL_DAYS']
    return result

相关文章

  • 先进先出

    关于库房护套“先进先出”问题的一点不成熟的想法 1、库管员收货时核对护套日期,确保是同一批次日期; 2、上货时与库...

  • 交易系统必须匹配交易心理

    真正赚钱的高手不是因为趋势判断对、智慧高,多数是因为知道自己该什么时候重仓,押注多大仓位而能保持理智。 交易心理非...

  • ICA亚投链交易流程

    交易中心(挂单)→买入/卖出→填写数量和交易密码→确认→ →返回首页→我的交易→已匹配→查看卖家支付宝并上传凭证→...

  • 短线交易如何做到稳定盈利?

    主要是操作的交易周期不匹配。你操作的周期是多长时间的?你的盈利空间大小是不是与你交易的周期相匹配? 有的人操作选择...

  • 二进制交易的 成功发十条经验总结

    笔者认为交易规则要和交易经验相匹配才能发挥最大的效应;比如交易者学习了二进制交易规则后,在应用本规则所产生的交易经...

  • 掌握这几个方客源匹配技巧,业绩提升85%不是梦

    二手房交易中,房源获取速度以及匹配效果是中介竞争的关键,匹配的目的直接形成带看,所以掌握房源匹配的能力是一项很重...

  • 14.1 DateTime Management

    跨时区交易可能存在不同时区交易时间的不一致匹配问题,如在CET时区的交易员交易美国西部的标的,由于美国存在夏令和东...

  • Java-在switch中使用枚举类

    1. 应用场景场景描述: 项目重构,要匹配交易类型处理数据.交易类型的字段类型为String,最初是在switch...

  • EOS原力4月第4周开发周报

    EOSFORCE 开发周报 中文 本周工作 FORCEIO跨链交易合约匹配逻辑优化 修正FORCEIO跨链测试发现...

  • 先进先出——队列(Queue)

    队列的抽象数据类型描述: 类型名称:队列(Queue) 数据对象集: 一个用 0 个或多个元素的又穷线性表。 操作...

网友评论

      本文标题:先进先出匹配交易

      本文链接:https://www.haomeiwen.com/subject/csogbdtx.html