2.2.1.2-网格交易(python网格交易附实战交易记录)

跳转到根目录:知行合一:投资篇

已完成:
1、投资&技术
  1.1.1 投资-编程基础-numpy
  1.1.2 投资-编程基础-pandas
  1.2 金融数据处理
  1.3 金融数据可视化
2、投资方法论
  2.1.1 预期年化收益率
  2.1.2 一个关于y=ax+b的故事
  2.1.3-数据标准化
  2.1.4-相关性分析
  2.2.1.1-一个关于定投的故(姿)事(势)
  2.2.1.2-网格交易
  2.2.1.3-移动平均线

3、投资实证
  [3.1 2023这一年] 被鸽

文章目录

  • 1. 网格策略说明
    • 1.1. 策略说明
    • 1.2. 策略数据样例
  • 2. 策略实现
    • 2.1. 数据结构定义
    • 2.2. 加载数据
    • 2.3. 主代码
      • 2.3.1. 先看看 want_buy
      • 2.3.2. 买入!today_buy
      • 2.3.3. want_sell
      • 2.3.4. 卖出!today_sell
    • 2.4. 完整代码
  • 3. 收益如何?

1. 网格策略说明

网格交易,说最简单的,就是跌了买,涨了卖。

为了少说废话,这里就举1个例子:

nameopenclosedate操作操作价格
券商ETF0.980.982016/9/140.98
券商ETF0.9830.9622016/9/260.97
券商ETF0.9821.0052016/10/181
券商ETF1.0011.0252016/10/241.01
券商ETF1.0011.0252016/10/241.02
券商ETF1.0211.0312016/11/11.03
券商ETF1.0251.052016/11/31.04
券商ETF1.0251.052016/11/31.05
券商ETF1.0551.0882016/11/111.06
券商ETF1.0551.0882016/11/111.07
券商ETF1.0551.0882016/11/111.08
券商ETF1.091.0972016/11/141.09
券商ETF1.0641.0342016/12/51.06
券商ETF1.0641.0342016/12/51.05
券商ETF1.0641.0342016/12/51.04
券商ETF1.0381.0262016/12/81.03
券商ETF1.0291.0012016/12/121.02
券商ETF1.0291.0012016/12/121.01
券商ETF1.0010.9882016/12/141
券商ETF1.0010.9882016/12/140.99
券商ETF0.9810.9762016/12/190.98
券商ETF0.9750.9632016/12/230.97
券商ETF0.9951.0022017/2/201
券商ETF0.9740.9622017/3/220.97
券商ETF0.9730.962017/3/290.96
券商ETF0.950.9442017/4/190.95
券商ETF0.9420.9372017/5/20.94

1.1. 策略说明

  • 网格的大小,可以自己定义,我定义的是0.01作为一个网格

  • 买入一笔后,如果后面价格涨了x*0.01(这里x可以自己定,我定的是3),那么就卖出

  • 买入一笔后,如果后面价格跌了y*0.01(y一般就是1,也就是1网),那么就继续买入

  • 卖出一笔后,如果后面价格跌了x*0.01(这里x可以自己定,我定的是3),那么就买入

  • 卖出一笔后,如果后面价格涨了y*0.01(y一般就是1,也就是1网),那么就继续卖出

  • 第一天,默认就是买入

  • 后续是按照收盘价和之前买入或卖出的价格进行比较,看是否进行买或卖的操作

1.2. 策略数据样例

2016/9/14买入价0.98,那么,我们预期要么是在1.01卖出,要么是在0.97买入

到了2016/9/26,收盘价是0.962,是>0.97的,那我们就直接认为我们挂单了0.97买入

在2016/9/26以0.97买入之后,我们预期要么是在1.00卖出,要么是在0.96买入

到了2016/10/18,收盘价是1.005,是>1.00的,我们可以成交1笔卖出。

2. 策略实现

2.1. 数据结构定义

    def __init__(self, security, start_date=None, end_date=None) -> None:super().__init__()# security:是这次执行的代码,一般类似512000,510300之类# start_date、end_date:会在所有的数据行中,截取对应的时间片段。不传值,那默认就是None,就会用全量数据进行测算。# step_price:每个网格的大小,比如我们测算的是512000,是1左右净值的,1%作为网格,是合适的。# steps:买入一笔后,如果后面价格涨了x*0.01(这里x可以自己定,我定的是3),那么就卖出。这里的x,就是我们这里的stepsself.args = {'security': security, 'start_date': start_date, 'end_date': end_date, 'step_price': 0.01, 'steps': 3}# 加载数据,后面会具体解释加载过程self.daily_df = self.load_data_2_df()# 保留本次交易的行数据,方便后面的使用(比如判断上一笔,是买入还是卖出操作)self.last_transaction = None# 交易历史,最后输出到csv,方便查看self.transactions = []

2.2. 加载数据

    def load_data_2_df(self):# 这个案例,是通过既有数据来跑的,512000,包含了从 2016-09-14 ~ 2024-03-29 的日线数据。# 如果想要自己获取数据,可以参考之前的文章:https://blog.csdn.net/sdfiiiiii/article/details/135289226,包含了从qstock获取、处理、存储数据等df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/512000.csv")# 如果指定了start_date、end_date,就进行数据的切割if self.args['start_date']:df = df[df["date"] >= self.args['start_date']]if self.args['end_date']:df = df[df["date"] <= self.args['end_date']]# 转换为日期类型df['date'] = df['date'].apply(pd.to_datetime, format='%Y-%m-%d')# 按照日期的正序排序(防止数据错位)df.sort_values(by="date", ascending=True)# 设置dataframe的索引,后面取数比较简便一些.df = df.set_index("date")# 设置了date为索引之后,dataframe里面就没有date这一列了,有时候为了方便处理,还是把date给加上df['date'] = df.index.tolist()return df

2.3. 主代码

主代码,意味着,这里是执行流程的核心。

其实也比较简单,就是遍历dataframe,逐行处理数据即可。

    def process(self):# dataframe的遍历,逐行处理数据for index, row in self.daily_df.iterrows():# index是索引,就是日期;row是Series类型,一行完整的数据if index != self.daily_df.iloc[0]['date']:# 非第一天# 1.1 今日收盘价如果 < 上次操作的价格,那么可能要买。if row['close'] < self.last_transaction['价格']:# want_buy,为什么可能要买,因为在网格中,如果之前是买入,当天价格下跌没有达到下一网,是不买的。这个逻辑在want_buy内部实现self.want_buy(row=row)# 1.2 今日收盘价如果 > 上次操作的价格,那么可能要卖,want_sellelif row['close'] > self.last_transaction['价格']:# want_sell其实和want_buy是同样的解释。因为在网格中,如果收盘价大于上次交易价格,但没有达到实际要卖出的价格,那也是不卖的。这个逻辑在want_sell内部实现self.want_sell(row=row)else:# hold方法,其实什么都没做,return None。意思就是持有不操作。self.hold(row=row)print()else:# 是第一天,默认就是买入# want_buy方法,是指可能要买,为什么可能要买,因为在网格中,如果之前是买入,当天价格下跌没有达到下一网,是不买的。这个逻辑在want_buy内部实现self.want_buy(row=row)# 遍历完所有的数据之后,将所有的交易记录通过pandas存储到csv文件中df = pd.DataFrame(self.transactions)df.to_csv('%s交易记录.csv' % self.args['security'], index=None)

2.3.1. 先看看 want_buy

    def want_buy(self, row):if row['date'] == self.daily_df.iloc[0]['date']:# 这个是第一天的逻辑,直接执行买入。today_buy就真的是买入操作了,主要是记录买入价格和当前行数据this_trans = self.today_buy(row, row['close'])# 将买入行相关的信息,存储到self.transactions操作历史中,方便整体输出self.transactions.append(this_trans)else:# 这里就不是第一天了,要去判断是否能买的到(比如价格下跌没到下一网位置,就不买的。)if self.last_transaction['操作'] == '买':# 如果上一次的操作是'买',那么要构造1个买入价格的阶梯 [上次买入价格, 今日收盘价],按照'网格大小'构建一个阶梯price_stairs。# 用到的是numpy的arange方法,举例:print(np.arange(10,1,-2)) # 输出[10  8  6  4  2]start_buy_price = self.last_transaction['价格']price_stairs = np.arange(start_buy_price, row['close'], -self.args['step_price'])print('前一天是买入,价格%s。收盘价下跌, 构造的买入阶梯是:%s' % (self.last_transaction['价格'], price_stairs))if len(price_stairs) >= 1:# 因为,第一个价格是上次买入价格,所以不要包含在本次的买入阶梯里面,做一些切割[1:]price_stairs = price_stairs[1:]for price in price_stairs:# 一般保留3位小数即可price = round(price, 3)# today_buy,是真正的做买入动作了。this_trans = self.today_buy(row, price)# 将买入信息,集中存储到transactions列表中,后续输出到文件self.transactions.append(this_trans)else:print('未达到买入阶梯价,今日不执行买入')elif self.last_transaction['操作'] == '卖':# 构造买入阶梯价,2. 如果"上一次"是卖出,那么要从"-3*网格"开始买start_buy_price = self.last_transaction['价格'] - self.args['steps'] * self.args['step_price']# 构造价格区间的方法,跟上面是一样的。price_stairs = np.arange(start_buy_price, row['close'], -self.args['step_price'])print('前一天是卖出,价格%s。收盘价下跌,构造的买入阶梯是:%s' % (self.last_transaction['价格'], price_stairs))if start_buy_price == row['close']:# 如果期望开始买的价格,正好是当天收盘价,其实就是此次要买入的价格price_stairs = np.array([start_buy_price])if len(price_stairs) >= 1:# 下面的逻辑,跟上面是一样的。for price in price_stairs:price = round(price, 3)this_trans = self.today_buy(row, price)self.transactions.append(this_trans)else:print('未达到买入阶梯价,今日不执行买入')

2.3.2. 买入!today_buy

上面方法,用到的today_buy方法,其实就几行代码:

    def today_buy(self, row, price):# 扩充行数据元素,增加2列:操作 = 买,价格 = priceself.daily_df.loc[row['date'], '操作'] = '买'self.daily_df.loc[row['date'], '价格'] = price# 将买入这个操作的信息,保存在临时变量 self.last_transaction 中,方便后面处理,能快速定位到上次交易是买入还是卖出,以及其价格self.last_transaction = self.daily_df.loc[row['date']]return self.last_transaction

2.3.3. want_sell

want_sell和want_buy方法及其相似,就不逐行解释了。

    def want_sell(self, row):# 构造卖出阶梯价,1. 如果"前一天"是卖出,那么构造卖出就是按照下一个"网格"卖if self.last_transaction['操作'] == '卖':start_sell_price = self.last_transaction['价格']price_stairs = np.arange(start_sell_price, row['close'], self.args['step_price'])print('前一天是卖出,价格%s。收盘价上涨, 构造的卖出阶梯是:%s' % (self.last_transaction['价格'], price_stairs))if len(price_stairs) >= 1:price_stairs = price_stairs[1:]for price in price_stairs:price = round(price, 3)this_trans = self.today_sell(row, price)self.transactions.append(this_trans)else:print('未达到卖出阶梯价,今日不执行卖出')# 构造卖出阶梯价,2. 如果"前一天"是买入出,那么要从"+3*网格"开始卖elif self.last_transaction['操作'] == '买':start_sell_price = self.last_transaction['价格'] + self.args['steps'] * self.args['step_price']price_stairs = np.arange(start_sell_price, row['close'], self.args['step_price'])print('前一天是买入,价格%s。收盘价上涨,构造的买卖出阶梯是:%s' % (self.last_transaction['价格'], price_stairs))print(price_stairs)if start_sell_price == row['close']:price_stairs = np.array([start_sell_price])if len(price_stairs) >= 1:for price in price_stairs:price = round(price, 3)this_trans = self.today_sell(row, price)self.transactions.append(this_trans)else:print('未达到卖出阶梯价,今日不执行卖出')

2.3.4. 卖出!today_sell

也是跟today_buy大同小异,没什么要特别说明的地方。

    def today_sell(self, row, price):# 扩充行数据元素,增加2列:操作 = 卖,价格 = priceself.daily_df.loc[row['date'], '操作'] = '卖'self.daily_df.loc[row['date'], '价格'] = price# 将卖出这个操作的信息,保存在临时变量 self.last_transaction 中,方便后面处理,能快速定位到上次交易是买入还是卖出,以及其价格self.last_transaction = self.daily_df.loc[row['date']]return self.last_transaction

2.4. 完整代码

完整的代码已经全部都解释完了,就是上面的几个方法组合起来,就结束,整体代码量,加上充分的注释,163行。

废话少说,上干货,直接就能跑~

import pandas as pd
import numpy as npclass FixedGrid:def __init__(self, security, start_date=None, end_date=None) -> None:super().__init__()# security:是这次执行的代码,一般类似512000,510300之类# start_date、end_date:会在所有的数据行中,截取对应的时间片段。不传值,那默认就是None,就会用全量数据进行测算。# step_price:每个网格的大小,比如我们测算的是512000,是1左右净值的,1%作为网格,是合适的。# steps:买入一笔后,如果后面价格涨了x*0.01(这里x可以自己定,我定的是3),那么就卖出。这里的x,就是我们这里的stepsself.args = {'security': security, 'start_date': start_date, 'end_date': end_date, 'step_price': 0.01, 'steps': 3}# 加载数据,后面会具体解释加载过程self.daily_df = self.load_data_2_df()# 保留本次交易的行数据,方便后面的使用(比如判断上一笔,是买入还是卖出操作)self.last_transaction = None# 交易历史,最后输出到csv,方便查看self.transactions = []def load_data_2_df(self):# 这个案例,是通过既有数据来跑的,512000,包含了从 2016-09-14 ~ 2024-03-29 的日线数据。# 如果想要自己获取数据,可以参考之前的文章:https://blog.csdn.net/sdfiiiiii/article/details/135289226,包含了从qstock获取、处理、存储数据等df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/512000.csv")# 如果指定了start_date、end_date,就进行数据的切割if self.args['start_date']:df = df[df["date"] >= self.args['start_date']]if self.args['end_date']:df = df[df["date"] <= self.args['end_date']]# 转换为日期类型df['date'] = df['date'].apply(pd.to_datetime, format='%Y-%m-%d')# 按照日期的正序排序(防止数据错位)df.sort_values(by="date", ascending=True)# 设置dataframe的索引,后面取数比较简便一些.df = df.set_index("date")# 设置了date为索引之后,dataframe里面就没有date这一列了,有时候为了方便处理,还是把date给加上df['date'] = df.index.tolist()return dfdef today_buy(self, row, price):# 扩充行数据元素,增加2列:操作 = 买,价格 = priceself.daily_df.loc[row['date'], '操作'] = '买'self.daily_df.loc[row['date'], '价格'] = price# 将买入这个操作的信息,保存在临时变量 self.last_transaction 中,方便后面处理,能快速定位到上次交易是买入还是卖出,以及其价格self.last_transaction = self.daily_df.loc[row['date']]return self.last_transactiondef today_sell(self, row, price):# 扩充行数据元素,增加2列:操作 = 卖,价格 = priceself.daily_df.loc[row['date'], '操作'] = '卖'self.daily_df.loc[row['date'], '价格'] = price# 将卖出这个操作的信息,保存在临时变量 self.last_transaction 中,方便后面处理,能快速定位到上次交易是买入还是卖出,以及其价格self.last_transaction = self.daily_df.loc[row['date']]return self.last_transactiondef want_buy(self, row):if row['date'] == self.daily_df.iloc[0]['date']:# 这个是第一天的逻辑,直接执行买入。today_buy就真的是买入操作了,主要是记录买入价格和当前行数据this_trans = self.today_buy(row, row['close'])# 将买入行相关的信息,存储到self.transactions操作历史中,方便整体输出self.transactions.append(this_trans)else:# 这里就不是第一天了,要去判断是否能买的到(比如价格下跌没到下一网位置,就不买的。)if self.last_transaction['操作'] == '买':# 如果上一次的操作是'买',那么要构造1个买入价格的阶梯 [上次买入价格, 今日收盘价],按照'网格大小'构建一个阶梯price_stairs。# 用到的是numpy的arange方法,举例:print(np.arange(10,1,-2)) # 输出[10  8  6  4  2]start_buy_price = self.last_transaction['价格']price_stairs = np.arange(start_buy_price, row['close'], -self.args['step_price'])print('前一天是买入,价格%s。收盘价下跌, 构造的买入阶梯是:%s' % (self.last_transaction['价格'], price_stairs))if len(price_stairs) >= 1:# 因为,第一个价格是上次买入价格,所以不要包含在本次的买入阶梯里面,做一些切割[1:]price_stairs = price_stairs[1:]for price in price_stairs:# 一般保留3位小数即可price = round(price, 3)# today_buy,是真正的做买入动作了。this_trans = self.today_buy(row, price)# 将买入信息,集中存储到transactions列表中,后续输出到文件self.transactions.append(this_trans)else:print('未达到买入阶梯价,今日不执行买入')elif self.last_transaction['操作'] == '卖':# 构造买入阶梯价,2. 如果"上一次"是卖出,那么要从"-3*网格"开始买start_buy_price = self.last_transaction['价格'] - self.args['steps'] * self.args['step_price']# 构造价格区间的方法,跟上面是一样的。price_stairs = np.arange(start_buy_price, row['close'], -self.args['step_price'])print('前一天是卖出,价格%s。收盘价下跌,构造的买入阶梯是:%s' % (self.last_transaction['价格'], price_stairs))if start_buy_price == row['close']:# 如果期望开始买的价格,正好是当天收盘价,其实就是此次要买入的价格price_stairs = np.array([start_buy_price])if len(price_stairs) >= 1:# 下面的逻辑,跟上面是一样的。for price in price_stairs:price = round(price, 3)this_trans = self.today_buy(row, price)self.transactions.append(this_trans)else:print('未达到买入阶梯价,今日不执行买入')def want_sell(self, row):# 构造卖出阶梯价,1. 如果"前一天"是卖出,那么构造卖出就是按照下一个"网格"卖if self.last_transaction['操作'] == '卖':start_sell_price = self.last_transaction['价格']price_stairs = np.arange(start_sell_price, row['close'], self.args['step_price'])print('前一天是卖出,价格%s。收盘价上涨, 构造的卖出阶梯是:%s' % (self.last_transaction['价格'], price_stairs))if len(price_stairs) >= 1:price_stairs = price_stairs[1:]for price in price_stairs:price = round(price, 3)this_trans = self.today_sell(row, price)self.transactions.append(this_trans)else:print('未达到卖出阶梯价,今日不执行卖出')# 构造卖出阶梯价,2. 如果"前一天"是买入出,那么要从"+3*网格"开始卖elif self.last_transaction['操作'] == '买':start_sell_price = self.last_transaction['价格'] + self.args['steps'] * self.args['step_price']price_stairs = np.arange(start_sell_price, row['close'], self.args['step_price'])print('前一天是买入,价格%s。收盘价上涨,构造的买卖出阶梯是:%s' % (self.last_transaction['价格'], price_stairs))print(price_stairs)if start_sell_price == row['close']:price_stairs = np.array([start_sell_price])if len(price_stairs) >= 1:for price in price_stairs:price = round(price, 3)this_trans = self.today_sell(row, price)self.transactions.append(this_trans)else:print('未达到卖出阶梯价,今日不执行卖出')def hold(self, row):return Nonedef process(self):# dataframe的遍历,逐行处理数据for index, row in self.daily_df.iterrows():# index是索引,就是日期;row是Series类型,一行完整的数据if index != self.daily_df.iloc[0]['date']:# 非第一天# 1.1 今日收盘价如果 < 上次操作的价格,那么可能要买。if row['close'] < self.last_transaction['价格']:# want_buy,为什么可能要买,因为在网格中,如果之前是买入,当天价格下跌没有达到下一网,是不买的。这个逻辑在want_buy内部实现self.want_buy(row=row)# 1.2 今日收盘价如果 > 上次操作的价格,那么可能要卖,want_sellelif row['close'] > self.last_transaction['价格']:# want_sell其实和want_buy是同样的解释。因为在网格中,如果收盘价大于上次交易价格,但没有达到实际要卖出的价格,那也是不卖的。这个逻辑在want_sell内部实现self.want_sell(row=row)else:# hold方法,其实什么都没做,return None。意思就是持有不操作。self.hold(row=row)print()else:# 是第一天,默认就是买入# want_buy方法,是指可能要买,为什么可能要买,因为在网格中,如果之前是买入,当天价格下跌没有达到下一网,是不买的。这个逻辑在want_buy内部实现self.want_buy(row=row)# 遍历完所有的数据之后,将所有的交易记录通过pandas存储到csv文件中df = pd.DataFrame(self.transactions)df.to_csv('%s交易记录.csv' % self.args['security'], index=None)if __name__ == '__main__':# this = FixedGrid(security='512000', start_date='2020-09-14', end_date='2023-09-14')this = FixedGrid(security='512000', start_date=None, end_date=None)this.process()

3. 收益如何?

其实这里还是要说的,网格这个东西,我们还缺了一个前置条件:

  1. 你得有足够的持仓在手里,你才能在想卖的时候卖出,对吧?
  2. 你得有足够的money在手机,你才能在想买入的时候买,对吧?

所以,这个策略,是为了告诉我们,如果我都ok,那理论上,一年下来,我能卖出多少回?也就是做了多少次的T,能赚多少钱?

我把这个统计的结果文件,放在了:512000交易记录

为了对这个策略有信心,我只看,每年,卖出了多少回?

插个题外话,这个策略有很多改进的地方,比如:

  1. 可以不按照close收盘价来算,而是按照当天的最高或最低价来算
  2. 网格,可以有增强,比如,增加网格数量,或者增加买入、卖出份额等

我自己已经非常忠实的执行了网格交易有一段时间,对结果还是比较满意的,贴一下记录,有兴趣的可以交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之STL的algorithm(4)之拷贝相关算法(copy、replace、swap)整理

C之STL的algorithm&#xff08;4&#xff09;之拷贝相关算法&#xff08;copy、replace、swap&#xff09;整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的查找算法整理…

多线程--深入探究多线程的重点,难点以及常考点线程安全问题

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

Redis高可用主从复制与哨兵模式

前言 在生产环境中&#xff0c;除了采用持久化方式实现 Redis 的高可用性&#xff0c;还可以采用主从复制、哨兵模式和 Cluster 集群的方法确保数据的持久性和可靠性。 目录 一、主从复制 1. 概述 2. 作用 3. 主从复制流程 4. 部署 4.1 安装 redis 4.2 编辑 master 节…

物联网实战--入门篇之(七)嵌入式-MQTT

目录 一、MQTT简介 二、MQTT使用方法 三、MQTT驱动设计 四、代码解析 五、使用过程 六、总结 一、MQTT简介 MQTT因为其轻量、高效和稳定的特点&#xff0c;特别适合作为物联网系统的数据传输协议&#xff0c;已经成为物联网事实上的通信标准了。关于协议的具体内容看看这…

后端前行Vue之路(三):计算属性和监视属性

1.概述 书接上回&#xff0c;我们讲述了《后端前行Vue之路(二)&#xff1a;模版语法之插值与指令》谈到了Vue的模板语法很强大&#xff0c;支持复杂表达式&#xff0c;如下&#xff1a; <div id"example">{{ message.split().reverse().join() }} </div&g…

Supervised Fine-tuning in turn Improves Visual Foundation Models

简介 从NLP中的监督微调&#xff08;Supervised Fine-tuning&#xff09;获得的灵感&#xff0c;本文探索了细粒度SFT在预训练后增强视觉基础模型潜力。本文提出了一种二阶段方法ViSFT释放视觉基础模型细粒度知识。具体地&#xff0c;通过一些域内任务执行视觉联合学习增强视觉…

编程实战:自己编写HTTP服务器(系列9:上传文件)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 本系列的源码位于httpd目录下…

Java实现两数相除

题意 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求不使用乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 &#xff0c;-2.7335…

用DasViewer浏览模型时可以移动模型的中心点吗?

按住鼠标中键&#xff0c;就正常平移模型了。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 DasViewer下载地址&#xff1a;…

leetcode 热题 100(部分)C/C++

leetcode 热题 100 双指针 盛最多水的容器 【mid】【双指针】 思路&#xff1a; 好久没写代码sb了&#xff0c;加上之前写的双指针并不多&#xff0c;以及有点思维定势了。我对双指针比较刻板的印象一直是两层for循环i&#xff0c;j&#xff0c;初始时i,j都位于左界附近&…

SAM Self-Attention based Deep Learning Method

一、Why(Research Background) 网络流量分类根据协议(如超文本传输协议或域名系统)或应用程序(如脸书或Gmail)对流量类别进行分类。其准确性是一些网络管理任务(如服务质量控制、异常检测等)的关键基础。为了进一步提高流量分类的准确性,最近的研究引入了基于深度学习的方法…

Open CASCADE学习|刚体( TopoDS_Shape)按某种轨迹运动,停在指定位置上

今天实现如下功能&#xff1a;刚体做做螺旋运动&#xff0c;轨迹已知&#xff0c;求刚体在每个位置上的所占据的空间&#xff0c;就是把刚体从初始位置变换到该位置。 这里的刚体是一个砂轮截面&#xff0c;螺旋运动轨迹由B样条曲线拟合&#xff0c;通过Frenet标架确定运动轨迹…

datalist是什么,有什么作用?

<datalist>标签用于定义一个预定义选项列表&#xff0c;它可以与文本输入框&#xff08;<input type"text">&#xff09;一起使用&#xff0c;提供一组可选的值供用户选择或输入。<datalist>标签中的选项可以通过<option>标签来定义。 <…

多线程(29)Semaphore

Semaphore&#xff08;信号量&#xff09;是一种常用的并发控制技术&#xff0c;用于管理对一组资源的访问控制。信号量的核心是一个计数器&#xff0c;表示可用资源的数量。计数器的值可以初始化为任意值&#xff0c;如果初始化为1&#xff0c;则成为一个互斥锁&#xff08;Mu…

iOS使用CoreML运用小型深度神经网络架构对图像进行解析

查找一个图片选择器 我用的是ImagePicker 项目有点老了&#xff0c;需要做一些改造&#xff0c;下面是新的仓库 platform :ios, 16.0use_frameworks!target learnings dosource https://github.com/CocoaPods/Specs.gitpod ImagePicker, :git > https://github.com/KevinS…

Python之Opencv进阶教程(1):图片模糊

1、Opencv提供了多种模糊图片的方法 加载原始未经模糊处理的图片 import cv2 as cvimg cv.imread(../Resources/Photos/girl.jpg) cv.imshow(girl, img)1.1 平均值 关键代码 # Averaging 平均值 average cv.blur(img, (3, 3)) cv.imshow(Average Blur, average)实现效果 1.2…

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟…

基于Spring Boot的餐厅点餐系统

基于Spring Boot的餐厅点餐系统 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 部分系统展示 管理员登录界面 用户注册登录界面 …

​如何使用ArcGIS Pro进行洪水淹没分析

洪水淹没分析是一种常见的水文地理信息系统应用&#xff0c;用于模拟和预测洪水事件中可能受到淹没影响的地区&#xff0c;这里为大家介绍一下ArcGIS Pro进行洪水淹没分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&…

Python学习笔记-Flask接收post请求数据并存储数据库

1.引包 from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy 2.配置连接,替换为自己的MySQL 数据库的实际用户名、密码和数据库名 app Flask(__name__) #创建应用实列 app.config[SQLALCHEMY_DATABASE_URI] mysqlpymysql://ro…