成交分析
一条基本的交易记录包含以下几个部分:
- trade_code:交易标的
- trade_date:交易时间
- trade_price:单价
- trade_amount:成交数量
- trade_direction:交易方向(buy/sell)
- fee:成交手续费
根据成交记录,可以按照自己的分析方法得到交易结果,比如最基础的功能就是根据一组配对的buy与sell,得到本组交易的利润,其中:
收益 = 成交量 ∗ ( 卖出单价 − 买入单价 ) − ( 买入手续费 + 卖出手续费 ) 收益 = 成交量 * (卖出单价 - 买入单价) - (买入手续费+卖出手续费) 收益=成交量∗(卖出单价−买入单价)−(买入手续费+卖出手续费)
这里博主提供一种简单的方法,方便计算成交记录:
import pandas as pd
from loguru import logger
from copy import deepcopydef _reform_trade_detail(trade_df):"""结构化交易整合"""buy_hold_record_list = []history_trade_record = []trade_df = trade_df.sort_values(["trade_direction", "trade_date"]) # 买在上,卖在下for _record_info in trade_df.to_dict(orient="records"):buy_hold_record_list = [_ for _ in buy_hold_record_list if _ is not None]if _record_info['trade_direction'].strip() == "buy": # 记录买入buy_hold_record_list.append(_record_info)elif _record_info['trade_direction'].strip() == "sell": # 记录卖出del_buy_index = []for _buy_index, buy_record in enumerate(deepcopy(buy_hold_record_list)): # 循环每一个买入记录if buy_record['trade_code'] != _record_info['trade_code']:continue# 当前 buy_record 足够卖出trade_amount = min(_record_info['trade_amount'], buy_record['trade_amount']) # 当前撮合数量history_trade_record.append({"trade_code": _record_info['trade_code'], # 代码"buy_date": buy_record['trade_date'], # 买入时间"buy_price": buy_record['trade_price'], # 买入时均价"buy_fee": buy_record['fee'], # 买入手续费"sell_date": _record_info['trade_date'], # 卖出时间"sell_price": _record_info['trade_price'], # 卖出时价格"sell_fee": _record_info['fee'], # 卖出手续费"amount": trade_amount, # 交易数量# 收益 = 成交量 * (卖出单价 - 买入单价) - (买入手续费+卖出手续费)"trade_return": trade_amount * (_record_info['trade_price'] - buy_record['trade_price']) - (buy_record['fee'] + _record_info['fee']),})# 买单损耗buy_hold_record_list[_buy_index].update({"trade_amount": buy_hold_record_list[_buy_index]['trade_amount'] - trade_amount,})if buy_hold_record_list[_buy_index]["trade_amount"] == 0:del_buy_index.append(_buy_index)_record_info['trade_amount'] = _record_info['trade_amount'] - trade_amountif _record_info['trade_amount'] == 0:breakfor _del_i in del_buy_index: # 替换del_buy_index中的内容为空buy_hold_record_list[_del_i] = Noneelse:logger.error(f"交易没有方向! {_record_info}")return buy_hold_record_list, history_trade_record
示例程序
比如对于保存成文件的交易记录trade_info.csv
:
trade_code | trade_date | trade_price | trade_amount | trade_direction | fee |
---|---|---|---|---|---|
000001.SZ | 2022/8/10 | 12.06 | 1000 | buy | 0.2 |
000002.SZ | 2022/8/19 | 17.01 | 1000 | buy | 0.3 |
000001.SZ | 2022/9/1 | 12.61 | 2000 | buy | 0.5 |
000002.SZ | 2022/9/13 | 18.18 | 1000 | sell | 5.1 |
000004.SZ | 2022/9/15 | 9.82 | 500 | buy | 0.6 |
000002.SZ | 2022/9/22 | 9.82 | 1500 | sell | 5.05 |
000001.SZ | 2022/9/1 | 12.59 | 500 | sell | 5.01 |
import pandas as pdtrade_record = pd.read_csv("trade_info.csv")
buy_hold_record_list, history_trade_record = _reform_trade_detail(trade_record)
得到结果:
-
history_trade_record
:成交记录trade_code buy_date buy_price buy_fee sell_date sell_price sell_fee amount trade_return 0 000001.SZ 2022/8/10 12.06 0.2 2022/9/1 12.59 5.01 500 259.79 1 000002.SZ 2022/8/19 17.01 0.3 2022/9/13 18.18 5.1 1000 1164.6 -
buy_hold_record_list
:当前持仓情况trade_code trade_date trade_price trade_amount trade_direction fee 0 000001.SZ 2022/8/10 12.06 500 buy 0.2 1 000001.SZ 2022/9/1 12.61 2000 buy 0.5 2 000004.SZ 2022/9/15 9.82 500 buy 0.6
更多推荐
成交分析
发布评论