def signal_john(df, para=[20, 0.05, 20], proportion=1): para_ = para[0] df['median'] = df['close'].rolling(para_, min_periods=1).mean() df['bias'] = df['close'] / df['median'] - 1 bias_pct = float(para[1]) wr_pct = para[2] df['TYP'] = (df['high'] + df['low'] + df['close']) / 3 df['H'] = np.where(df['high'] - df['TYP'].shift(1) > 0, df['high'] - df['TYP'].shift(1), 0) df['L'] = np.where(df['TYP'].shift(1) - df['low'] > 0, df['TYP'].shift(1) - df['low'], 0) df['max_high'] = df['high'].rolling(wr_pct, min_periods=1).max() df['min_low'] = df['low'].rolling(wr_pct, min_periods=1).min() df['Wr_%s' % str(wr_pct)] = (df['max_high'] - df['close']) / (df['max_high'] - df['min_low']) * 100 # 计算均线 df['Cr_%s' % (para_)] = df['H'].rolling(para_).sum() / df['L'].rolling(para_, min_periods=1).sum() * 100 # ======= 找出做多信号 CR 上穿 200 condition1 = df['Cr_%s' % str(para_)] > 200 # 均线大于0 # condition2 = df['Cr_%s' % str(params)].shift(1) <= 200 # 上一周期的均线小于等于0 condition2 = df['Cr_%s' % str(para_)].shift() <= 200 condition3 = df['Wr_%s' % str(wr_pct)] < 20 df.loc[condition1 & condition2 & condition3, 'signal_long'] = 1 # 1代表做多 condition1 = df['Cr_%s' % str(para_)] < 50 # 均线大于0 # condition2 = df['Cr_%s' % str(params)].shift(1) <= 200 # 上一周期的均线小于等于0 condition2 = df['Cr_%s' % str(para_)].shift() >= 50 condition3 = df['Wr_%s' % str(wr_pct)] < 80 df.loc[condition1 & condition2 & condition3, 'signal_short'] = -1 # 1代表做多 # 合并做多做空信号,去除重复信号 df['signal'] = df[['signal_long', 'signal_short']].sum(axis=1, min_count=1, skipna=True) # 若你的pandas版本是最新的,请使用本行代码代替上面一行 temp = df[df['signal'].notnull()][['signal']] temp = temp[temp['signal'] != temp['signal'].shift(1)] df['signal'] = temp['signal'] # ===根据bias,修改开仓时间 df['temp'] = df['signal'] # 将原始信号做多时,当bias大于阀值,设置为空 condition1 = (df['signal'] == 1) condition2 = (df['bias'] > bias_pct) df.loc[condition1 & condition2, 'temp'] = None # 将原始信号做空时,当bias大于阀值,设置为空 condition1 = (df['signal'] == -1) condition2 = (df['bias'] < -1 * bias_pct) df.loc[condition1 & condition2, 'temp'] = None # 使用之前的信号补全原始信号 df['temp'].fillna(method='ffill', inplace=True) df['signal'] = df['temp'] # ===考察是否需要止盈止损 df = process_stop_loss_close(df, proportion) return df #### 3.2、参数生成代码 def generate_fibonacci_sequence(start, end): """ 生成斐波那契数列 :param start: 数列起始值 :param end: 数列结束值 :return: 从起始值到结束值的斐波那契数列 """ seq = [start, start + 1] while seq[-1] <= end: seq.append(seq[-1] + seq[-2]) return seq[:-1] 优化以上代码
时间: 2023-10-09 15:17:28 浏览: 40
以下是对代码的优化建议:
1. 可以使用 @numba.jit 对函数进行装饰,以提高函数的执行速度。
2. 可以使用 pandas 的 DataFrame.pipe() 方法,将多个操作串联起来,以提高代码的可读性和简洁性。
3. 可以将函数中的一些常量或变量提取出来,作为函数的参数,以增加函数的灵活性。比如,可以将 bias_pct 和 wr_pct 提取出来,作为函数的参数。
4. 可以将一些重复的代码进行封装,以减少代码的重复性。比如,可以将处理做多做空信号的代码封装成一个函数。
5. 可以将函数中的一些不必要的变量删除,以减少内存的占用。比如,可以将 df['temp'] 删除,直接使用 df['signal']。
6. 可以使用 pandas 的 rolling_apply() 方法,代替 rolling().apply() 方法,以提高代码的执行速度。
7. 可以使用 pandas 的 query() 方法,代替 loc[] 方法,以提高代码的执行速度和可读性。
8. 可以使用 numpy 的 vectorize() 方法,对函数进行向量化,以提高函数的执行速度。
相关问题
LOPA_rating_button = wx.Button(left_panel, label="SIL定级") LOPA_sizer.Add(LOPA_rating_button, flag=wx.ALL | wx.EXPAND, border=self.boder, proportion=1) 怎么给这段代码加凸起边框
你可以使用`wx.BoxSizer`来为按钮添加一个凸起的边框效果。可以按照以下步骤进行操作:
1. 首先,将按钮添加到一个新的`wx.Panel`中,以便您可以对其进行布局和样式设置。
```python
LOPA_rating_panel = wx.Panel(left_panel)
LOPA_rating_sizer = wx.BoxSizer(wx.HORIZONTAL)
LOPA_rating_panel.SetSizer(LOPA_rating_sizer)
LOPA_rating_button = wx.Button(LOPA_rating_panel, label="SIL定级")
LOPA_rating_sizer.Add(LOPA_rating_button, flag=wx.ALL | wx.EXPAND, border=self.border, proportion=1)
```
2. 接下来,使用`wx.StaticBox`和`wx.StaticBoxSizer`来创建一个静态框,并将按钮添加到其中。
```python
LOPA_rating_staticbox = wx.StaticBox(left_panel, label="边框")
LOPA_rating_staticbox_sizer = wx.StaticBoxSizer(LOPA_rating_staticbox, wx.VERTICAL)
LOPA_rating_staticbox_sizer.Add(LOPA_rating_panel, flag=wx.EXPAND)
LOPA_sizer.Add(LOPA_rating_staticbox_sizer, flag=wx.ALL | wx.EXPAND, border=self.border, proportion=1)
```
请注意,我假设您已经有一个名为`LOPA_sizer`的`sizer`来管理左侧面板的布局。如果没有,请根据您的实际情况进行调整。
这样做会在按钮周围添加一个凸起的边框效果。您可以根据需要调整边框的样式和参数。
def calculate_importance(data, feature_index): unique_values = np.unique(data[:, feature_index]) # 属性取值的唯一值 importance = 0 for value in unique_values: subset = data[data[:
feature_index]]
count = np.sum(subset[:, feature_index] == value)
proportion = count / len(data)
importance += -proportion * np.log2(proportion)
return importance
这是一个计算给定数据集中某个特征的重要性的函数。它首先获取该特征的唯一值集合,然后遍历每个唯一值,计算该值在数据集中的比例,并根据比例计算重要性。最后将各个唯一值的重要性求和并返回。
你还有其他问题吗?