策略思路:传统网格策略需要设定参数为网格间距、仓位权重。
相当于把收盘价分成数个网格、价格移动到下个网格则成交。
传统网格策略需提前设置格子数量、若价格走到无格子的位置时则不产生交易。
本文主要参考网格策略的思想,取消格子数量限制,选用日内Tick级别高频数据,专注于下单策略及成交情况。
引入必要库、读取数据(可以使用Tick级别、分钟级别,不支持日级别)
import pandas as pd
import warnings
import datetime
import numpy as np
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Kline, Line,Grid,Scatter
data = pd.read_csv('你的数据源.csv')
data.index = data['tradetime']
# 打上时间标签为后续记录做准备
data['time'] = data.index.map(lambda x: x.time())
初始化必要参数、可以将后续代码设置为函数
# 设置买买双边报单价格
sell_price = data['close'][0]*1.01
buy_price = data['close'][0]*0.99
# 记录每日最初股票持仓、现金持仓
s_inday = 5000
cash_inday = 1000000
# 记录实时股票持仓、
s = s_inday
c = cash_inday
# 初始化卖单买单记录
sell = []
buy = []
遍历所有数据,记录交易情况,网格间距为1%
# 最后一个时点要做平仓、循环时不遍历
for i in range(0, len(data)-1):
# 假设时点的最高价>卖单报价,且有足够股票持仓则卖单成交
if ((data['high'][i]>sell_price) & (s_inday > 200)):
# 记录成交时点、报单成交价格、成交数量
sell.append([data.index[i], sell_price.round(2), 200])
# 更新当日可出售股票持仓记录、全部股票持仓、现金持仓记录
s_inday -= 200
s -= 200
c += 200*data['close'][i]*0.998
# 重置双边报价
buy_price = sell_price *0.99
sell_price = sell_price*1.01
# 假设时点的最低价<卖单报价,且有足够现金持仓则买单成交
elif ((data['low'][i]<buy_price) & (cash_inday > data.close[i]*200)):
# 记录成交时点、报单成交价格、成交数量
buy.append([data.index[i], buy_price.round(2),200])
# 更新当日可用于购买现金持仓记录、全部股票持仓、现金持仓记录
cash_inday -= data.close[i]*200
c -= data.close[i]*200
s += 200
# 重置双边报价
sell_price = buy_price*1.01
buy_price = buy_price*0.99
# 每日15:00确定次日可用股票、及现金持仓
if data['time