当前位置: 首页 > article >正文

PyBroker:利用 Python 和机器学习助力算法交易

PyBroker:利用 Python 和机器学习助力算法交易

你是否希望借助 Python 和机器学习的力量来优化你的交易策略?那么你需要了解一下 PyBroker!这个 Python 框架专为开发算法交易策略而设计,尤其关注使用机器学习的策略。借助 PyBroker,你可以轻松创建和微调交易规则,构建强大的模型,并深入了解你的策略表现。

PyBroker 介绍

官方说明文档:

利用 PyBroker 进行量化投资

官方说明文档的github repo:https://github.com/akfamily/akquant 

 安装:

pip install lib-pybroker --upgrade

测试

# 导入所需的库和模块
import pybroker as pb
from pybroker import Strategy, ExecContext
from pybroker.ext.data import AKShare

# 定义全局参数 "stock_code"(股票代码)、"percent"(持仓百分比)和 "stop_profit_pct"(止盈百分比)
pb.param(name='stock_code', value='600000')
pb.param(name='percent', value=1)
pb.param(name='stop_loss_pct', value=10)
pb.param(name='stop_profit_pct', value=10)

# 初始化 AKShare 数据源
akshare = AKShare()

# 使用 AKShare 数据源查询特定股票(由 "stock_code" 参数指定)在指定日期范围内的数据
df = akshare.query(symbols=[pb.param(name='stock_code')], start_date='20200131', end_date='20230228')


# 定义交易策略:如果当前没有持有该股票,则买入股票,并设置止盈点位
def buy_with_stop_loss(ctx: ExecContext):
    pos = ctx.long_pos()
    if not pos:
        # 计算目标股票数量,根据 "percent" 参数确定应购买的股票数量
        ctx.buy_shares = ctx.calc_target_shares(pb.param(name='percent'))
        ctx.hold_bars = 100
    else:
        ctx.sell_shares = pos.shares
        # 设置止盈点位,根据 "stop_profit_pct" 参数确定止盈点位
        ctx.stop_profit_pct = pb.param(name='stop_profit_pct')


# 创建策略配置,初始资金为 500000
my_config = pb.StrategyConfig(initial_cash=500000)
# 使用配置、数据源、起始日期、结束日期,以及刚才定义的交易策略创建策略对象
strategy = Strategy(akshare, start_date='20200131', end_date='20230228', config=my_config)
# 添加执行策略,设置股票代码和要执行的函数
strategy.add_execution(fn=buy_with_stop_loss, symbols=[pb.param(name='stock_code')])
# 执行回测,并打印出回测结果的度量值(四舍五入到小数点后四位)
result = strategy.backtest()
print(result.metrics_df.round(4))

将以上文件存为test.py

 执行python test.py 

输出信息

python test.py
Loading bar data...
Loaded bar data: 0:00:01

Backtesting: 2020-01-31 00:00:00 to 2023-02-28 00:00:00

Loading bar data...
Loaded bar data: 0:00:00

Test split: 2020-02-03 00:00:00 to 2023-02-28 00:00:00
100% (748 of 748) |##############################################################| Elapsed Time: 0:00:00 Time:  0:00:00

Finished backtest: 0:00:09
                      name        value
0              trade_count     373.0000
1     initial_market_value  500000.0000
2         end_market_value  467328.0900
3                total_pnl  -33322.7800
4           unrealized_pnl     650.8700
5         total_return_pct      -6.6646
6             total_profit  530528.5100
7               total_loss -563851.2900
8               total_fees       0.0000
9             max_drawdown -113004.2700
10        max_drawdown_pct     -20.2704
11                win_rate      45.9215
12               loss_rate      54.0785
13          winning_trades     152.0000
14           losing_trades     179.0000
15                 avg_pnl     -89.3372
16          avg_return_pct      -0.0160
17          avg_trade_bars       1.0000
18              avg_profit    3490.3191
19          avg_profit_pct       0.6958
20  avg_winning_trade_bars       1.0000
21                avg_loss   -3150.0072
22            avg_loss_pct      -0.6241
23   avg_losing_trade_bars       1.0000
24             largest_win   31157.9400
25         largest_win_pct       5.9200
26        largest_win_bars       1.0000
27            largest_loss  -12682.6000
28        largest_loss_pct      -2.3100
29       largest_loss_bars       1.0000
30                max_wins       8.0000
31              max_losses       7.0000
32                  sharpe      -0.0132
33                 sortino      -0.0231
34           profit_factor       0.9638
35             ulcer_index       1.7639
36                     upi      -0.0039
37               equity_r2       0.5876
38               std_error   27448.1177

快速开始

在此处通过一个简单的例子来介绍如何使用 pybroker 来开发策略。

导入相关的模块和类

import pybroker as pb
from pybroker import Strategy, StrategyConfig, ExecContext
from pybroker.ext.data import AKShare

print(pb.__version__)
  1. 将 pybroker 模块导入为 pb,这是一个约定俗成的做法,方便后续使用。
  2. 从 pybroker 中导入 Strategy 和 StrategyConfig 类,以及 AKShare 数据源。
  3. Strategy 类是 pybroker 中的策略基类,所有的策略都需要继承该类。
  4. StrategyConfig 类是 pybroker 中的策略配置基类,所有的策略配置都需要继承该类。
  5. AKShare 类是 pybroker 中的数据源类,用于获取数据。
  6. pb.__version__ 属性用于获取 pybroker 的版本。

配置策略

config = StrategyConfig(initial_cash=500_000)
  1. 创建一个策略配置对象,该对象用于配置策略的一些参数。
  2. initial_cash 参数用于配置策略的初始资金,默认为 10 万。
strategy = Strategy(
    data_source=AKShare(),
    start_date='20220101',
    end_date='20230916',
    config=config
)
  1. 创建一个策略对象,该对象用于运行策略。
  2. AKShare() 参数用于配置策略的数据源,该数据源为 akshare。
  3. 20220101 参数用于配置策略的开始日期。
  4. 20230916 参数用于配置策略的结束日期。
  5. config 参数用于配置策略的配置对象。
  6. strategy 对象用于运行策略。
  7. strategy 对象的 config 属性用于获取策略的配置对象。

定义规则

def buy_low(ctx: ExecContext):
    # 如果当前已经持有仓位,则不再买入。
    if ctx.long_pos():
        return
    # 如果当前的收盘价小于前一天的最低价,则下单买入。
    if ctx.bars >= 2 and ctx.close[-1] < ctx.low[-2]:
        # 计算买入的股票数量,该数量为当前资金的 25%。
        ctx.buy_shares = ctx.calc_target_shares(0.25)
        # 设置买入的限价,该限价为当前收盘价减去 0.01。
        ctx.buy_limit_price = ctx.close[-1] - 0.01
        # 设置持有仓位的时间,该时间为 3 个交易日。
        ctx.hold_bars = 3
  1. 定义一个名为 buy_low 的函数,该函数用于判断是否需要买入。
  2. ctx 参数是一个上下文对象,该对象包含了策略运行时的一些数据。
  3. ctx.long_pos() 方法用于判断是否已经持有仓位。
  4. ctx.bars 属性用于获取当前的交易日。

运行策略

可以通过调用 strategy.backtest() 方法来进行策略回测:

strategy.add_execution(fn=buy_low, symbols=['000001', '600000'])
result = strategy.backtest()

查看订单

print(result.orders)

 print(result.orders)
     type  symbol       date  shares  limit_price  fill_price  fees
id
1     buy  600000 2020-02-04   47125          NaN       10.61   0.0
2    sell  600000 2020-02-05   47125          NaN       10.68   0.0
3     buy  600000 2020-02-06   46774          NaN       10.76   0.0
4    sell  600000 2020-02-07   46774          NaN       10.79   0.0
5     buy  600000 2020-02-10   46473          NaN       10.78   0.0
..    ...     ...        ...     ...          ...         ...   ...
743   buy  600000 2023-02-22   64372          NaN        7.26   0.0
744  sell  600000 2023-02-23   64372          NaN        7.26   0.0
745   buy  600000 2023-02-24   64906          NaN        7.22   0.0
746  sell  600000 2023-02-27   64906          NaN        7.18   0.0
747   buy  600000 2023-02-28   65087          NaN        7.17   0.0

[747 rows x 7 columns]

查看持仓

print(result.positions)

输出:

 print(result.positions)
                   long_shares  short_shares  close     equity  market_value  margin  unrealized_pnl
symbol date
600000 2020-02-04        47125             0  10.66  502352.50     502352.50     0.0         2356.25
       2020-02-06        46774             0  10.79  504691.46     504691.46     0.0         1403.22
       2020-02-10        46473             0  10.77  500514.21     500514.21     0.0         -464.73
       2020-02-12        46815             0  10.86  508410.90     508410.90     0.0         1872.60
       2020-02-14        47032             0  10.86  510767.52     510767.52     0.0         2351.60
...                        ...           ...    ...        ...           ...     ...             ...
       2023-02-16        64908             0   7.19  466688.52     466688.52     0.0        -1947.24
       2023-02-20        64638             0   7.26  469271.88     469271.88     0.0         3231.90
       2023-02-22        64372             0   7.24  466053.28     466053.28     0.0        -1287.44
       2023-02-24        64906             0   7.18  466025.08     466025.08     0.0        -2596.24
       2023-02-28        65087             0   7.18  467324.66     467324.66     0.0          650.87

[374 rows x 7 columns]

查看投资组合

print(result.portfolio)

print(result.portfolio)
                 cash     equity  margin  market_value       pnl  unrealized_pnl  fees
date
2020-02-03  500000.00  500000.00     0.0     500000.00      0.00             0.0   0.0
2020-02-04       3.75  502356.25     0.0     502356.25   2356.25             0.0   0.0
2020-02-05  503298.75  503298.75     0.0     503298.75   3298.75             0.0   0.0
2020-02-06      10.51  504701.97     0.0     504701.97   4701.97             0.0   0.0
2020-02-07  504701.97  504701.97     0.0     504701.97   4701.97             0.0   0.0
...               ...        ...     ...           ...       ...             ...   ...
2023-02-22    1932.74  467986.02     0.0     467986.02 -32013.98             0.0   0.0
2023-02-23  469273.46  469273.46     0.0     469273.46 -30726.54             0.0   0.0
2023-02-24     652.14  466677.22     0.0     466677.22 -33322.78             0.0   0.0
2023-02-27  466677.22  466677.22     0.0     466677.22 -33322.78             0.0   0.0
2023-02-28       3.43  467328.09     0.0     467328.09 -32671.91             0.0   0.0
 

查看交易

print(result.trades)
print(result.trades)
     type  symbol entry_date  exit_date  entry   exit  ...   agg_pnl  bars  pnl_per_bar  stop   mae   mfe
id                                                     ...
1    long  600000 2020-02-04 2020-02-05  10.61  10.68  ...   3298.75     1      3298.75  None -0.13  0.13
2    long  600000 2020-02-06 2020-02-07  10.76  10.79  ...   4701.97     1      1403.22  None -0.11  0.10
3    long  600000 2020-02-10 2020-02-11  10.78  10.86  ...   8419.81     1      3717.84  None -0.07  0.08
4    long  600000 2020-02-12 2020-02-13  10.82  10.82  ...   8419.81     1         0.00  None -0.06  0.06
5    long  600000 2020-02-14 2020-02-17  10.81  11.04  ...  19237.17     1     10817.36  None -0.07  0.23
..    ...     ...        ...        ...    ...    ...  ...       ...   ...          ...   ...   ...   ...
369  long  600000 2023-02-14 2023-02-15   7.24   7.22  ... -31362.12     1     -1298.16  None -0.02  0.02
370  long  600000 2023-02-16 2023-02-17   7.22   7.18  ... -33958.44     1     -2596.32  None -0.04  0.04
371  long  600000 2023-02-20 2023-02-21   7.21   7.26  ... -30726.54     1      3231.90  None -0.06  0.06
372  long  600000 2023-02-22 2023-02-23   7.26   7.26  ... -30726.54     1         0.00  None -0.02  0.03
373  long  600000 2023-02-24 2023-02-27   7.22   7.18  ... -33322.78     1     -2596.24  None -0.04  0.04

 其它:多个股票组合策略

多个股票组合投资,比如600000和600001两只股票(当然后来知道600001不交易了,后来换成了000001股票)

pb.param(name='stock_code', value='600000')
pb.param(name='stock_code2', value='600001')

pb.param(name='stock_code'),pb.param(name='stock_code2')

输出:

pb.param(name='stock_code'),pb.param(name='stock_code2')
('600000', '600001')

投资组合运行策略

最终是使用了600001和000001两只股票的组合来做例子:

# 导入所需的库和模块
import pybroker as pb
from pybroker import Strategy, ExecContext
from pybroker.ext.data import AKShare

# 定义全局参数 "stock_code"(股票代码)、"percent"(持仓百分比)和 "stop_profit_pct"(止盈百分比)
pb.param(name='stock_code', value='600000')
pb.param(name='stock_code2', value='000001')
pb.param(name='percent', value=0.5)
pb.param(name='stop_loss_pct', value=10)
pb.param(name='stop_profit_pct', value=10)

# 初始化 AKShare 数据源
akshare = AKShare()

# 使用 AKShare 数据源查询特定股票(由 "stock_code" 参数指定)在指定日期范围内的数据
df = akshare.query(symbols=[pb.param(name='stock_code'), pb.param(name='stock_code2')], start_date='20200131', end_date='20230228')


# 定义交易策略:如果当前没有持有该股票,则买入股票,并设置止盈点位
def buy_with_stop_loss(ctx: ExecContext):
    pos = ctx.long_pos()
    if not pos:
        # 计算目标股票数量,根据 "percent" 参数确定应购买的股票数量
        ctx.buy_shares = ctx.calc_target_shares(pb.param(name='percent'))
        ctx.hold_bars = 100
    else:
        ctx.sell_shares = pos.shares
        # 设置止盈点位,根据 "stop_profit_pct" 参数确定止盈点位
        ctx.stop_profit_pct = pb.param(name='stop_profit_pct')


# 创建策略配置,初始资金为 500000
my_config = pb.StrategyConfig(initial_cash=500000)
# 使用配置、数据源、起始日期、结束日期,以及刚才定义的交易策略创建策略对象
strategy = Strategy(akshare, start_date='20200131', end_date='20230228', config=my_config)
# 添加执行策略,设置股票代码和要执行的函数
strategy.add_execution(fn=buy_with_stop_loss, symbols=[pb.param(name='stock_code'), pb.param(name='stock_code2')])
# 执行回测,并打印出回测结果的度量值(四舍五入到小数点后四位)
result = strategy.backtest()
print(result.metrics_df.round(4))

# 查看结果
print(result.metrics_df)  # 查看绩效
print(result.orders)  # 查看订单
print(result.positions)  # 查看持仓
print(result.portfolio)  # 查看投资组合
print(result.trades)  # 查看交易

查看结果 

>>> print(result.metrics_df)  # 查看绩效
                      name          value
0              trade_count     746.000000
1     initial_market_value  500000.000000
2         end_market_value  467291.140000
3                total_pnl  -33884.120000
4           unrealized_pnl    1175.260000
5         total_return_pct      -6.776824
6             total_profit  948882.400000
7               total_loss -982766.520000
8               total_fees       0.000000
9             max_drawdown -197100.720000
10        max_drawdown_pct     -32.257853
11                win_rate      45.285714
12               loss_rate      54.714286
13          winning_trades     317.000000
14           losing_trades     383.000000
15                 avg_pnl     -45.421072
16          avg_return_pct      -0.013338
17          avg_trade_bars       1.000000
18              avg_profit    2993.319874
19          avg_profit_pct       1.166530
20  avg_winning_trade_bars       1.000000
21                avg_loss   -2565.970026
22            avg_loss_pct      -0.991488
23   avg_losing_trade_bars       1.000000
24             largest_win   22902.000000
25         largest_win_pct       8.610000
26        largest_win_bars       1.000000
27            largest_loss  -14081.490000
28        largest_loss_pct      -4.830000
29       largest_loss_bars       1.000000
30                max_wins      10.000000
31              max_losses      14.000000
32                  sharpe      -0.009205
33                 sortino      -0.015332
34           profit_factor       0.975002
35             ulcer_index       2.528958
36                     upi      -0.001950
37               equity_r2       0.421268
38               std_error   46080.037348
>>> print(result.orders)  # 查看订单
      type  symbol       date  shares  limit_price  fill_price  fees
id
1      buy  000001 2020-02-04   17869          NaN       14.34   0.0
2      buy  600000 2020-02-04   22974          NaN       10.61   0.0
3     sell  000001 2020-02-05   17869          NaN       14.60   0.0
4     sell  600000 2020-02-05   22974          NaN       10.68   0.0
5      buy  000001 2020-02-06   17301          NaN       14.69   0.0
...    ...     ...        ...     ...          ...         ...   ...
1490   buy  600000 2023-02-24   32486          NaN        7.22   0.0
1491  sell  000001 2023-02-27   16717          NaN       13.78   0.0
1492  sell  600000 2023-02-27   32486          NaN        7.18   0.0
1493   buy  000001 2023-02-28   17023          NaN       13.73   0.0
1494   buy  600000 2023-02-28   32411          NaN        7.17   0.0

[1494 rows x 7 columns]
>>> print(result.positions)  # 查看持仓
                   long_shares  short_shares  close     equity  market_value  margin  unrealized_pnl
symbol date
600000 2020-02-04        22974             0  10.66  244902.84     244902.84     0.0         1148.70
000001 2020-02-04        17869             0  14.60  260887.40     260887.40     0.0         4645.94
600000 2020-02-06        23429             0  10.79  252798.91     252798.91     0.0          702.87
000001 2020-02-06        17301             0  14.77  255535.77     255535.77     0.0         1384.08
600000 2020-02-10        23229             0  10.77  250176.33     250176.33     0.0         -232.29
...                        ...           ...    ...        ...           ...     ...             ...
000001 2023-02-22        16587             0  14.02  232549.74     232549.74     0.0         -165.87
600000 2023-02-24        32486             0   7.18  233249.48     233249.48     0.0        -1299.44
000001 2023-02-24        16717             0  13.86  231697.62     231697.62     0.0        -1003.02
600000 2023-02-28        32411             0   7.18  232710.98     232710.98     0.0          324.11
000001 2023-02-28        17023             0  13.78  234576.94     234576.94     0.0          851.15

[748 rows x 7 columns]
>>> print(result.portfolio)  # 查看投资组合
                 cash     equity  margin  market_value       pnl  unrealized_pnl  fees
date
2020-02-03  500000.00  500000.00     0.0     500000.00      0.00             0.0   0.0
2020-02-04       4.40  505794.64     0.0     505794.64   5794.64             0.0   0.0
2020-02-05  506254.12  506254.12     0.0     506254.12   6254.12             0.0   0.0
2020-02-06       6.39  508341.07     0.0     508341.07   8341.07             0.0   0.0
2020-02-07  504534.85  504534.85     0.0     504534.85   4534.85             0.0   0.0
...               ...        ...     ...           ...       ...             ...   ...
2023-02-22    2134.33  466957.75     0.0     466957.75 -33042.25             0.0   0.0
2023-02-23  469755.70  469755.70     0.0     469755.70 -30244.30             0.0   0.0
2023-02-24    2506.14  467453.24     0.0     467453.24 -32546.76             0.0   0.0
2023-02-27  466115.88  466115.88     0.0     466115.88 -33884.12             0.0   0.0
2023-02-28       3.22  467291.14     0.0     467291.14 -32708.86             0.0   0.0

[748 rows x 7 columns]
>>> print(result.trades)  # 查看交易
     type  symbol entry_date  exit_date  entry   exit  ...   agg_pnl  bars  pnl_per_bar  stop   mae   mfe
id                                                     ...
1    long  000001 2020-02-04 2020-02-05  14.34  14.60  ...   4645.94     1      4645.94  None -0.32  0.32
2    long  600000 2020-02-04 2020-02-05  10.61  10.68  ...   6254.12     1      1608.18  None -0.13  0.13
3    long  000001 2020-02-06 2020-02-07  14.69  14.55  ...   3831.98     1     -2422.14  None -0.18  0.18
4    long  600000 2020-02-06 2020-02-07  10.76  10.79  ...   4534.85     1       702.87  None -0.11  0.10
5    long  000001 2020-02-10 2020-02-11  14.42  14.75  ...  10228.67     1      5693.82  None -0.12  0.33
..    ...     ...        ...        ...    ...    ...  ...       ...   ...          ...   ...   ...   ...
742  long  600000 2023-02-20 2023-02-21   7.21   7.26  ... -32234.74     1      1555.70  None -0.06  0.06
743  long  000001 2023-02-22 2023-02-23  14.03  14.15  ... -30244.30     1      1990.44  None -0.09  0.12
744  long  600000 2023-02-22 2023-02-23   7.26   7.26  ... -30244.30     1         0.00  None -0.02  0.03
745  long  000001 2023-02-24 2023-02-27  13.92  13.78  ... -32584.68     1     -2340.38  None -0.14  0.11
746  long  600000 2023-02-24 2023-02-27   7.22   7.18  ... -33884.12     1     -1299.44  None -0.04  0.04

[746 rows x 15 columns]

最后的代码

 

# 导入所需的库和模块
import pybroker as pb
from pybroker import Strategy, ExecContext
from pybroker.ext.data import AKShare

# 定义全局参数 "stock_code"(股票代码)、"percent"(持仓百分比)和 "stop_profit_pct"(止盈百分比)
pb.param(name='stock_codes', value=['600000', '000001'])
pb.param(name='percents', value=[0.5, 0.5])  # 持仓百分比,和为1
pb.param(name='stop_loss_pct', value=10)
pb.param(name='stop_profit_pct', value=10)

# 初始化 AKShare 数据源
akshare = AKShare()

# 使用 AKShare 数据源查询特定股票(由 "stock_code" 参数指定)在指定日期范围内的数据
df = akshare.query(symbols=[pb.param(name='stock_code')], start_date='20200131', end_date='20230228')


# 定义交易策略:如果当前没有持有该股票,则买入股票,并设置止盈点位
def buy_with_stop_loss(ctx: ExecContext):
    pos = ctx.long_pos()
    if not pos:
        # 计算目标股票数量,根据 "percent" 参数确定应购买的股票数量
        ctx.buy_shares = ctx.calc_target_shares(pb.param(name='percent'))
        ctx.hold_bars = 100
    else:
        ctx.sell_shares = pos.shares
        # 设置止盈点位,根据 "stop_profit_pct" 参数确定止盈点位
        ctx.stop_profit_pct = pb.param(name='stop_profit_pct')


# 创建策略配置,初始资金为 500000
my_config = pb.StrategyConfig(initial_cash=500000)
# 使用配置、数据源、起始日期、结束日期,以及刚才定义的交易策略创建策略对象
strategy = Strategy(akshare, start_date='20200131', end_date='20230228', config=my_config)
# 添加执行策略,设置股票代码和要执行的函数
strategy.add_execution(fn=buy_with_stop_loss, symbols=[pb.param(name='stock_code')])
# 执行回测,并打印出回测结果的度量值(四舍五入到小数点后四位)
result = strategy.backtest()
print(result.metrics_df.round(4))

# 查看结果
print(result.metrics_df)  # 查看绩效
print(result.orders)  # 查看订单
print(result.positions)  # 查看持仓
print(result.portfolio)  # 查看投资组合
print(result.trades)  # 查看交易

调试

股票组合运行策略发现还是只买单只股票

使用这个组合:

pb.param(name='stock_code', value='600000')
pb.param(name='stock_code2', value='600001')

pb.param(name='stock_code'),pb.param(name='stock_code2')

发现订单、持仓、交易等信息里,只有600000股票,没有600001的信息。

后来改成600000和000001股票组合,发现策略运行正常

pb.param(name='stock_code', value='600000')
pb.param(name='stock_code2', value='000001')

pb.param(name='stock_code'),pb.param(name='stock_code2')
print(result.positions)  # 查看持仓
                   long_shares  short_shares  close     equity  market_value  margin  unrealized_pnl
symbol date
600000 2020-02-04        22974             0  10.66  244902.84     244902.84     0.0         1148.70
000001 2020-02-04        17869             0  14.60  260887.40     260887.40     0.0         4645.94
600000 2020-02-06        23429             0  10.79  252798.91     252798.91     0.0          702.87
000001 2020-02-06        17301             0  14.77  255535.77     255535.77     0.0         1384.08
600000 2020-02-10        23229             0  10.77  250176.33     250176.33     0.0         -232.29
...                        ...           ...    ...        ...           ...     ...             ...
000001 2023-02-22        16587             0  14.02  232549.74     232549.74     0.0         -165.87
600000 2023-02-24        32486             0   7.18  233249.48     233249.48     0.0        -1299.44
000001 2023-02-24        16717             0  13.86  231697.62     231697.62     0.0        -1003.02
600000 2023-02-28        32411             0   7.18  232710.98     232710.98     0.0          324.11
000001 2023-02-28        17023             0  13.78  234576.94     234576.94     0.0          851.15

[748 rows x 7 columns]

结论就是:可能600001邯郸钢铁这只股票有问题。查了一下,唐钢股份吸收合并邯郸钢铁、承德钒钛。所以没有600001这只股票了。所以才会有不交易的情况发生。刚开始用PyBroker,还以为是自己代码写错了。

当然最后学到的是这样写:

pb.param(name='stock_codes', value=['600000', '600001'])
pb.param(name='percents', value=[0.5, 0.5])  # 持仓百分比,和为1


http://www.kler.cn/a/508624.html

相关文章:

  • Java定时任务不明原因挂掉(定时任务挂掉)以及建议
  • USB 驱动开发 --- Gadget 驱动框架梳理(一)
  • cmake foreach 条件判断
  • ToDesk设置临时密码和安全密码都可以当做连接密码使用
  • Qiankun 微前端框架全面解析:架构、原理与最佳实践
  • HTML中如何保留字符串的空白符和换行符号的效果
  • 自动驾驶占用网格预测
  • Ruby JSON 优化之路:性能提升的探索与实践
  • 文档智能:OCR+Rocketqa+layoutxlm <Rocketqa>
  • 【Kotlin】上手学习之控制流程篇
  • ReaderLM v2:HTML 转 Markdown 和 JSON 的前沿小型语言模型
  • 常见安全风险及防护(如CSRF,XSS) 配置SSL/TLS
  • 分类统计字符个数(PTA)C语言
  • mysql主从复制sql进程中断,报错Tablespace is missing for table ……
  • Vue 3 中的 defineExpose
  • C语言之字符函数和字符串函数(上)
  • Vue3实现表格搜索内容高亮
  • Kotlin Bytedeco OpenCV 图像图像57 图像ROI
  • BUUCTF Web
  • 哪些新兴技术对智能驾驶汽车影响最大?
  • Neo4j与Python交互
  • FFMpeg的一些常用命令
  • 一探究竟:如何高效提取ULL中的当前参数,实现性能与精度的完美平衡
  • 矩阵碰一碰发视频源码技术开发全解析,支持OEM
  • 【9.1】Golang后端开发系列--Gin快速入门指南
  • 机器学习(3):逻辑回归