接下来我们将构建一个极简的交易策略,这如同编程中的“Hello World”一样基础。
我们将其命名为“新手策略”,其核心逻辑非常直观:在每日收盘时进行判断,若当日股价下跌,则于次日开盘时买入;若次日股价上涨,则执行卖出操作。
这是一种典型的高抛低吸思路。
下面,我们将以五粮液最近100个交易日的历史数据为例,演示该策略的具体实现过程。
1、导入股票数据:
import pandas as pdpd.set_option('display.max_rows', 1000) #最大显示的行数pd.set_option('expand_frame_repr', False) # 当列太多时不换行# 读取数据file_path = '五粮液最近100天数据.csv' data = pd.read_csv(file_path)data = data[['股票名称','成交量','开盘价','最高价','最低价','收盘价','交易日期']]# 计算涨跌幅data['Diff'] = data['收盘价'].diff()print(data)>> 股票名称 成交量 开盘价 最高价 最低价 收盘价 交易日期 Diff0 五 粮 液 7020562.0 165.45 165.76 163.88 165.14 2023-07-11 NaN1 五 粮 液 11884029.0 165.20 166.66 165.00 165.46 2023-07-12 0.322 五 粮 液 32351360.0 167.88 173.00 166.65 172.65 2023-07-13 7.193 五 粮 液 15072288.0 173.60 174.33 170.79 171.99 2023-07-14 -0.664 五 粮 液 9325675.0 170.50 170.98 168.16 169.66 2023-07-17 -2.33
先导入实时数据,为了使数据显示更干净一些,只需取几列数据显示,然后计算一下diff(就是每天的涨跌幅的数值)
2、计算 交易信号
增加一列signal ,来计算交易信号,当diff大于0表示隔天涨信号为1,否则是0。
# 计算交易信号data['Signal'] = data['Diff'].apply(lambda x: 1 if x > 0 else 0)print(data)>> 股票名称 成交量 开盘价 最高价 最低价 收盘价 交易日期 Diff Signal0 五 粮 液 7020562.0 165.45 165.76 163.88 165.14 2023-07-11 NaN 01 五 粮 液 11884029.0 165.20 166.66 165.00 165.46 2023-07-12 0.32 12 五 粮 液 32351360.0 167.88 173.00 166.65 172.65 2023-07-13 7.19 13 五 粮 液 15072288.0 173.60 174.33 170.79 171.99 2023-07-14 -0.66 04 五 粮 液 9325675.0 170.50 170.98 168.16 169.66 2023-07-17 -2.33 05 五 粮 液 8195902.0 169.70 170.23 168.00 168.40 2023-07-18 -1.26 06 五 粮 液 7685551.0 167.82 168.76 166.81 168.32 2023-07-19 -0.08 0
可以看到signal这一列,相比前一天股票涨了,我们signal就是1,否则下跌则为0。
3、创建策略
鉴于A股仅支持做多与平仓,本策略设定为:diff大于0即股价上涨时执行卖出(标记为1),股价下跌时则进行买入。
简言之,连续上涨便持续卖出,连续下跌则不断买入。以下为在图表中添加交易信号的代码实现。
# 为交易信号创建标记点signals = []for idx, row in data.iterrows(): if row['Signal'] == 1: signals.append(opts.MarkPointItem(name="卖", coord=[date_list[idx], row['收盘价']], value="S", symbol_size=15, itemstyle_opts=opts.ItemStyleOpts(color='green'))) elif row['Signal'] == 0: signals.append(opts.MarkPointItem(name="买", coord=[date_list[idx], row['收盘价']], value="B", symbol_size=15, itemstyle_opts=opts.ItemStyleOpts(color='red')))
交易信号在图上增加,看一下可视化的效果:
我们来深入解析该策略逻辑。图表中“B”代表买入(Buy首字母),“S”代表卖出(Sell首字母)。因首日缺乏前值对比,计算从次日即7月12日启动。K线红色示涨,绿色示跌。
7月11日收盘165.14,7月12日收165.46,较前日上涨,信号为1,执行卖出即S。
7月13日较12日继续上扬,信号维持S(卖出)。
7月14日较13日价格回落,信号转为B(买入),遵循逢跌必买原则。
7月15日较14日持续下行,信号仍为B(买入)。
依此类推,逻辑应已清晰。
简言之,1对应卖,0对应买。此乃极简入门策略,旨在建立基础认知,后续将展开更深层的策略探讨。