做套:惊呆了!探究如果机器用网格法对股票进行做套的胜率,竟高达%100
前言:
接上两篇:
首先,我要事先说明为什么百分之百的。
什么是网格交易法?
网格交易法是一种利用行情震荡进行获利的策略。在标的价格不断震荡的过程中,对标的价格绘制网格,在市场价格触碰到某个网格线时进行加减仓操作尽可能获利。网格交易法属于左侧交易的一种。与右侧交易不同,网格交易法并非跟随行情,追涨杀跌,而是逆势而为,在价格下跌时买入,价格上涨时卖出。
顾名思义,如果将网格法套用在“做套”上就是在股价比原本持仓价格时卖出,再在股价比原本持仓价格低的时候买回。这样一说,如果完美的这样交易是不可能存在亏钱情况,所以胜率是百分百的。但究竟是不是真的如此呢,放在实际上是否能实现呢,接下来就来用数据实验一下,实现起来比前两篇兼职不用简单太多了。
单了解完之后就可以开始实现了:
-
第一步导入数据:
df = pd.read_csv("2021-11-19.csv")这里用一下2021年11月19号的上证A股所有股票的日分钟数据
忽略’code’列股票代码显示不全的问题,从数据库备份转csv时没注意code特征列数值的属性,但对这次实验不造成影响,后期把“0”补回去就好了,就是csv保存时把前面的“0”都去掉了,数据量有54w条,足够大了。
-
构造网格法的网格
网格法一般都有很多点位,等价格超过这些点位的时候再进行买卖,然后每一次买(卖)都要比前一次价格更低(高),这些高低点一般都是从一只股票长期的压力位和支撑位中选取,但这是对一直股票长周期持仓的操作。对于“做套”这种可以看作超短周期的买卖,可以套用一下止盈策略(做人要知足和止损嘛),我们只需要两个点位就好了,高点:比原本持仓价格涨(%2%5),低点:比原本持仓价格跌(%2%5),这样就ok啦。
-
在这,不继续引用sklearn的线性模型库linear_model构造一个可以计算一段时间内价格变动趋势的函数,因为网格法并没有用到任何指标,买卖时根本不知道这是这是不是这十几分钟或者两三小时内的高低点,只保证了我们永远不亏钱。
-
构造一个逻辑函数或称为步骤函数去利用数据然后作出决策,然后再判断决策是否正确
stopsurplus = 1.02 stoploss = 0.98 buy = {'code': list(), '买入价': list()} sell = {'code': list(), '卖出价': list()}# 由于数据是全部A股在每一分钟的交易数据,因此要单独抽出每个数据进行计算 for code in set(df['code'].to_list()): price_list = df[df['code'] == code]['最新价'].to_list() threshold = price_list[0] high_point = stopsurplus * threshold low_point = stoploss * threshold for i in range(len(price_list)): if price_list[i] < low_point: buy['code'].append(code) buy['买入价'].append(price_list[i]) low_point = price_list[i] if price_list[i] > high_point: sell['code'].append(code) sell['卖出价'].append(price_list[i]) high_point = price_list[i]
一通捣鼓下来,观看实验效果:
由于我没有设置什么限制交易次数,所以会有一只股票只要买没有卖的时候,这样看不出什么利润,所以合并一下,将这些数据直接抹除。这样看不出什么效果我们得看操作同一只股票时的:
可以看出,同一只股票,买时永远都比卖出时低,这样我们就能做到赚差价。实验用的数据是比原本持仓价格高%2卖,比原本持仓价格低%2时买,有些不讲武德的量化机器连%1的利润都吃的,当然人家网速和机器性能都很顶尖确实可以这样操作。
最后再提一句,现时中往往我们不能确定买卖的数量是否会相等的话,可以设立先卖然后再买,或者先买然后再卖这样交叉购买,因为一天的股票波动肯定都会有的,虽然这样限制交易次数的话会少很多交易机会,但可以降低涨跌幅增加次数。实验中%2的涨跌幅已经要不断操作很多遍了。
最后看一下操作一通的利润吧:
啊哈哈哈不算,草草了场了,周六考六级了,赶紧复习去了,不敲了!!!
完整代码:
import pandas as pd
from tqdm import tqdm
if __name__ == '__main__':
stopsurplus = 1.1
stoploss = 0.95
df = pd.read_csv("min_test_data.csv")
buy = {'code': list(), '买入价': list()}
sell = {'code': list(), '卖出价': list()}
for code in tqdm(set(df['code'].to_list())):
price_list = df[df['code'] == code]['最新价'].to_list()
threshold = price_list[0]
high_point = stopsurplus * threshold
low_point = stoploss * threshold
for i in range(len(price_list)):
if price_list[i] < low_point:
if CalculateTrend(price_list[i - 10:i] if i > 10 else price_list[:i]) > 0:
buy['code'].append(code)
buy['买入价'].append(price_list[i])
low_point = price_list[i]
if price_list[i] > high_point:
if CalculateTrend(price_list[i - 10:i] if i > 10 else price_list[:i]) < 0:
sell['code'].append(code)
sell['卖出价'].append(price_list[i])
high_point = price_list[i]
buy = pd.DataFrame(buy)
print(buy.head())
sell = pd.DataFrame(sell)
print(sell.head())