Home >  > 刑不行笔记二

刑不行笔记二

0

备注:
09pandas基础(下)
10择时策略框架(一)(上) 已经完成
......
25 已经完成
Feb-23-2020 全部学完。

一、资源

1.计算指标(第20课)
年化收益 = pow(总收益,365/天数)
2.pandas (花1.5小时即可学完)
查看pandas所有函数:https://pandas.pydata.org/pandas-docs/stable/reference/index.html

二、双均线策略回测

1# =====计算实际资金曲线(实际方法)
2df = df[['交易日期', '股票代码', '开盘价', '最高价', '最低价', '收盘价', '涨跌幅', 'pos']]
3df.reset_index(inplace=True, drop=True)
4 
5# ===设定参数
6initial_money = 1000000  # 初始资金,默认为1000000元
7slippage = 0.01  # 滑点,默认为0.01元
8c_rate = 5.0 / 10000  # 手续费,commission fees,默认为万分之5
9t_rate = 1.0 / 1000  # 印花税,tax,默认为千分之1
10 
11# ===第一天的情况
12df.at[0, 'hold_num'] = 0  # 持有股票数量,此处也可用loc,但是定位单个元素at效率更高。
13df.at[0, 'stock_value'] = 0  # 持仓股票市值
14df.at[0, 'actual_pos'] = 0  # 每日的实际仓位
15df.at[0, 'cash'] = initial_money  # 持有现金现金
16df.at[0, 'equity'] = initial_money  # 总资产 = 持仓股票市值 + 现金
17# print df[['交易日期', '开盘价', 'pos', 'hold_num', 'stock_value', 'actual_pos', 'cash', 'equity']]
18 
19# ===第一天之后每天的情况
20# 从第二行开始,逐行遍历,逐行计算
21for i in range(1, df.shape[0]):
22 
23    # 前一天持有的股票的数量
24    hold_num = df.at[i - 1, 'hold_num']
25 
26    # 判断当天是否除权,若发生除权,需要调整hold_num
27    # 若当天通过收盘价计算出的涨跌幅,和当天实际涨跌幅不同,说明当天发生了除权
28    if abs((df.at[i, '收盘价'] / df.at[i-1, '收盘价'] - 1) - df.at[i, '涨跌幅']) > 0.001:
29        stock_value = df.at[i - 1, 'stock_value']
30        # 交易所会公布除权之后的价格
31        last_price = df.at[i, '收盘价'] / (df.at[i, '涨跌幅'] + 1)
32        hold_num = stock_value / last_price
33        hold_num = int(hold_num)
34        # if i > 1030:
35        #     print stock_value, last_price, hold_num
36        #     print df.iloc[1034:][['交易日期', '收盘价', '涨跌幅', 'pos', 'hold_num', 'cash', 'stock_value']]
37 
38    # 判断是否需要调整仓位:拿今天的仓位pos,和昨天的仓位pos进行比较,看是否相同
39    # 需要调整仓位
40    if df.at[i, 'pos'] != df.at[i - 1, 'pos']:
41 
42        # 对于需要调整到的仓位,需要买入多少股票
43        # 昨天的总资产 * 今天的仓位 / 今天的收盘价,得到需要持有的股票数
44        theory_num = df.at[i - 1, 'equity'] * df.at[i, 'pos'] / df.at[i, '开盘价']
45        # 对需要持有的股票数取整
46        theory_num = int(theory_num)  # 向下取整数,向上取整会出现钱不够的情况
47 
48        # 将theory_num和昨天持有股票相比较,判断加仓还是减仓
49        # 加仓
50        if theory_num >= hold_num:
51            # 计算实际需要买入的股票数量
52            buy_num = theory_num - hold_num
53            # 买入股票只能整百,对buy_num进行向下取整百
54            buy_num = int(buy_num / 100) * 100
55 
56            # 计算买入股票花去的现金
57            buy_cash = buy_num * (df.at[i, '开盘价'] + slippage)
58            # 计算买入股票花去的手续费,并保留2位小数
59            commission = round(buy_cash * c_rate, 2)
60            # 不足5元按5元收
61            if commission < 5 and commission != 0:
62                commission = 5
63            df.at[i, '手续费'] = commission
64 
65            # 计算当天收盘时持有股票的数量和现金
66            df.at[i, 'hold_num'] = hold_num + buy_num  # 持有股票,昨天持有的股票,加上今天买入的股票
67            df.at[i, 'cash'] = df.at[i - 1, 'cash'] - buy_cash - commission  # 剩余现金
68            # print df[['交易日期', '开盘价', 'pos', 'hold_num', 'cash', '手续费']]
69            # exit()
70 
71        # 减仓
72        else:
73            # 计算卖出股票数量,卖出股票可以不是整数,不需要取整百。
74            sell_num = hold_num - theory_num
75 
76            # 计算卖出股票得到的现金
77            sell_cash = sell_num * (df.at[i, '开盘价'] - slippage)
78            # 计算手续费,不足5元按5元收,并保留2位小数
79            commission = round(max(sell_cash * c_rate, 5), 2)
80            df.at[i, '手续费'] = commission
81            # 计算印花税,保留2位小数。历史上有段时间,买入也会收取印花税
82            tax = round(sell_cash * t_rate, 2)
83            df.at[i, '印花税'] = tax
84 
85            # 计算当天收盘时持有股票的数量和现金
86            df.at[i, 'hold_num'] = hold_num - sell_num  # 持有股票
87            df.at[i, 'cash'] = df.at[i - 1, 'cash'] + sell_cash - commission - tax  # 剩余现金
88            # print df.iloc[50:100][['交易日期', '开盘价', 'pos', 'hold_num', 'cash', '手续费', '印花税']]
89 
90    # 不需要调仓
91    else:
92        # 计算当天收盘时持有股票的数量和现金
93        df.at[i, 'hold_num'] = hold_num  # 持有股票
94        df.at[i, 'cash'] = df.at[i - 1, 'cash']  # 剩余现金。此处的cash可以乘以余额宝的收益率。
95        # print df[['交易日期', 'pos', 'hold_num', 'cash']]
96 
97    # 以上的计算得到每天的hold_num和cash
98    # 计算当天收盘时的各种资产数据
99    df.at[i, 'stock_value'] = df.at[i, 'hold_num'] * df.at[i, '收盘价']  # 股票市值
100    df.at[i, 'equity'] = df.at[i, 'cash'] + df.at[i, 'stock_value']  # 总资产
101    df.at[i, 'actual_pos'] = df.at[i, 'stock_value'] / df.at[i, 'equity']  # 实际仓位
102 
103# print df[['交易日期', 'pos', 'cash', 'stock_value', 'equity', 'actual_pos']]
104 
105 
106df = df[['交易日期', '收盘价', 'pos', 'hold_num', 'cash', 'stock_value', 'equity', 'actual_pos', '手续费', '印花税']]
107print df
108 
109# print df[['手续费', '印花税']].sum()

暧昧帖

本文暂无标签

发表评论

*

*