交易中的胜率和盈亏比估算

本文探讨了交易中的胜率和盈亏比的概念,并通过Python代码模拟了不同胜率和盈亏比下交易的盈利情况。模拟结果显示,胜率和盈亏比对最终利润有显著影响,且随着交易次数的增加,结果更趋稳定。
摘要由CSDN通过智能技术生成

交易中的胜率和盈亏比估算

1.定义

胜率是指交易者在一定时间内成功交易的次数占总交易次数的比例。例如,如果交易者在10次交易中成功了6次,那么他的胜率就是60%。

盈亏比是指交易者每笔成功交易的盈利与每笔失败交易的亏损之间的比例。例如,如果交易者每笔成功交易盈利100元,而每笔失败交易亏损50元,那么他的盈亏比就是2:1。

2.计算逻辑

假设一个交易者在100次交易中的胜率为60%,盈亏比为2:1。模拟计算他的总盈利情况:

(1)确定交易者在100次交易中的成功次数和失败次数。根据胜率60%,成功次数为60次,失败次数为40次。
(2)计算每次成功交易和失败交易的盈亏情况。根据盈亏比2:1,每次成功交易盈利2单位,每次失败交易亏损1单位。
(3)将成功交易的盈利和失败交易的亏损相加,得到总盈利情况。即:60次成功交易×2单位盈利 - 40次失败交易×1单位亏损 = 120单位盈利 - 40单位亏损 = 80单位总盈利 。

3.简单模拟计算

实际交易中,胜率设为55%,盈亏比设为4:3,比较合理的范围。

代码:

import numpy as np  
import pandas as pd  
import random

#定义维度,交易数量
v_size = 1000  
# 定义概率分布 ,设置胜率 
probabilities = [0.45, 0.55]  
# 定义盈亏比 4:3 
v_win = 400.0
v_loss = -300.0
  
# 生成随机数组  
arr_probability = np.random.choice([0,1], size=v_size, p=probabilities, replace=True)  
  
# 将随机数组转换为pandas Series  
series_probability = pd.Series(arr_probability)  

df_profit = pd.DataFrame()
df_profit['probability'] = series_probability
  
# 使用numpy生成一个长度为v_size的数组,全部填充0.0,然后转换为Series  
series = pd.Series(np.zeros(v_size))  
# 增加profit 列  
df_profit['profit'] = series

i = 0 
# df遍历赋值,如果是1,盈利赋值,如果是0, 亏损赋值。
for index, row in df_profit.iterrows():  
    if  row['probability'] == 1 :
        df_profit.loc[i,'profit'] = random.uniform(0.0, v_win)  
  
    else :
        df_profit.loc[i,'profit'] = random.uniform(v_loss, 0.0)  
    i += 1
    
print('Profit: ',round(df_profit['profit'].sum(),2))
print('Win times: ',df_profit['probability'].sum())
print('Test times:',len(df_profit))

执行结果:

Profit:  51270.84
Win times:  583
Test times: 1000

交易次数:1000
盈利 51270.84 。
胜率是:58.3% 。
还是比较可观的。
当然,随着交易的次数增加,胜率会更接近55% 。

交易次数 :100000 。

Profit:  4283618.09
Win times:  55098
Test times: 100000

可以看到,胜率55.098% 。

4.模拟交易

上面的数据不容易看出投资本金,利润之间的关系。
将改进程序,更接近模拟交易过程,看看胜率和盈亏比对最终利润的影响。

import numpy as np  
import pandas as pd  
import random

#定义维度,交易数量
v_size = 100  
# 定义概率分布 ,设置胜率 
probabilities = [0.45, 0.55]  
# 定义盈亏比 4:3 
v_win = 400.0
v_loss = -300.0

# 初始资金
init_cash = 10000.0

# 手续费 万二
v_comm = 0.0002

# 当前现金 ,每次交易的仓位 
position = 0.6

# 生成随机数组  
arr_probability = np.random.choice([0,1], size=v_size, p=probabilities, replace=True)  
  
# 将随机数组转换为pandas Series  
series_probability = pd.Series(arr_probability)  

df_profit = pd.DataFrame()
df_profit['probability'] = series_probability
  
# 使用numpy生成一个长度为v_size的数组,全部填充0.0,然后转换为Series  
series = pd.Series(np.zeros(v_size))  

# 每次交易的利润,含参与交易的本金
df_profit['profit'] = series

# 每次交易的初始资金
df_profit['cash'] = series

# 每次的仓位值
df_profit['position'] = series

# 每次交易的佣金
df_profit['comm'] = series

i = 0 

# df遍历赋值,如果是1,盈利赋值,如果是0, 亏损赋值。
for index, row in df_profit.iterrows():  
    if  row['probability'] == 1 :

        # 如果是首次交易
        if i == 0 :
            df_profit.loc[i,'cash'] = init_cash
            df_profit.loc[i,'position'] = init_cash * position
            df_profit.loc[i,'profit'] = random.uniform(0.0, v_win) / 10000 * df_profit.loc[i,'position'] + df_profit.loc[i,'position'] # 盈利 
            df_profit.loc[i,'comm'] = abs(df_profit.loc[i,'profit']) * v_comm # 总是正值
            df_profit.loc[i,'profit'] = df_profit.loc[i,'profit'] - df_profit.loc[i,'comm']
            
        #非首次交易
        else :
            df_profit.loc[i,'cash'] = df_profit.loc[i-1,'cash'] - df_profit.loc[i-1,'position'] + df_profit.loc[i-1,'profit']
            df_profit.loc[i,'position'] = df_profit.loc[i,'cash'] * position
            df_profit.loc[i,'profit'] = random.uniform(0.0, v_win) / 10000 * df_profit.loc[i,'position'] + df_profit.loc[i,'position'] # 盈利 
            df_profit.loc[i,'comm'] = abs(df_profit.loc[i,'profit']) * v_comm # 总是正值
            df_profit.loc[i,'profit'] = df_profit.loc[i,'profit'] - df_profit.loc[i,'comm']
  
    else :
        
        # 如果是首次交易
        if i == 0 :
            df_profit.loc[i,'cash'] = init_cash
            df_profit.loc[i,'position'] = init_cash * position
            df_profit.loc[i,'profit'] = random.uniform(v_loss, 0.0) / 10000 * df_profit.loc[i,'position'] + df_profit.loc[i,'position'] # 亏损
            df_profit.loc[i,'comm'] = abs(df_profit.loc[i,'profit']) * v_comm # 总是正值
            df_profit.loc[i,'profit'] = df_profit.loc[i,'profit'] - df_profit.loc[i,'comm']

        #非首次交易    
        else :
            df_profit.loc[i,'cash'] = df_profit.loc[i-1,'cash'] - df_profit.loc[i-1,'position'] + df_profit.loc[i-1,'profit']
            df_profit.loc[i,'position'] = df_profit.loc[i,'cash'] * position
            df_profit.loc[i,'profit'] = random.uniform(v_loss, 0.0) / 10000 * df_profit.loc[i,'position'] + df_profit.loc[i,'position'] # 亏损
            df_profit.loc[i,'comm'] = abs(df_profit.loc[i,'profit']) * v_comm # 总是正值
            df_profit.loc[i,'profit'] = df_profit.loc[i,'profit'] - df_profit.loc[i,'comm']
        
    i += 1
    
#print('Profit: ',round(df_profit['profit'].sum(),2))
print('Win times: ',df_profit['probability'].sum())
print('Test times: ',len(df_profit))
print('Profit ratio %: ',round((df_profit.loc[v_size -1,'cash']/init_cash - 1)*100,2))
print('Last trade cash: ',round(df_profit.loc[v_size-1,'cash'],2))
print('Sum trade comm: ',round(df_profit['comm'].sum(),2))                                        
# df_profit

结果:

Win times:  48
Test times:  100
Profit ratio %:  7.52
Last trade cash:  10752.08
Sum trade comm:  120.04

如果把交易次数设置1000

Win times:  550
Test times:  1000
Profit ratio %:  965.35
Last trade cash:  106534.91
Sum trade comm:  3919.97
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值