一个不可思议的Python库vnpy示例详解!
一个不可思议的Python库vnpy示例详解!
前言
vn.py 是一个开源的 Python 交易编程框架,旨在帮助程序员快速搭建属于自己的量化交易平台。该框架支持股票、期货、外汇等多种金融产品的交易,提供了从数据获取、策略开发到交易执行的全流程支持。
如何安装vnpy
首先,要使用vnpy,您需要通过Python的包管理工具pip来安装它。以下是安装vnpy的简单步骤:
|
1
|
pip install vn.py |
安装完成后,您可以在Python代码中通过以下方式引入vnpy库:
|
1
|
from vnpy import * |
这样,您就可以开始使用vnpy来构建您的量化交易平台了。接下来,我们将探讨vnpy的基本功能和高级特性。
vnpy的功能特性
- 模块化:
vn.py的设计使得每个组件都可以独立运行,易于扩展和维护。 - 多语言支持:支持使用 C++、Python 等多种语言进行扩展,提升性能。
- 跨平台:可以在 Windows、Linux 和 macOS 等操作系统上运行。
- 高性能:利用事件驱动架构,实现高性能的交易引擎。
- 易用性:提供简洁的 API 接口,降低开发难度。
- 社区支持:拥有活跃的社区,持续更新和优化。
- 文档齐全:提供详细的文档和示例,便于学习和使用。
vnpy的基本功能
交易引擎
vnpy的交易引擎是其核心组件,负责管理交易流程、连接交易所和执行交易指令。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
from vnpy.app.cta_strategy import (CtaEngine,CtaStrategy,BarGenerator,ArrayManager,)# 创建交易引擎实例engine = CtaEngine()# 添加策略class MyStrategy(CtaStrategy):author = "Your Name"# 策略初始化函数def __init__(self, cta_engine, strategy_name, vt_symbol, setting):super().__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar)self.am = ArrayManager()# 数据处理函数def on_bar(self, bar):self.am.update_bar(bar)if not self.am.inited:return# 这里编写策略逻辑pass# 添加策略实例engine.add_strategy(MyStrategy, {"name": "MyStrategy", "vt_symbol": "ETHUSDT", "setting": {}}) |
数据管理
vnpy提供了一套完善的数据管理机制,支持历史数据和实时数据的存储与查询。
|
1
2
3
4
5
6
7
8
9
10
|
from vnpy.app.data_manager import DriverManager# 创建数据管理器实例manager = DriverManager()# 加载历史数据data = manager.load_history_data("ETHUSDT", "1min", start_time="2023-01-01 00:00:00", end_time="2023-01-31 23:59:59")# 打印数据print(data.head()) |
风险控制
vnpy内置了风险控制模块,帮助用户管理交易风险。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from vnpy.app.risk_manager import RiskManager# 创建风险管理器实例risk_manager = RiskManager()# 设置风险参数risk_manager.set_position_limit("ETHUSDT", 10) # 设置ETHUSDT的最大持仓为10手risk_manager.set_order_limit("ETHUSDT", 5) # 设置ETHUSDT的最大挂单数为5# 检查订单是否通过风险控制order = risk_manager.check_order("ETHUSDT", "BUY", 1, 1000)if order:print("订单通过风险控制")else:print("订单未通过风险控制") |
事件驱动
vnpy采用事件驱动架构,保证了系统的高效运行和响应速度。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from vnpy.event import Event, EventEngine# 创建事件引擎实例event_engine = EventEngine()# 定义事件处理函数def on_order(event: Event):print(f"收到订单事件:{event}")# 注册事件处理函数event_engine.register(on_order, "ORDER")# 触发事件event_engine.put(Event("ORDER", {"data": "订单数据"})) |
日志管理
vnpy提供了日志管理功能,方便追踪和调试。
|
1
2
3
4
5
6
7
8
9
10
11
|
from vnpy.trader.utility import LogEngine# 创建日志引擎实例log_engine = LogEngine()# 设置日志级别log_engine.set_level("INFO")# 输出日志log_engine.info("这是一条信息日志")log_engine.error("这是一条错误日志") |
回测框架
vnpy的回测框架可以帮助用户在历史数据上测试策略性能。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from vnpy.app.cta_strategy import CtaBacktestingModefrom vnpy.app.cta_strategy.backtesting import BacktestingEngine# 创建回测引擎实例engine = BacktestingEngine()# 设置回测参数engine.set_parameters(mode=CtaBacktestingMode, interval="1min", start_time="2023-01-01 00:00:00", end_time="2023-01-31 23:59:59")# 添加策略engine.add_strategy(MyStrategy, {"name": "MyStrategy", "vt_symbol": "ETHUSDT", "setting": {}})# 运行回测engine.run_backtesting()# 输出回测结果print(engine.get_result()) |
vnpy的高级功能
事件驱动引擎
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
vnpy`` 使用事件驱动模型,使得交易处理更加高效。以下是一个简单的事件处理示例:```pythonfrom vnpy.event import Event, EventEngine# 创建事件引擎engine = EventEngine()# 定义事件处理函数def on_bar(event: Event):print(f"Received bar data: {event.data}")# 注册事件处理函数engine.register(on_bar, Event.BAR)# 模拟发送事件engine.put_event(Event(Event.BAR, "2021-01-01 10:00:00"))# 启动事件引擎engine.start() |
多交易所支持
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
vnpy`` 支持多个交易所,使得用户可以在一个平台管理多个交易所的账户。以下是如何添加一个交易所的示例:```pythonfrom vnpy.app.cta_strategy import CtaEnginefrom vnpy.gateway.bitfinex import BitfinexGateway# 创建策略引擎engine = CtaEngine()# 添加Bitfinex交易所engine.add_gateway(BitfinexGateway)# 配置交易所连接信息engine.set_gateway_config("Bitfinex", {"key": "your_api_key", "secret": "your_api_secret"}) |
策略管理
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
vnpy`` 提供了强大的策略管理功能,支持策略的创建、加载和运行。以下是一个简单的策略示例:```pythonfrom vnpy.app.cta_strategy import CtaTemplate, BarGenerator, ArrayManagerclass MyStrategy(CtaTemplate):author = "Your Name"# 策略参数parameter = 10def __init__(self, cta_engine, strategy_name, vt_symbol, setting):super().__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar)self.am = ArrayManager()def on_init(self):self.write_log("策略初始化")self.load_bar(10)def on_bar(self, bar):self.am.update_bar(bar)if not self.am.inited:return# 策略逻辑if self.am.cross_over(self(parameter)):self.buy(bar.close_price, 1)elif self.am.cross_below(self(parameter)):self.sell(bar.close_price, 1)# 加载策略engine.add_strategy(MyStrategy, {"vt_symbol": "BTC/USDT", "setting": {"parameter": 20}}) |
风险控制
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
vnpy`` 提供了完善的风险控制功能,包括资金管理、止损和止盈等。以下是一个简单的风险控制示例:```pythonfrom vnpy.app.cta_strategy import CtaTemplateclass MyStrategy(CtaTemplate):# 策略参数max_position = 10 # 最大持仓def on_order(self, order):if order.status == Status.ALL特拉DED:if order.direction == Direction.LONG:self.position += order.volumeelif order.direction == Direction.SHORT:self.position -= order.volume# 检查是否超过最大持仓if abs(self.position) > self.max_position:self.write_log("超过最大持仓,平仓操作")self.close_all()def on_stop_order(self, stop_order):# 处理止损订单if stop_order.status == Status.ALL特拉DED:self.write_log("止损订单触发,平仓操作")self.close_all() |
数据存储
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
vnpy`` 支持将历史数据存储到数据库中,方便后续分析和回测。以下是如何将数据存储到数据库的示例:```pythonfrom vnpy.app.data_manager importDataManager# 创建数据管理器manager = DataManager()# 添加数据到数据库manager.save_data("tick_data", tick_data)manager.save_data("bar_data", bar_data)# 查询数据data = manager.load_data("tick_data", start_time="2021-01-01", end_time="2021-01-02") |
多语言支持
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
vnpy`` 支持多种编程语言,包括 Python、C++ 和 Java 等。以下是一个使用 C++ 扩展的示例:```cpp#include < vnpy/vnpy.hpp>class MyExtension : public Extension {public:MyExtension() : Extension("MyExtension") {}void on_init() override {// 初始化代码}void on_bar(Bar& bar) override {// 处理K线数据}};extern "C" Extension* create_extension() {return new MyExtension();} |
量化交易平台
通过整合以上高级功能,vnpy 可以构建一个完整的量化交易平台,以下是一个简单的交易流程示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
from vnpy.app.cta_strategy import CtaEnginefrom vnpy.app.data_manager import DataManagerfrom vnpy.gateway.bitfinex import BitfinexGateway# 创建策略引擎cta_engine = CtaEngine()# 创建数据管理器data_manager = DataManager()# 添加交易所cta_engine.add_gateway(BitfinexGateway)# 配置交易所连接信息cta_engine.set_gateway_config("Bitfinex", {"key": "your_api_key", "secret": "your_api_secret"})# 加载策略cta_engine.add_strategy(MyStrategy, {"vt_symbol": "BTC/USDT", "setting": {"parameter": 20}})# 数据存储data_manager.save_data("tick_data", tick_data)data_manager.save_data("bar_data", bar_data)# 启动策略引擎cta_engine.start() |
vnpy的实际应用场景
量化交易策略开发
在量化交易中,vnpy 提供了一套完整的框架,便于开发、测试和部署交易策略。以下是一个简单的双均线策略示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
from vnpy.app.cta_strategy import (CtaTemplate,BarGenerator,ArrayManager,TickData,BarData,TradeData,OrderData)class DoubleMaStrategy(CtaTemplate):author = "AI"ma_short = 5ma_long = 10fixed_size = 1parameters = ["ma_short", "ma_long", "fixed_size"]variables = []def __init__(self, cta_engine, strategy_name, vt_symbol, setting):super().__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar)self.am = ArrayManager()def on_init(self):self.write_log("策略初始化")self.load_bar(10)def on_start(self):self.write_log("策略启动")self.put_event()def on_stop(self):self.write_log("策略停止")self.put_event()def on_tick(self, tick: TickData):self.bg.update_tick(tick)def on_bar(self, bar: BarData):self.am.update_bar(bar)if not self.am.inited:returnshort_ma = self.am.sma(self.ma_short, array=True)long_ma = self.am.sma(self.ma_long, array=True)if short_ma[-1] > long_ma[-1] and short_ma[-2] <= long_ma[-2]:self.buy(bar.close_price, self.fixed_size)elif short_ma[-1] < long_ma[-1] and short_ma[-2] >= long_ma[-2]:self.sell(bar.close_price, self.fixed_size) |
风险管理
vnpy 支持多种风险管理策略,包括止损、止盈等。以下是一个简单的止损策略示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class StopLossStrategy(CtaTemplate):author = "AI"stop_loss_threshold = 0.02 # 设置止损阈值parameters = ["stop_loss_threshold"]variables = ["trading_price"]def __init__(self, cta_engine, strategy_name, vt_symbol, setting):super().__init__(cta_engine, strategy_name, vt_symbol, setting)self.trading_price = 0def on_init(self):self.write_log("策略初始化")self.load_bar(10)def on_start(self):self.write_log("策略启动")self.put_event()def on_stop(self):self.write_log("策略停止")self.put_event()def on_tick(self, tick: TickData):if self.pos_long > 0:if tick.last_price < self.trading_price * (1 - self.stop_loss_threshold):self.sell(tick.last_price, abs(self.pos_long))self.write_log("触发止损,平仓") |
套利交易
vnpy 支持套利交易策略的开发,以下是一个简单的统计套利策略示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
class StatisticalArbitrageStrategy(CtaTemplate):author = "AI"ma_window = 30hedge_ratio = 1.0parameters = ["ma_window", "hedge_ratio"]variables = []def __init__(self, cta_engine, strategy_name, vt_symbol, setting):super().__init__(cta_engine, strategy_name, vt_symbol, setting)def on_init(self):self.write_log("策略初始化")self.load_bar(10)def on_start(self):self.write_log("策略启动")self.put_event()def on_stop(self):self.write_log("策略停止")self.put_event()def on_bar(self, bar: BarData):# 假设有两个相关联的资产bar1 = self.get_bar("asset1")bar2 = self.get_bar("asset2")if bar1 and bar2:spread = bar1.close_price - bar2.close_price * self.hedge_ratioma_spread = self.calculate_ma(spread, self.ma_window)if spread < ma_spread:self.buy("asset1", 1)self.sell("asset2", self.hedge_ratio)elif spread > ma_spread:self.sell("asset1", 1)self.buy("asset2", self.hedge_ratio) |
账户管理
vnpy 提供了账户管理功能,可以方便地查询和管理账户资产。以下是一个查询账户余额的示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class AccountManagementStrategy(CtaTemplate):author = "AI"def on_init(self):self.write_log("策略初始化")self.load_bar(10)def on_start(self):self.write_log("策略启动")self.put_event()def on_stop(self):self.write_log("策略停止")self.put_event()def on_tick(self, tick: TickData):account = self.account()balance = account.balanceself.write_log(f"当前账户余额:{balance}") |
回测与优化
vnpy 支持策略的回测与优化,以下是一个简单的回测示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
from vnpy.app.cta_strategy import CtaTemplate, BarGenerator, ArrayManager, TickData, BarData, TradeData, OrderDatafrom vnpy.app.cta_backtesting import CtaBacktestingEngine, OptimizationSettingclass MeanReversionStrategy(CtaTemplate):author = "AI"entry_threshold = 0.02exit_threshold = 0.02parameters = ["entry_threshold", "exit_threshold"]variables = []def __init__(self, cta_engine, strategy_name, vt_symbol, setting):super().__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar)self.am = ArrayManager()def on_bar(self, bar: BarData):self.am.update_bar(bar)if not self.am.inited:returnif self.am.sma(20) < self.am.close[-1] * (1 - self.entry_threshold):self.buy(bar.close_price, 1)elif self.am.sma(20) > self.am.close[-1] * (1 + self.exit_threshold):self.sell(bar.close_price, 1)# 创建回测引擎engine = CtaBacktestingEngine()engine.set_parameters vt_symbol="EURUSD", interval="1m", start_date="2021-01-01 00:00:00", end_date="2022-01-01 00:00:00"engine.add_strategy(MeanReversionStrategy, {"entry_threshold": 0.02, "exit_threshold": 0.02})# 进行回测engine.run_backtesting() |
实盘交易
vnpy 支持实盘交易,以下是一个简单的实盘交易示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
from vnpy.app.cta_strategy import CtaTemplate, BarGenerator, ArrayManager, TickData, BarData, TradeData, OrderDatafrom vnpy.app.cta_trading import CtaTradingEngineclass RealTradingStrategy(CtaTemplate):author = "AI"ma_window = 20parameters = ["ma_window"]variables = []def __init__(self, cta_engine, strategy_name, vt_symbol, setting):super().__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar)self.am = ArrayManager()def on_bar(self, bar: BarData):self.am.update_bar(bar)if not self.am.inited:returnma_price = self.am.sma(self.ma_window, array=True)[-1]if self.am.close[-1] > ma_price:self.buy(bar.close_price, 1)elif self.am.close[-1] < ma_price:self.sell(bar.close_price, 1)# 创建交易引擎engine = CtaTradingEngine()engine.add_strategy(RealTradingStrategy, {"ma_window": 20})# 启动交易engine.start_trading() |
总结
vn.py 作为一个强大的交易编程框架,不仅提供了基础的功能模块,还拥有丰富的扩展性和社区支持。通过本文的介绍,我们相信你已经对 vn.py 有了更深入的了解,能够利用它来构建自己的交易策略,拓展自己的编程技能边界。继续探索 vn.py 的更多可能性,开启你的量化交易之旅。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。

