要判定一个买卖系统的黑白,离不开对成交数据的分析,我们可以记录每一笔平仓单的盈亏,然后便可以分析其统计目标。 例如:
要计较平仓单的盈亏,需要在拜托单成交前先记录品种的持仓信息,拜托单成交后按照其成交价及持仓价格的变化来计较该笔拜托单的平仓盈亏。 我们用协程函数check_close_order来检查拜托单的成友谊况,并在拜托单成交后计较其相关数据,例如盈利点数、盈利金额、盈利率等,计较后的成果以列表发给协程函数close_order_log,由close_order_log将每一笔平仓单盈亏成果写入当地OrderCloseLog.csv文件。 与平仓单相对应的开仓价为理论计较值,例如残剩持仓为0时,原持仓的开仓均价即是平仓单对应的开仓价,若残剩持仓不为0,则持仓开仓均价变化的部分即是平仓单对应的开仓价,有了开仓价,再与平仓价作差即可计较盈亏。 平仓开释出的保证金,作为平仓前投入的资金,与盈亏金额做除计较盈利率。 我们用一个简单的示例,经过回测来记录一下平仓盈亏,买卖经过协程函数cta履行,持续开仓两笔,再持续平仓两笔,以期获得分歧的开仓价及平仓价,代码以下: #!/usr/bin/env python# -*- coding: utf-8 -*- import os, pandas from pathlib import Path from datetime import datetime, time, date from tqsdk import TqApi, TqAuth, TqAccount, TqChan,TqKq,TqSim, TqBacktest, BacktestFinished from tqsdk.ta import EMA from tqsdk.tafunc import time_to_str flog = os.getcwd()+"\logs" #法式地点目录下建立logs目录 print(flog) #输出记录途径 if os.path.isfile(flog) != True: p=Path(flog) p.mkdir(exist_ok=True) headk = ["品种", "多/空", "开仓价", "平仓价", "平仓手数", "盈利点数", "盈利金额","盈利点率","盈利额率","投入资金","信号位","备注","记录时候"] filecsv = flog+"\OrderCloseLog.csv" # 拜托单的成交记录 if os.path.isfile(filecsv) != True: h = pandas.DataFrame(index=[], columns=headk) h.to_csv(filecsv, index=False) async def close_order_log(chan): async for order_list in chan: # data = pandas.DataFrame([order_list],index=None,columns=headk) #天生pandas数据 data.to_csv(filecsv, index=False , header=False,mode="a+") #成交记录追加到当地 async def check_close_order(api, position, order, order_chan,signal_price=float('nan'),order_info='无'): if order.offset == "OPEN" :return #只处置平仓拜托 symbol = order.exchange_id +"."+order.instrument_id quote = api.get_quote(symbol) if order.direction == "BUY": direction = "空" pos0 = position.pos_short #原空头持仓手数 price0 = position.open_price_short #原空头开仓均价 margin0 = position.margin_short #原空头占用保证金 else : direction = "多" pos0 = position.pos_long #原多头持仓手数 price0 = position.open_price_long #原多头开仓均价 margin0 = position.margin_long #原多头占用保证金 async with api.register_update_notify() as update_chan: while order.status != "FINISHED" or (order.volume_orign - order.volume_left) != sum( [trade.volume for trade in order.trade_records.values()]): await update_chan.recv() else: volume = order.volume_orign - order.volume_left #已成比武数 if volume > 0: while (position.pos_long != position.volume_long or position.pos_short != position.volume_short or position.pos_long and position.open_price_long != position.open_price_long or position.pos_short and position.open_price_short != position.open_price_short or not position.pos_long and position.open_price_long == position.open_price_long or not position.pos_short and position.open_price_short == position.open_price_short): await update_chan.recv() if order.direction == "BUY": pos_c = position.pos_short #平仓后残剩空头手数 price_c =position.open_price_short #平仓后残剩空头开仓均价 else : pos_c = position.pos_long #平仓后残剩多头手数 price_c = position.open_price_long #平仓后残剩多头开仓均价 if pos_c > 0: price = (pos0*price0 - pos_c*price_c)/volume #被平仓的理论开仓均价 else :price = price0 if order.direction == "BUY": profit_count = price - order.trade_price #盈利点数 else: profit_count = order.trade_price - price margin_release = margin0*volume/pos0 #开释保证金,平仓开释的保证金为理论投入资金 profit_money = volume * profit_count * quote.volume_multiple #盈利金额 profit_percent = round(profit_money/margin_release,5) #盈利率 #成交记录 order_list = [symbol,direction,price,order.trade_price,volume,profit_count,profit_money,profit_percent, round(margin_release,2),signal_price,order_info,time_to_str(order.insert_date_time)] await order_chan.send(order_list) #把计较后的成果发送进来 async def cta(): buy,sell = 0,0 m,n = 1,1 async with api.register_update_notify() as update_chan: async for _ in update_chan: if api.is_changing(klines.iloc[-1],"datetime"): ema = EMA(klines,5) if klines.close.iloc[-1] > ema.iloc[-1].ema: if position.pos_short: #有空单凭空单 buy_close = api.insert_order('DCE.m2109','BUY','CLOSE',1,quote.ask_price1) signal_price = klines.close.iloc[-1] #信号位 order_info = f"第{m}次平" #拜托单增加备注 m += 1 buy_close_task = api.create_task(check_close_order(api,position,buy_close,chan,signal_price,order_info)) #检查拜托单 await buy_close_task #期待成交完成 if not position.pos_short: buy,m = 0,1 elif buy < 2:#开多单2笔 buy_open = api.insert_order('DCE.m2109','BUY','OPEN',1,quote.ask_price1) buy += 1 elif klines.close.iloc[-1] < ema.iloc[-1].ema: if position.pos_long: sell_close = api.insert_order('DCE.m2109','SELL','CLOSE',1,quote.bid_price1) signal_price = klines.close.iloc[-1] #信号位 order_info = f"第{n}次平" n += 1 sell_close_task = api.create_task(check_close_order(api,position,sell_close,chan,signal_price,order_info)) await sell_close_task if not position.pos_long: sell,n = 0,1 elif sell < 2: sell_open = api.insert_order('DCE.m2109','SELL','OPEN',1,quote.bid_price1) sell += 1 sim = TqSim() api = TqApi(account=sim,auth=TqAuth("信易账号","密码"),backtest=TqBacktest(start_dt=date(2021,1,10), end_dt=date(2021, 1, 20))) # 获得 m2109 盘口的援用 quote = api.get_quote("DCE.m2109") # 获得 m2109 持仓的援用 position = api.get_position("DCE.m2109") # 获得 m2109 5分钟K线的援用 klines = api.get_kline_serial("DCE.m2109", 5*60) chan = TqChan(api) #建立TqChan api.create_task(close_order_log(chan=chan)) #建立保存成交记录Task api.create_task(cta()) #建立战略使命Task try: while True: api.wait_update() except BacktestFinished : print(sim.trade_log) # 回测的具体信息 print(sim.tqsdk_stat) # 回测时候内账户买卖信息统计成果,其中包括以下字段 while True : api.wait_update() 我们为平仓单增加了一个order_info,以实现某些情形下的需求,比如分批止盈的战略,能够需要分类统计分歧批次下的盈利表示。 平仓记录OrderCloseLog.csv结果以下: 与回测开平成交记录像分歧: 有了这个平仓记录,我们便可以分析其统计目标了,间接用pandas读取文件到DataFrame,再利用pandas函数计较,以下是几个常用的分析目标计较: #!/usr/bin/env python# -*- coding: utf-8 -*- import pandas import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] mpl.rcParams['axes.unicode_minus'] = False datas = pandas.read_csv(r"E:\ProgramData\Python38\Lib\site-packages\logs\OrderCloseLog.csv") profit = datas[datas["盈利点数"] > 0] #取出盈利数据 profit_buy = profit[profit["多/空"] == "多"] #取出多头盈利 profit_sell = profit[profit["多/空"] == "空"] #取出空头盈利 loss = datas[datas["盈利点数"] <= 0] #取出吃亏数据 loss_buy = loss[loss["多/空"] == "多"] #取出多头吃亏 loss_sell = loss[loss["多/空"] == "空"] #取出空头吃亏 print(profit,loss,sep="\n") print(profit.describe(),loss.describe(),sep="\n") #输出盈利和吃亏统计信息 print("胜率",len(profit)/len(datas),"均匀盈利率",profit["盈利额率"].mean(),"均匀吃亏率",loss["盈利额率"].mean()) print("盈亏额比例",abs(profit["盈利金额"].sum()/loss["盈利金额"].sum()),"均匀盈亏额比例",abs(profit["盈利金额"].mean()/loss["盈利金额"].mean())) mean5 = [] count_mean5 = [] for i in datas["盈利点数"].rolling(5): mean5.APPend(len(i[i > 0])/len(i)) #5日均匀胜率 if list(i[i > 0]): count_mean5.append(i[i > 0].mean()) #5日均匀盈利点数 else:count_mean5.append(0.0) win_rate5 = pandas.Series(mean5,name="5日胜率") profit_count_mean5 = pandas.Series(count_mean5,name="5日均匀盈利点数") print("5日胜率均值",win_rate5.mean(),"5日胜率标准差",win_rate5.std()) print("5日均匀盈利点数均值",profit_count_mean5.mean(),"5日均匀盈利点数标准差",profit_count_mean5.std()) figure, ax = plt.subplots(2,1) #绘图 win_rate5.plot(figure=figure, ax=ax[0], title="5日胜率") profit_count_mean5.plot(figure=figure, ax=ax[1], title="5日均匀盈利点数") plt.show() ''' 输出成果以下: 品种 多/空 开仓价 平仓价 平仓手数 盈利点数 盈利金额 盈利率 投入资金 备注 拜托时候 16 DCE.m2109 空 3612.0 3609.0 1 3.0 30.0 0.01676 1790.5 第1次平 2021-01-11 14:35:00.000000 17 DCE.m2109 空 3612.0 3610.0 1 2.0 20.0 0.01117 1790.5 第2次平 2021-01-11 14:40:00.000000 18 DCE.m2109 多 3614.0 3631.0 1 17.0 170.0 0.09495 1790.5 第1次平 2021-01-11 21:40:00.000000 19 DCE.m2109 多 3614.0 3637.0 1 23.0 230.0 0.12846 1790.5 第2次平 2021-01-11 21:45:00.000000 38 DCE.m2109 多 3622.0 3625.0 1 3.0 30.0 0.01676 1790.5 第1次平 2021-01-12 21:20:00.000000 .. ... .. ... ... ... ... ... ... ... ... ... 130 DCE.m2109 空 3659.0 3574.0 1 85.0 850.0 0.47473 1790.5 第2次平 2021-01-20 09:50:00.000000 133 DCE.m2109 空 3560.0 3556.0 1 4.0 40.0 0.02234 1790.5 第1次平 2021-01-20 11:15:00.000000 134 DCE.m2109 空 3560.0 3555.0 1 5.0 50.0 0.02793 1790.5 第2次平 2021-01-20 11:20:00.000000 135 DCE.m2109 多 3543.5 3547.0 1 3.5 35.0 0.01955 1790.5 第1次平 2021-01-20 14:40:00.000000 136 DCE.m2109 多 3543.5 3546.0 1 2.5 25.0 0.01396 1790.5 第2次平 2021-01-20 14:45:00.000000 品种 多/空 开仓价 平仓价 平仓手数 盈利点数 盈利金额 盈利率 投入资金 备注 拜托时候 0 DCE.m2109 多 3586.0 3573.0 1 -13.0 -130.0 -0.07261 1790.5 第1次平 2021-01-08 21:10:00.000000 1 DCE.m2109 多 3586.0 3565.0 1 -21.0 -210.0 -0.11729 1790.5 第2次平 2021-01-08 21:30:00.000000 2 DCE.m2109 空 3565.5 3575.0 1 -9.5 -95.0 -0.05306 1790.5 第1次平 2021-01-08 21:50:00.000000 3 DCE.m2109 空 3565.5 3573.0 1 -7.5 -75.0 -0.04189 1790.5 第2次平 2021-01-08 22:10:00.000000 4 DCE.m2109 多 3577.0 3570.0 1 -7.0 -70.0 -0.03910 1790.5 第1次平 2021-01-08 22:20:00.000000 .. ... .. ... ... ... ... ... ... ... ... ... 123 DCE.m2109 多 3685.5 3683.0 1 -2.5 -25.0 -0.01396 1790.5 第1次平 2021-01-19 14:50:00.000000 127 DCE.m2109 多 3677.0 3671.0 1 -6.0 -60.0 -0.03351 1790.5 第1次平 2021-01-19 22:30:00.000000 128 DCE.m2109 多 3677.0 3671.0 1 -6.0 -60.0 -0.03351 1790.5 第2次平 2021-01-19 22:35:00.000000 131 DCE.m2109 多 3580.5 3568.0 1 -12.5 -125.0 -0.06981 1790.5 第1次平 2021-01-20 10:10:00.000000 132 DCE.m2109 多 3580.5 3567.0 1 -13.5 -135.0 -0.07540 1790.5 第2次平 2021-01-20 10:30:00.000000 [104 rows x 11 columns] 开仓价 平仓价 平仓手数 盈利点数 盈利金额 盈利率 投入资金 count 33.000000 33.000000 33.0 33.000000 33.000000 33.000000 33.0 mean 3681.257576 3675.606061 1.0 12.439394 124.393939 0.069475 1790.5 std 69.476179 72.963578 0.0 20.336143 203.361430 0.113579 0.0 min 3543.500000 3546.000000 1.0 0.500000 5.000000 0.002790 1790.5 25% 3622.000000 3625.000000 1.0 2.500000 25.000000 0.013960 1790.5 50% 3701.500000 3690.000000 1.0 5.000000 50.000000 0.027930 1790.5 75% 3740.500000 3735.000000 1.0 16.000000 160.000000 0.089360 1790.5 max 3771.500000 3778.000000 1.0 87.000000 870.000000 0.485900 1790.5 开仓价 平仓价 平仓手数 盈利点数 盈利金额 盈利率 投入资金 count 104.000000 104.000000 104.0 104.000000 104.000000 104.000000 104.0 mean 3678.370192 3679.730769 1.0 -8.937500 -89.375000 -0.049918 1790.5 std 58.480268 58.032336 0.0 11.611362 116.113619 0.064850 0.0 min 3565.500000 3565.000000 1.0 -99.500000 -995.000000 -0.555710 1790.5 25% 3619.750000 3617.000000 1.0 -9.125000 -91.250000 -0.050967 1790.5 50% 3687.250000 3688.000000 1.0 -6.500000 -65.000000 -0.036300 1790.5 75% 3728.250000 3728.250000 1.0 -4.500000 -45.000000 -0.025130 1790.5 max 3771.500000 3769.000000 1.0 0.000000 0.000000 0.000000 1790.5 胜率 0.24087591240875914 均匀盈利率 0.06947545454545455 均匀吃亏率 -0.04991769230769231 盈亏额比例 0.44163528778913397 均匀盈亏额比例 1.39182030091121 5日胜率均值 0.22627737226277372 5日胜率标准差 0.2336633050908623 5日均匀盈利点数均值 6.981751824817518 5日均匀盈利点数标准差 13.814272375154243 ''' 经过标准差std可知,盈亏的波动比力大,胜率也低,最大吃亏min阔别均匀吃亏mean,说明存在较大肥尾风险, 胜率用总盈利次数除以总买卖次数不敷以反应系统符合市场各个时段的稳定性,我们可以计较5日均匀胜率,按照5日胜率的变化可判定系统随着市场变化所具有的顺应性,5日盈利波动图以下: 从图形来看,胜率较不服稳,胜率标准差也大,说明系统对市场的顺应性差,上述买卖系统简直不是个好系统。 其他更多分析目标大师可按照需求自行计较。 下篇文章先容连系胜率、盈利率和凯利公式做资金治理。 |
投资有风险,入市须谨慎所有分享都是我个人心得记录,极有可能存在我自己的偏见和错误
文章背景做了这么久自媒体,后台经常有网友提问,某某小区好不好,其实实地调研一下,
“法拍房”的成交价格通常低于市场价,从而一度成为购房人“捡漏”的优质资产。不过,
请您点击右上角红字“关注”我,非常感谢!要做好销售都是:做——学习——做——总结
哈喽,大家好,我是袁先生。今天和大家讲解下抖音的基础数据,让新手小白朋友们能够看
近年来,关于房贷断供潮、法拍房“暴增”的消息,不断吸引人们的关注。阿里拍卖的数据
其实两者是完全不同的两个概念呢,换手率表现的是市场投资者的参与度,而成交量表现的
大家好,我是坤龙。今天我想和大家一起分享:企业如何快速成交,能让顾客抢着成交的秘
随着移动互联网十年红利期的结束,线上流量成本越来越贵,许多企业纷纷将线上业务转移
給大家分享7种实用的成交法,结合误区和注意事项,提炼了21种话术供你参考,相信你
要判断一个交易系统的好坏,离不开对成交数据的分析,我们可以记录每一笔平仓单的盈亏
关注【坤龙老师】头条号,每天收获最实用的新媒体营销干货。温馨提示:文末有福利假如
2017 年马云在某次年会演讲中提到一件让他惊讶的事情。在西湖边上他曾看到乞丐在用支
人人都说店铺成交率特别重要,今天我们就来仔细拆解一下成交率该怎么做:零售基础公式
电商数据分析指标体系分为八大类指标:总体运营指标网站流量累指标销售转化指标客户价
编辑导语:在做B端业务时,很多时候都需要跟用户打交道,在跟用户进行沟通的时候,我
羲之文化民藏真品线上拍卖会第六期又如期而至,所有上拍藏品均通过平台民藏真品征选流
社会日新月异,各种新型产业每隔一段时间便闯入人们视野,不断冲击社会产业结构,更冲
“超亿元”“大折扣”的法拍房往往能赚取不少的流量,尽管法拍房关注度有所提高,但是
为什么一些人的销售业绩,是另一些人的2倍、3倍、甚至是10倍?经过不断研究实践,我发
声明:本站内容由网友分享或转载自互联网公开发布的内容,如有侵权请反馈到邮箱 1415941@qq.com,我们会在3个工作日内删除,加急删除请添加站长微信:15314649589
Copyright @ 2022-2044 杭州共生网络 www.gongshengyun.cn Powered by Discuz!