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 = 100else: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:01Backtesting: 2020-01-31 00:00:00 to 2023-02-28 00:00:00Loading bar data...
Loaded bar data: 0:00:00Test 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:00Finished backtest: 0:00:09name 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 AKShareprint(pb.__version__)
- 将
pybroker
模块导入为pb
,这是一个约定俗成的做法,方便后续使用。 - 从
pybroker
中导入Strategy
和StrategyConfig
类,以及AKShare
数据源。 Strategy
类是 pybroker 中的策略基类,所有的策略都需要继承该类。StrategyConfig
类是 pybroker 中的策略配置基类,所有的策略配置都需要继承该类。AKShare
类是 pybroker 中的数据源类,用于获取数据。pb.__version__
属性用于获取 pybroker 的版本。
配置策略
config = StrategyConfig(initial_cash=500_000)
- 创建一个策略配置对象,该对象用于配置策略的一些参数。
initial_cash
参数用于配置策略的初始资金,默认为 10 万。
strategy = Strategy(data_source=AKShare(),start_date='20220101',end_date='20230916',config=config
)
- 创建一个策略对象,该对象用于运行策略。
AKShare()
参数用于配置策略的数据源,该数据源为 akshare。20220101
参数用于配置策略的开始日期。20230916
参数用于配置策略的结束日期。config
参数用于配置策略的配置对象。strategy
对象用于运行策略。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
- 定义一个名为
buy_low
的函数,该函数用于判断是否需要买入。 ctx
参数是一个上下文对象,该对象包含了策略运行时的一些数据。ctx.long_pos()
方法用于判断是否已经持有仓位。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.252020-02-06 46774 0 10.79 504691.46 504691.46 0.0 1403.222020-02-10 46473 0 10.77 500514.21 500514.21 0.0 -464.732020-02-12 46815 0 10.86 508410.90 508410.90 0.0 1872.602020-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.242023-02-20 64638 0 7.26 469271.88 469271.88 0.0 3231.902023-02-22 64372 0 7.24 466053.28 466053.28 0.0 -1287.442023-02-24 64906 0 7.18 466025.08 466025.08 0.0 -2596.242023-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 = 100else: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 = 100else: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
相关文章:
PyBroker:利用 Python 和机器学习助力算法交易
PyBroker:利用 Python 和机器学习助力算法交易 你是否希望借助 Python 和机器学习的力量来优化你的交易策略?那么你需要了解一下 PyBroker!这个 Python 框架专为开发算法交易策略而设计,尤其关注使用机器学习的策略。借助 PyBrok…...
深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术
深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术 导语 卷积神经网络(CNN)是现代深度学习领域中最重要的模型之一,特别在计算机视觉(CV)领域具有革命性的影响。无论是图…...
彩色图像面积计算一般方法及MATLAB实现
一、引言 在数字图像处理中,经常需要获取感兴趣区域的面积属性,下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…...
[Qt] Box Model | 控件样式 | 实现log_in界面
目录 1、样式属性 (1)盒模型(Box Model) 2、控件样式示例 (1)按钮 (2)复选框 (3)单选框 (4)输入框 (5)…...
内存与缓存:保姆级图文详解
文章目录 前言1、计算机存储设备1.1、硬盘、内存、缓存1.2、金字塔结构1.3、数据流通过程 2、数据结构内存效率3、数据结构缓存效率 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的…...
IM聊天学习资源
文章目录 参考链接使用前端界面简单效果消息窗口平滑滚动至底部vue使用watch监听vuex中的变量变化 websocket握手认证ChatKeyCheckHandlerNettyChatServerNettyChatInitializer 参考链接 zzhua/netty-chat-web - 包括前后端 vue.js实现带表情评论功能前后端实现(仿…...
Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)
目录 前言1. 基本知识2. Java代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 单纯学习Redis可以看我前言的Java基本知识路线!! 对于Java的基本知识推荐阅读: java框架…...
SpringMvc解决跨域问题的源码汇总。
看本文章前,需了解跨域的缘由。 其次,了解RequestMapping的基础原理 最后我们来解析SpringMvc是如何处理跨域问题的。 跨域信息配置 SpringMvc分为全局级别和局部级别两种,全局级别就是任何跨域请求都起作用。 全局级别 全局级别就是在配…...
25.1.17学习内容
B - 迷宫 Description 给定一个 NM 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。 在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 给定起点坐标和终点坐标,每个方格最多经过一次…...
【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)
本文项目编号 T 141 ,文末自助获取源码 \color{red}{T141,文末自助获取源码} T141,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
Qt之文件系统操作和读写
Qt creator 6.80 MinGw 64bit 文本文件是指以纯文本格式存储的文件,如cpp和hpp文件。XML文件和JSON文件也是文本文件,只是使用了特定的标记符号定义文本的含义,读取这种文本文件需要先对内容解析再显示。 qt提供了两种读写文本文件的方法。…...
合合信息名片全能王上架原生鸿蒙应用市场,成为首批数字名片类应用
长期以来,名片都是企业商务沟通的重要工具。随着企业数字化转型,相较于传统的纸质名片,数字名片对于企业成员拓展业务、获取商机、提升企业形象等方面发挥着重要作用。近期,合合信息旗下名片全能王正式上线原生鸿蒙应用市场&#…...
万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用
文章目录 一、引言二、ARINC 653背景三、整体系统架构四、应用/执行(APEX)接口五、ARINC 653 RTOS内部机制六、健康监测功能七、软件应用八、ARINC 653现状九、总结 一、引言 在现代航空领域,综合模块化航空电子设备(IMA…...
jenkins-node节点配置
一.简述: Jenkins有一个很强大的功能: 即:支持分布式构建(jenkins配置中叫节点(node),也被称为slave)。分布式构建通常是用来吸收额外的负载。通过动态添加额外的机器应对构建作业中的高峰期,或在特定操作系统或环境运行特定的构建…...
【Flink系列】5. DataStream API
5. DataStream API DataStream API是Flink的核心层API。一个Flink程序,其实就是对DataStream的各种转换。具体来说,代码基本上都由以下几部分构成: 5.1 执行环境(Execution Environment) Flink程序可以在各种上下文…...
【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接
背景 当服务器建立好节点,一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的,所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接! sudo apt update sudo apt in…...
TDengine 做 Apache SuperSet 数据源
Apache Superset 是一个现代的企业级商业智能(BI)Web 应用程序,主要用于数据探索和可视化。它由 Apache 软件基金会支持,是一个开源项目,它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…...
PCL 新增自定义点类型【2025最新版】
目录 一、自定义点类型1、前言2、定义方法3、代码示例二、合并现有类型三、点云按时间渲染1、CloudCompare渲染2、PCL渲染博客长期更新,本文最近更新时间为:2025年1月18日。 一、自定义点类型 1、前言 PCL库自身定义了很多点云类型,但是在使用的时候时如果要使用自己定义的…...
【记录52】el-table-column 添加fixed属性 滚动条无法滑动
问题: el-table-column 添加fixed属性 滚动条无法滑动 使用element UI组件,用到el-table的el-table-column的fixed属性时,当滚动条长度小于固定列时,滚动条无法通过鼠标去点击滑动操作 原因 fixed是用来固定列的属性,其…...
华为OD机试E卷 ---最大值
一、题目描述 给定一组整数(非负),重排顺序后输出一个最大的整数。 二、示例1 用例1 输入 10 9输出 910说明:输出结果可能非常大,所以你需要返回一个 字符串只而不是整数。 三、输入描述 数字组合 四、输出描述 最大的整数 五、解题思路 字符…...
服务器迁移MySQL
由于公司原有的服务器不再使用,需要将老的服务器上的MySQL迁移到新的服务器上,因此需要对数据进行备份迁移,前提是两台服务器已安装相同版本的MySQL,这里就不再讲解MySQL的安装步骤了,可以安装包、可以在线下载、可以容…...
.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...
【Linux系统】分区挂载
我们能够根据一个 inode 号在指定分区寻找目标文件的 struct inode,也能根据目录文件的内容,通过映射关系,找指定的 inode,可是,现在有个问题: 问题:inode 是不能跨分区使用的!Linu…...
进阶——十六届蓝桥杯嵌入式熟练度练习(按键+LCD)
高亮(一) 声明 char buf[21];unsigned char upled0x04;uint8_t key_val;uint8_t key_down,key_up,key_old;uint32_t key_time;uint8_t key_temp,key_flag;uint8_t line_flag; 按键代码 void key_proc(void) { key_valkey_scan();key_downkey_val&…...
简单介绍JSONStream的使用
地址 作用 这个模块是根据需要筛选出json数据中自己所需要的数据 使用 var JSONStream require("JSONStream"); var parse require("fast-json-parse"); var fs require("fs");fs.createReadStream("./time.json").pipe(JSONSt…...
LTX-Video 高效视频生成模型,一键处理图片文字
LTX-Video 是由 Lightricks 在 2024 年开发的一种视频生成模型,这种模型采用了 transformer 和 Video-VAE 技术,能够高效生成高分辨率视频。此外,LTX-Video 支持多种视频生成方式,包括从文本到视频和从图像到视频。 教程链接&…...
AUTOSAR从入门到精通专栏总目录
AUTOSAR通过分层、模块化和封装的特性,革命性地改变了汽车电子软件开发。它简化了软硬件接口,提高了软件复用性,降低了开发成本和周期。随着 AUTOSAR 在汽车电子系统开发领域的广泛应用,对其深入理解和熟练掌握已成为汽车电子软件…...
Windows环境本地配置pyspark环境详细教程
目录 一、背景简记二、本地单机spark环境配置详细步骤第一步:python环境安装第二步:安装jdk及配置环境变量安装包下载安装环境变量配置 第三步:安装Spark安装包下载安装配置环境变量 第四步:安装hadoop安装包下载安装配置环境变量…...
第8篇:从入门到精通:掌握Python异常处理
第8篇:异常处理 内容简介 本篇文章将深入探讨Python中的异常处理机制。您将学习异常的基本概念与类型,掌握使用try-except块处理异常的方法,了解finally语句的作用,以及如何抛出和定义自定义异常。通过丰富的代码示例࿰…...
聚铭网络6款产品入选CCIA《网络安全专用产品指南》
近日,中国网络安全产业联盟CCIA正式发布《网络安全专用产品指南》(第二版)(以下简称《指南》)。聚铭网络凭借突出技术优势、创新能力以及市场积累,旗下安全产品成功入选防火墙、网络安全审计、日志分析、网…...
高等数学学习笔记 ☞ 不定积分的积分方法
1. 第一换元积分法 1. 基础概念:形如的过程,称为第一换元积分法。 2. 核心思想:通过对被积函数的观察(把被积函数的形式与积分表的积分公式进行比较),把外部的部分项拿到的内部(求原函数), 然后进行拼凑,…...
08、如何预防SQL注入
目录 1、分析及其存在哪些危险 2、预防SQL注入 1、分析及其存在哪些危险 原理: SQL 注入是一种常见的网络攻击手段,攻击者通过在用户输入中插入恶意的 SQL 语句,利用程序对用户输入处理不当的漏洞,使恶意 SQL 语句被数据库服务器执行。 通常发生在应用程序将用户输入直接拼…...
如何发布自己的第一个Chrome扩展程序
如何发布自己的Chrome扩展程序 只需要六步即可完成Chrome扩展程序的发布 (1)首先打开google chrome 应用商城注册开发者账号的页面 (2)现在进行一个绑卡支付5美元的一次性注册费用即可。【不知道如何绑卡的支付的,文…...
ubuntu开机自启,其他方式
在 Ubuntu 22.04 中,如果不使用 .service 文件,仍然有其他方法可以让某个 .sh 文件随着系统启动而自动运行。以下是几种替代方法: 方法一:使用 crontab 的 reboot 选项 crontab 是 Linux 中用于设置周期性被执行的任务的工具。通…...
容器渗透横向
本质上要获得 1.获得容器IP段 2.获得主机IP段 3.获得本机IP 4.通过CNI或Docker0等扫描本机端口 Flannel 容器信息 rootubuntu-linux-22-04-desktop:/home/parallels/Desktop# k get po -A -o wide NAMESPACE NAME …...
软件测试—接口测试面试题及jmeter面试题
一,接口面试题 1.接口的作用 实现前后端的交互,实现数据的传输 2.什么是接口测试 接口测试就是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑关系 3.接口测试必要性 1.可以发现很…...
ansible之playbook剧本
Playbook 1.playbook的组成部分 开头 用 --- 表示,表示是一个yaml文件,但是可以忽略不写 Tasks(任务) 包含了在目标主机上执行的操作,操作还是由模板来执行。每一个任务都是一个ansible的模块,调用系统命…...
基于 Python 的财经数据接口库:AKShare
AKShare 是基于 Python 的财经数据接口库,目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。 安装 安装手册见…...
强网杯RS加密签名伪造及PyramidWeb利用栈帧打内存马
RS加密签名伪造及PyramidWeb利用栈帧打内存马 今年强网杯的一个新框架源代码如下 from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.events import NewResponse from pyramid.response import Response import utiluser…...
Java基础——概念和常识(语言特点、JVM、JDK、JRE、AOT/JIT等介绍)
我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴࿰…...
搭建Node.js后端
从头开始搭建一个Node.js后端,并实现查询历史数据的功能,下面是详细的步骤说明,包括环境配置、项目初始化、代码编写、以及服务器启动。 1. 环境配置 1.1 安装 Node.js 和 npm 首先,你需要在你的电脑上安装 Node.js 和 npm&…...
RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集
前面两篇已经交代AI和AENC模块的配置,这篇就让这两个模块绑定起来,绑定的原因是,Aenc从Ai模块拿到采集的原始数据进行编码。 使用 RK_MPI_SYS_Bind 把 AI 节点和 AENC 进行绑定,其中 enModId 是模块 ID 号选择的是 RK_ID_AI、s32C…...
vue编写一个可拖动的模块,并可以和任何其他组件组合使用
实现思路: 使用 Vue 的自定义指令(directive)来处理拖动逻辑。在 mounted 钩子中添加鼠标事件监听器,以实现拖动功能。在 unmounted 钩子中移除鼠标事件监听器,防止内存泄漏。 代码示例: <template&g…...
Spring6.0新特性-HTTP接口:使用@HttpExchange实现更优雅的Http客户端
文章目录 一、概述二、使用1、创建接口HttpExchange方法2、创建一个在调用方法时执行请求的代理3、方法参数4、返回值5、错误处理(1)为RestClient(2)为WebClient(3)为RestTemplate 注意 一、概述 官方文档…...
【蓝桥杯】Python算法——求逆元的两种算法
目录 零、前言一、逆元二、扩展欧几里得算法三、费马小定理四、总结 零、前言 距离25年蓝桥杯还有大概三个月时间,接下来重点应该会放在蓝桥杯备考方向,一起努力,一起加油 一、逆元 什么是逆元?这是数论中的一个基本概念。如果存…...
音频语言模型与多模态体系结构
音频语言模型与多模态体系结构 多模态模型正在创造语言、视觉和语音等以前独立的研究领域的协同效应。这些模型使用通用架构,将每种模式视为不同的“token”,使它们能够以一种与人类认知非常相似的方式联合建模和理解世界。 可以将多模态分为两个主要领域:输入空间(…...
Redis的安装和配置、基本命令
一、实验目的 本实验旨在帮助学生熟悉Redis的安装、配置和基本使用,包括启动Redis服务、使用命令行客户端进行操作、配置Redis、进行多数据库操作以及掌握键值相关和服务器相关的命令。 二、实验环境准备 1. JAVA环境准备:确保Java Development Kit …...
2025.1.17——三、SQLi regexp正则表达式|
题目来源:buuctf [NCTF2019]SQLi1 目录 一、打开靶机,整理信息 二、解题思路 step 1:正常注入 step 2:弄清关键字黑名单 1.目录扫描 2.bp爆破 step 3:根据过滤名单构造payload step 4:regexp正则注…...
flutter 常用UI组件
文章目录 1. Toast 文本提示框oktoastbot_toast2. loading 加载窗flutter_easyloading3. 对话框gex dialog4.下拉刷新pull_to_refresh5. pop 窗custom_pop_up_menu6. pin code 密码框pinput7. 二维码qr_flutter8. swiper 滚动组件carousel_sliderflutter_swiper_view9. Badge 角…...
基于微信小程序的健身房预约管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...