一、前言
在上一篇中[策略篇]股票炸板+资金流策略_年化收益_ 88.42% 最大回撤 _-29.20%, (df['收盘价'] > df['13日均线'])其实是犯了新手经常出现的错误,应该是: (df['收盘价_复权'] > df['13日均线']),在计算均线时无论用的前复权或者后复权,对结果不会有影响。
二、描述
事件名称:炸板策略
最大持股数:2(多个票发生事件,根据排序选最前的两个票)
持有周期:2天(事件发生后下个交易日早盘买进,次日尾盘卖出)
资金份数:2份
回测时间周期:2009-01-01至2023-08-04
排序因子:中户资金买入占比
排序方向:False(降序)
三、策略代码
3.1、事件生成代码
import pandas as pd
from datetime import datetime
from multiprocessing import cpu_count
from joblib import Parallel, delayed
from program.Config import *
from program.Function import *
from tqdm import tqdm
import warnings
from program.计算涨跌停价格 import *
warnings.filterwarnings("ignore")
import warnings
warnings.filterwarnings('ignore')
pd.set_option('max_rows', None) # 显示最多行数
pd.set_option('max_columns', None) # 显示最多列数
pd.set_option('expand_frame_repr', False) # 当列太多时显示不清楚
pd.set_option('display.unicode.east_asian_width', True) # 设置输出右对齐
# *************************************************** 调参数 ***************************************************
# stock_data_path = os.path.join(root_path, 'data/trade_data/stock/') # 确认股票数据路径
stock_data_path = 'G:\\股票数据\\股票历史全息日线数据\\' # 确认股票数据路径
cols = ['散户资金买入额', '中户资金买入额', '大户资金买入额', '机构资金买入额',
'散户资金卖出额', '中户资金卖出额', '大户资金卖出额', '机构资金卖出额']
colsB = ['散户资金买入额', '中户资金买入额', '大户资金买入额', '机构资金买入额']
colsS = ['散户资金卖出额', '中户资金卖出额', '大户资金卖出额', '机构资金卖出额']
# *************************************************** 调参数 ***************************************************
def cal_money_flow_event_each_stock(code):
path = stock_data_path + '%s.csv' % code # 读入股票数据
print(code)
df = pd.read_csv(path, skiprows=1, parse_dates=['交易日期'], encoding='gbk')
df.sort_values('交易日期', inplace=True)
df['涨跌幅'] = df['收盘价'] / df['前收盘价'] - 1
df['复权因子'] = (df['收盘价'] / df['前收盘价']).cumprod()
df['收盘价_复权'] = df['复权因子'] * (df.iloc[0]['收盘价'] / df.iloc[0]['复权因子'])
df['最低价_复权'] = df['最低价'] / df['收盘价'] * df['收盘价_复权']
df['最高价_复权'] = df['最高价'] / df['收盘价'] * df['收盘价_复权']
df['上市至今交易天数'] = df.index + 1 # 计算上市天数,并删除上市天数不足一年的股票
df = df[df['上市至今交易天数'] > 250]
if df.empty:
return pd.DataFrame()
df.dropna(subset=[*cols, '成交额'], how='all', inplace=True, axis=0)
#
df[cols] *= 10000
df['买入额与成交占比'] = np.array(df[colsB]).sum(axis=1) / df['成交额']
df['卖出额与成交占比'] = np.array(df[colsS]).sum(axis=1) / df['成交额']
df['中户买入占比'] = df['中户资金买入额'] / df['成交额']
df['大户买入占比'] = df['大户资金买入额'] / df['成交额']
df['散户卖出占比'] = df['散户资金卖出额'] / df['成交额']
df['中户大户资金占比'] = df['中户买入占比'] + df['大户买入占比']
df['换手率'] = df['成交额'] / df['流通市值']
df['13日均线'] = df['收盘价_复权'].rolling(13).mean()
df['次日开盘价'] = df['开盘价'].shift(-1)
df['次日开盘涨跌幅'] = df['次日开盘价'] / df['收盘价'] - 1 # 为之后开盘买入做好准备
df['换手率'] = df['成交额'] / df['流通市值']
df['上一日成交量'] = df['成交量'].shift(1)
df['量比'] = df['成交量'] / df['上一日成交量'].rolling(5).mean()
# 计算涨跌停价格
df = cal_if_zhangting_with_st(df)
# 筛选事件
df['event_资金流_1'] = None
df.loc[((df['最高价'] >= df['涨停价']))
& (df['收盘价'] < df['涨停价'])
& ((df['中户资金买入额'] + df['大户资金买入额']) / df['成交额'] >=
本主题为课程学员专享,成为股票量化投资课程学员后可免费阅读
成为学员