标签归档:quant

FreqTrade—又强又简单的Python加密货币自动交易机器人

Freqtrade 是一个用 Python 编写的免费开源加密货币交易机器人。它旨在支持所有主要交易所并通过 Telegram 或 webUI 进行控制。功能包含回测、绘图和资金管理工具以及通过机器学习的策略优化。

FreqTrade 加密货币自动交易机器人

目前支持的交易所:

特性:

  •  基于 Python 3.8+:适用于任何操作系统 – Windows、macOS 和 Linux。
  •  持久性:持久性是通过 sqlite 实现的。
  •  Dry-run:不花钱运行机器人。
  •  回测:模拟买入/卖出策略。
  •  通过机器学习进行策略优化:使用机器学习通过真实的交易所数据优化买入/卖出策略参数。
  •  边缘头寸规模计算您的胜率、风险回报率、最佳止损位并在为每个特定市场建立头寸之前调整头寸规模。
  •  白名单加密货币:选择你要交易的加密货币或使用动态白名单。
  •  黑名单加密货币:选择你想要避免的加密货币。
  •  内置 WebUI:内置 Web UI 来管理你的机器人。
  •  可通过 Telegram管理:使用 Telegram 管理机器人。
  •  以法定货币显示盈亏:以法定货币显示你的盈亏。
  •  表现状态报告:提供你当前交易的表现状态。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

在Linux/MacOS下,三行命令就能完成安装:

git clone -b develop https://github.com/freqtrade/freqtrade.git
cd freqtrade
./setup.sh --install

如果你无法克隆此项目,请在Python实用宝典公众号后台回复:freqtrade 下载。

Windows环境下打开Cmd(开始—运行—CMD),输入命令安装依赖:

git clone https://github.com/freqtrade/freqtrade.git
cd freqtrade
# 安装ta-lib
pip install build_helpers/TA_Lib-0.4.24-cp38-cp38-win_amd64.whl
pip install -r requirements.txt
pip install -e .
freqtrade

请注意,此处安装ta-lib时项目方提供了python3.8/3.9/3.10,其他Python版本请自行搜索下载。

输入freqtrade时,显示以下信息说明安装成功:

(freqtrade) D:\CODE\trader\freqtrade>freqtrade
2022-02-17 19:40:50,174 - freqtrade - ERROR - Usage of Freqtrade requires a subcommand to be specified.
To have the bot executing trades in live/dry-run modes, depending on the value of the `dry_run` setting in the config, run Freqtrade as `freqtrade trade [options...]`.
To see the full list of options available, please use `freqtrade --help` or `freqtrade <command> --help`.

2.Freqtrade 快速开始

下面教你如何开发一个简单的交易策略。

一个策略文件往往包含这些东西:

  • 指标
  • 购买规则
  • 卖出规则
  • 建议最低投资回报率
  • 强烈推荐止损

Freqtrade使用 Pandas 作为基础数据结构,它底层的OHLCV都是以Dataframe的格式存储的。

Dataframe数据流中每一行数据代表图表上的一根K线,最新的K线始终是数据库中最后一根。

> dataframe.head()
                       date      open      high       low     close     volume
0 2021-11-09 23:25:00+00:00  67279.67  67321.84  67255.01  67300.97   44.62253
1 2021-11-09 23:30:00+00:00  67300.97  67301.34  67183.03  67187.01   61.38076
2 2021-11-09 23:35:00+00:00  67187.02  67187.02  67031.93  67123.81  113.42728
3 2021-11-09 23:40:00+00:00  67123.80  67222.40  67080.33  67160.48   78.96008
4 2021-11-09 23:45:00+00:00  67160.48  67160.48  66901.26  66943.37  111.39292

Pandas 提供了计算指标的快速方法。为了从这种速度中受益,建议不要使用循环,而是使用矢量化方法。

矢量化操作在整个数据范围内执行计算,因此,与遍历每一行相比,在计算指标时要快得多。

dataframe.loc[(dataframe['rsi'] > 30), 'buy'] = 1

类似于上面这样的赋值方法,会自动设置rsi大于30的数据的buy列的值为1。

买入规则

def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    """
    Based on TA indicators, populates the buy signal for the given dataframe
    :param dataframe: DataFrame populated with indicators
    :param metadata: Additional information, like the currently traded pair
    :return: DataFrame with buy column
    """
    dataframe.loc[
        (
            (qtpylib.crossed_above(dataframe['rsi'], 30)) &  # Signal: RSI crosses above 30
            (dataframe['tema'] <= dataframe['bb_middleband']) &  # Guard
            (dataframe['tema'] > dataframe['tema'].shift(1)) &  # Guard
            (dataframe['volume'] > 0)  # Make sure Volume is not 0
        ),
        'buy'] = 1

    return dataframe

请注意,一定要不修改并返回”open”, “high”, “low”, “close”, “volume”列,这些是基础行情数据,如果返回错误的数据将可能会导致一些奇怪数据的产生。

如上所示的方法中,符合条件的数据的buy值会被设为1代表买入,否则为0或nan值。

卖出规则

def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    """
    Based on TA indicators, populates the sell signal for the given dataframe
    :param dataframe: DataFrame populated with indicators
    :param metadata: Additional information, like the currently traded pair
    :return: DataFrame with buy column
    """
    dataframe.loc[
        (
            (qtpylib.crossed_above(dataframe['rsi'], 70)) &  # Signal: RSI crosses above 70
            (dataframe['tema'] > dataframe['bb_middleband']) &  # Guard
            (dataframe['tema'] < dataframe['tema'].shift(1)) &  # Guard
            (dataframe['volume'] > 0)  # Make sure Volume is not 0
        ),
        'sell'] = 1
    return dataframe

与买入类似,这里不赘述了。

最小投资回报率

在类中增加这个初始化变量,能控制投资回报率:

minimal_roi = {
    "40": 0.0,
    "30": 0.01,
    "20": 0.02,
    "0": 0.04
}

上述配置意味着:

  • 只要达到 4% 的利润就卖出
  • 达到 2% 利润时卖出(20 分钟后生效)
  • 达到 1% 利润时卖出(30 分钟后生效)
  • 交易未亏损时卖出(40 分钟后生效)

此处的计算包含费用。

要完全禁用 ROI,请将其设置为一个非常高的数字:

minimal_roi = {
    "0": 100
}

虽然从技术上讲并没有完全禁用,但一旦交易达到 10000% 利润,它就会卖出。

止损

强烈建议设置止损,以保护资金免受不利的剧烈波动。

设置 10% 止损的示例:

stoploss = -0.10

一个完整代码如下:

# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
# flake8: noqa: F401
# isort: skip_file
# --- Do not remove these libs ---
from re import A
import numpy as np  # noqa
import pandas as pd  # noqa
from pandas import DataFrame

from freqtrade.strategy import (BooleanParameter, CategoricalParameter, DecimalParameter,
                                IStrategy, IntParameter)

# --------------------------------
# 你自己所需要的模块放在这里
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib


# This class is a sample. Feel free to customize it.
class SampleStrategy(IStrategy):
    """
    This is a sample strategy to inspire you.
    More information in https://www.freqtrade.io/en/latest/strategy-customization/
    You can:
        :return: a Dataframe with all mandatory indicators for the strategies
    - Rename the class name (Do not forget to update class_name)
    - Add any methods you want to build your strategy
    - Add any lib you need to build your strategy
    You must keep:
    - the lib in the section "Do not remove these libs"
    - the methods: populate_indicators, populate_buy_trend, populate_sell_trend
    You should keep:
    - timeframe, minimal_roi, stoploss, trailing_*
    """
    # Strategy interface version - allow new iterations of the strategy interface.
    # Check the documentation or the Sample strategy to get the latest version.
    INTERFACE_VERSION = 2

    # 设定最小投资回报
    minimal_roi = {
        "60": 0.01,
        "30": 0.02,
        "0": 0.04
    }

    # 止损
    stoploss = -0.10

    # 指标参数
    buy_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True)
    sell_rsi = IntParameter(low=50, high=100, default=70, space='sell', optimize=True, load=True)

    # K线时间
    timeframe = '5m'

    # 在新K线出现时执行
    process_only_new_candles = False

    # These values can be overridden in the "ask_strategy" section in the config.
    use_sell_signal = True
    sell_profit_only = False
    ignore_roi_if_buy_signal = False

    # 预准备K线数
    startup_candle_count: int = 30

    # 下单类型
    order_types = {
        'buy': 'limit',
        'sell': 'limit',
        'stoploss': 'market',
        'stoploss_on_exchange': False
    }

    # 订单有效时间(gtc: 除非取消否则一直有效)
    order_time_in_force = {
        'buy': 'gtc',
        'sell': 'gtc'
    }

    plot_config = {
        'main_plot': {
            'tema': {},
            'sar': {'color': 'white'},
        },
        'subplots': {
            "MACD": {
                'macd': {'color': 'blue'},
                'macdsignal': {'color': 'orange'},
            },
            "RSI": {
                'rsi': {'color': 'red'},
            }
        }
    }

    def informative_pairs(self):
        """
        Define additional, informative pair/interval combinations to be cached from the exchange.
        These pair/interval combinations are non-tradeable, unless they are part
        of the whitelist as well.
        For more information, please consult the documentation
        :return: List of tuples in the format (pair, interval)
            Sample: return [("ETH/USDT", "5m"),
                            ("BTC/USDT", "15m"),
                            ]
        """
        return []

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Adds several different TA indicators to the given DataFrame
        Performance Note: For the best performance be frugal on the number of indicators
        you are using. Let uncomment only the indicator you are using in your strategies
        or your hyperopt configuration, otherwise you will waste your memory and CPU usage.
        :param dataframe: Dataframe with data from the exchange
        :param metadata: Additional information, like the currently traded pair
        :return: a Dataframe with all mandatory indicators for the strategies
        """

        # Momentum Indicators
        # ------------------------------------

        dataframe['adx'] = ta.ADX(dataframe)
        dataframe['rsi'] = ta.RSI(dataframe)
        stoch_fast = ta.STOCHF(dataframe)
        dataframe['fastd'] = stoch_fast['fastd']
        dataframe['fastk'] = stoch_fast['fastk']

        # MACD
        macd = ta.MACD(dataframe)
        dataframe['macd'] = macd['macd']
        dataframe['macdsignal'] = macd['macdsignal']
        dataframe['macdhist'] = macd['macdhist']

        # MFI
        dataframe['mfi'] = ta.MFI(dataframe)

        # Bollinger Bands
        bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2)
        dataframe['bb_lowerband'] = bollinger['lower']
        dataframe['bb_middleband'] = bollinger['mid']
        dataframe['bb_upperband'] = bollinger['upper']
        dataframe["bb_percent"] = (
            (dataframe["close"] - dataframe["bb_lowerband"]) /
            (dataframe["bb_upperband"] - dataframe["bb_lowerband"])
        )
        dataframe["bb_width"] = (
            (dataframe["bb_upperband"] - dataframe["bb_lowerband"]) / dataframe["bb_middleband"]
        )

        # Parabolic SAR
        dataframe['sar'] = ta.SAR(dataframe)

        # TEMA - Triple Exponential Moving Average
        dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9)

        hilbert = ta.HT_SINE(dataframe)
        dataframe['htsine'] = hilbert['sine']
        dataframe['htleadsine'] = hilbert['leadsine']

        return dataframe

    def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Based on TA indicators, populates the buy signal for the given dataframe
        :param dataframe: DataFrame populated with indicators
        :param metadata: Additional information, like the currently traded pair
        :return: DataFrame with buy column
        """
        dataframe.loc[
            (
                # Signal: RSI crosses above 30
                (qtpylib.crossed_above(dataframe['rsi'], self.buy_rsi.value)) &
                (dataframe['tema'] <= dataframe['bb_middleband']) &  # Guard: tema below BB middle
                (dataframe['tema'] > dataframe['tema'].shift(1)) &  # Guard: tema is raising
                (dataframe['volume'] > 0)  # Make sure Volume is not 0
            ), 'buy'] = 1

        return dataframe

    def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        Based on TA indicators, populates the sell signal for the given dataframe
        :param dataframe: DataFrame populated with indicators
        :param metadata: Additional information, like the currently traded pair
        :return: DataFrame with sell column
        """
        dataframe.loc[
            (
                # Signal: RSI crosses above 70
                (qtpylib.crossed_above(dataframe['rsi'], self.sell_rsi.value)) &
                (dataframe['tema'] > dataframe['bb_middleband']) &  # Guard: tema above BB middle
                (dataframe['tema'] < dataframe['tema'].shift(1)) &  # Guard: tema is falling
                (dataframe['volume'] > 0)  # Make sure Volume is not 0
            ), 'sell'] = 1
        return dataframe
        

3.启动机器人

启动机器人前还需要设定配置,配置模板在 config/examples 下面。

比如币安的配置,你还需要输入key和secret:

"exchange": {
        "name": "binance",
        "key": "your_exchange_key",
        "secret": "your_exchange_secret",
  	    ......
	}
}

启动机器人:

freqtrade trade --strategy AwesomeStrategy --strategy-path /some/directory  -c path/far/far/away/config.json

–strategy-path 指定策略文件位置

-c 参数指定配置文件位置

比如我把策略放在了user_data/strategies下,配置放在了config_examples下,这么输入命令启动机器人即可:

freqtrade trade --strategy SampleStrategy --strategy-path user_data/strategies  -c config_examples/config_binance.example.json

由于篇幅问题,本文只是介绍了freqtrade的冰山一角,在启动机器人前,一定要进行回测并进行模拟交易。它还有TG通知功能、WebUI管理界面,详细的使用方法大家可以参考官方教程:

https://www.freqtrade.io/en/stable/

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

Tqsdk-python-天勤量化开发包,期货量化,实时行情/历史数据/实盘交易

TqSdk天勤量化交易策略程序开发包

TqSdk是一个由信易科技发起并贡献主要代码的开源Python库.依托快期多年积累成熟的交易及行情服务器体系,TqSdk支持用户使用极少的代码量构建各种类型的量化交易策略程序,并提供包含期货、期权、股票的历史数据-实时数据-开发调试-策略回测-模拟交易-实盘交易-运行监控-风险管理全套解决方案

from tqsdk import TqApi, TqAuth, TqAccount, TargetPosTask

api = TqApi(TqAccount("H海通期货", "4003242", "123456"), auth=TqAuth("信易账户", "账户密码"))      # 创建 TqApi 实例, 指定交易账户
q_1910 = api.get_quote("SHFE.rb1910")                         # 订阅近月合约行情
t_1910 = TargetPosTask(api, "SHFE.rb1910")                    # 创建近月合约调仓工具
q_2001 = api.get_quote("SHFE.rb2001")                         # 订阅远月合约行情
t_2001 = TargetPosTask(api, "SHFE.rb2001")                    # 创建远月合约调仓工具

while True:
  api.wait_update()                                           # 等待数据更新
  spread = q_1910["last_price"] - q_2001["last_price"]        # 计算近月合约-远月合约价差
  print("当前价差:", spread)
  if spread > 250:
    print("价差过高: 空近月,多远月")                            
    t_1910.set_target_volume(-1)                              # 要求把1910合约调整为空头1手
    t_2001.set_target_volume(1)                               # 要求把2001合约调整为多头1手
  elif spread < 200:
    print("价差回复: 清空持仓")                               # 要求把 1910 和 2001合约都调整为不持仓
    t_1910.set_target_volume(0)
    t_2001.set_target_volume(0)

要快速了解如何使用TqSdk,可以访问我们的十分钟快速入门指南

架构

系统架构图

功能

TqSdk提供的功能可以支持从简单到复杂的各类策略程序

  • 公司级数据运维,提供当前所有可交易合约从上市开始的全部Tick数据和K线数据
  • 支持市场上90%的期货公司实盘交易
  • 支持模拟交易
  • 支持Tick级和K线级回测,支持复杂策略回测
  • 提供近百个技术指标函数及源码
  • 用户无须建立和维护数据库,行情和交易数据全在内存数据库,无访问延迟
  • 优化支持熊猫麻木的
  • 无强制框架结构,支持任意复杂度的策略,在一个交易策略程序中使用多个品种的K线/实时行情并交易多个品种
  • 配合开发者支持工具,能够进行交易信号打点,支持自定义指标画图

安装

TqSdk仅支持Python3.6及更高版本。要安装TqSdk,可使用PIP:

$ pip install tqsdk

文档

在线阅读HTML版本文档:https://doc.shinnytech.com/tqsdk/latest

在线问答社区:https://www.shinnytech.com/qa

知乎账户[天勤量化]:https://www.zhihu.com/org/tian-qin-liang-hua/activities

用户交流QQ群:619870862(目前只允许给我们点过STAR的同学加入,加群时请提供GitHub用户名)

GUI

TqSdk本身自带的WEB_GUI功能,简单一行参数即可支持调用图形化界面,详情参考web_gui
TqSdk web_gui

关于我们

信易科技是专业的期货软件供应商和交易所授权行情服务商.旗下的快期系列产品已为市场服务超过10年。TqSdk是公司开源计划的一部分

Zipline-Zipline,一个Python算法交易库

ZiplineZipline是一个Pythonic算法交易库。它是用于回溯测试的事件驱动系统。Zipline目前在生产中用作回测和现场交易引擎供电Quantopian–建立和执行交易策略的免费、以社区为中心的托管平台。Quantopian还提供fully managed service for professionals其中包括Zipline、Alphalens、Pyfolio、FactSet数据等

功能

  • 易用性:Zipline试图为您让路,这样您就可以专注于算法开发。有关代码示例,请参见下面的内容
  • “含电池”:许多常见的统计数据,如移动平均和线性回归,都可以很容易地从用户编写的算法中访问
  • PyData集成:历史数据的输入和性能统计数据的输出基于Pandas DataFrames,可以很好地集成到现有的PyData生态系统中
  • 统计和机器学习库:您可以使用matplotlib、scipy、statsmodel和skLearning等库来支持最先进的交易系统的开发、分析和可视化

安装

Zipline目前支持Python 2.7、3.5和3.6,可以通过pip或conda安装

注:安装Zipline比一般的Python包稍微复杂一些。查看完整内容Zipline Install Documentation有关详细说明,请参阅

对于开发安装(用于开发Zipline本身),创建并激活一个viralenv,然后运行etc/dev-install脚本

快速入门

请参阅我们的getting started tutorial

以下代码实现了一个简单的双重移动平均算法

from zipline.api import order_target, record, symbol

def initialize(context):
    context.i = 0
    context.asset = symbol('AAPL')


def handle_data(context, data):
    # Skip first 300 days to get full windows
    context.i += 1
    if context.i < 300:
        return

    # Compute averages
    # data.history() has to be called with the same params
    # from above and returns a pandas dataframe.
    short_mavg = data.history(context.asset, 'price', bar_count=100, frequency="1d").mean()
    long_mavg = data.history(context.asset, 'price', bar_count=300, frequency="1d").mean()

    # Trading logic
    if short_mavg > long_mavg:
        # order_target orders as many shares as needed to
        # achieve the desired number of shares.
        order_target(context.asset, 100)
    elif short_mavg < long_mavg:
        order_target(context.asset, 0)

    # Save values for later inspection
    record(AAPL=data.current(context.asset, 'price'),
           short_mavg=short_mavg,
           long_mavg=long_mavg)

然后,您可以使用Zipline CLI运行此算法。首先,您必须下载一些定价和资产数据示例:

$ zipline ingest
$ zipline run -f dual_moving_average.py --start 2014-1-1 --end 2018-1-1 -o dma.pickle --no-benchmark

这将下载来自Quandl的资产定价数据,并在指定的时间范围内通过算法流式传输。然后,生成的Performance DataFrame保存在dma.pickle,您可以从Python中加载和分析

您可以在zipline/examples目录

有问题吗?

如果您发现了错误,请随时open an issue并填写问题模板

贡献

欢迎所有贡献、错误报告、错误修复、文档改进、增强和想法。有关如何设置开发环境的详细信息,请参阅我们的development guidelines

如果您希望开始使用Zipline代码库,请导航到GitHub问题选项卡,开始查看有趣的问题。有时会有一些问题被标记为Beginner FriendlyHelp Wanted

您可以随时在mailing list或打开Gitter

注意事项

请注意,Zipline不是一个由社区主导的项目。Zipline是由Quantopian工程团队维护的,我们很小,经常很忙

正因为如此,我们想警告您,我们可能在几个月甚至几年内不会处理您的拉请求、问题或直接提及。我们希望您能理解,我们希望这封信能帮助您减少任何挫败感或浪费时间。

Vnpy 基于Python的开源量化交易平台开发框架

vn.py是一套基于Python的开源量化交易系统开发框架,于2015年年1月正式发布,在开源社区6年持续不断的贡献下一步步成长为全功能量化交易平台,目前国内外金融机构用户已经超过600家,包括:私募基金、证券自营和资管、期货资管和子公司、高校研究机构、自营交易公司、交易所、Token Fund等。

全新的“vn.py全实战进阶”系列在线课程,已经在官方微信公众号[vnpy-社区访问数/每百万人:上线,覆盖cta策略(已完成)、期权波动率交易(更新中)等内容.购买请扫描下方二维码关注后,点击菜单栏的[进阶课程]按钮即可:

在使用vn.py进行二次开发(策略、模块等)的过程中有任何疑问,请查看vn.py项目文档,如果无法解决请前往官方社区论坛的[提问求助]板块寻求帮助,也欢迎在[经验分享]板块分享你的使用心得!

针对vn.py的金融机构用户,创建了一个专门的[vn.py机构用户群](QQ群号:676499931),主要分享机构应用方面相关的问题,如:银行间市场接入、资管O32系统、分布式部署等内容。请注意本群只对金融机构用户开放,加群时请注明:姓名-机构-部门.

功能特点

  1. 全功能量化交易平台(vnpy.trader),整合了多种交易接口,并针对具体策略算法和功能开发提供了简洁易用的接口,用于快速构建交易员所需的量化交易应用。
  2. 网关(vnpy.覆盖国内外所有交易品种的交易接口):
    • 国内市场
      • ctp(Ctp):国内期货、期权
      • CTP Mini(迷你):国内期货、期权
      • ctp证券(Sopt):etf期权
      • 飞马(女性):国内期货
      • 用友金融(恒生):国内期货、ETF期权
      • 飞创证券(秒):etf期权
      • 南华nhtd(Nhtd):国内期货、etf期权
      • 宽睿(OES):国内证券(A股)、ETF期权
      • 中泰xtp(Xtp):国内证券(A股)、etf期权
      • 国泰君安:国内证券(A股)
      • 恒生期权(Hsoption):etf期权
      • 华鑫奇点(TORA):国内证券(A股)、ETF期权
      • 星巴克(飞鼠):黄金TD、国内期货
      • 金仕达黄金(KS黄金):黄金TD
      • 鑫管家(Xgj):期货资管
      • 融航(罗洪):期货资管
      • 康星(中汇亿达):银行间市场
    • 海外市场
      • 富途证券(富图):港股、美股
      • 老虎证券(老虎):全球证券、期货、期权、外汇等
      • 互动经纪人(Ib):全球证券、期货、期权、外汇等
      • 易盛9.0外盘(TAP):全球期货
      • 直达期货(Da):全球期货
      • MetaTrader5(MT5):外汇、cfd、期货、股票
      • 羊驼(羊驼):美股(零佣金)
      • 卡西亚(佳兆业投资):港股
    • 数字货币
      • bitmex(Bitmex):数字货币期货、期权、永续合约
      • BYBIT(BYBIT):数字货币永续合约
      • 币安(二进制):数字货币现货
      • 币安永续(二进制):数字货币永续合约
      • OKEX(OKEX):数字货币现货、期货、永续、期权(V5统一账户)
      • 火币(火壁):数字货币现货
      • 火币期货(Hoobif):数字货币期货
      • 火币永续(霍比斯):数字货币永续
      • 霍比奥(火币期权):数字货币期权
      • Gate.io永续(Gateios):数字货币永续合约
      • 派生比特(派生比特),数字货币期权、永续合约
      • Bitfinex(Bitfinex):数字货币现货
      • Coinbase(Coinbase):数字货币现货
      • 位戳(位戳):数字货币现货
      • 1Token(一个Token):数字货币券商(现货、期货)
    • 特殊应用
      • rpc服务(Rpc):跨进程通讯接口,用于分布式架构
  3. 开箱即用的各类量化策略交易应用(vnpy.app):
    • cta_Strategy:cta策略引擎模块,在保持易用性的同时,允许用户针对cta类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)
    • cta_backtester:cta策略回测模块,无需使用Jupyter笔记本,直接使用图形界面直接进行策略回测分析、参数优化等相关工作
    • 价差交易:价差交易模块,支持自定义价差,实时计算价差行情和持仓,支持半自动价差算法交易以及全自动价差策略交易两种模式
    • OPTION_MASTER:期权交易模块,针对国内期权市场设计,支持多种期权定价模型、隐含波动率曲面计算、希腊值风险跟踪等功能
    • Portfolio_Strategy:组合策略模块,面向同时交易多合约的量化策略(阿尔法、期权套利等),提供历史数据回测和实盘自动交易功能
    • ALGO_TRADING:算法交易模块,提供多种常用的智能交易算法:twap、狙击手、冰山、BestLimit等,支持对接外部智能算法交易服务(如金纳算法)
    • SCRIPT_TRADER:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现repl指令形式的交易,不支持回测功能
    • 市场雷达:市场雷达模块,允许用户基于自定义的公式实时计算任意合约组合数据,公式支持标准Python运算语法以及内置函数
    • 纸质帐户:模拟交易模块,纯本地化实现的模拟交易功能,基于交易接口获取的实时行情进行委托撮合,提供委托成交推送以及持仓记录
    • Chart_Wizard:k线图表模块,基于RQ Data数据服务(期货)或者交易接口(数字货币)获取历史数据,并结合Tick推送显示实时行情变化
    • Portfolio_MANAGER:投资组合模块,面向各类基本面交易策略,以独立的策略子账户为基础,提供交易仓位的自动跟踪以及盈亏实时统计功能
    • rpc_SERVICE:rpc服务模块,允许将某一VN Trader进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统
    • DATA_MANAGER:历史数据管理模块,通过树形目录查看数据库中已有的数据概况,选择任意时间段数据查看字段细节,支持csv文件的数据导入和导出
    • 数据记录器:行情记录模块,基于图形界面进行配置,根据需求实时录制Tick或者K线行情到数据库中,用于策略回测或者实盘初始化
    • EXCEL_RTD:EXCEL RTD(实时数据)实时数据服务,基于PYXLL模块实现在EXCEL中获取各类数据(行情、合约、持仓等)的实时推送更新
    • RISK_MANAGER:风险管理模块,提供包括交易流控、下单数量、活动委托、撤单总数等规则的统计和限制,有效实现前端风控功能
  4. python交易接口接口封装(vnpy.api),提供上述交易接口的底层对接实现。
  5. 简洁易用的事件驱动引擎(vnpy.event),作为事件驱动型交易程序的核心。
  6. 对接各类数据库的标准化管理客户端(vnpy.database):
    • Sql类
      • sqlite(Sqlite):轻量级单文件数据库,无需安装和配置数据服务程序,vn.py的默认选项,适合入门新手用户
      • mysql(Mysql):世界最流行的开源关系型数据库,文档资料极为丰富,且可替换其他高newsql兼容实现(如tidb)
      • postgresql(Postgresql):特性更为丰富的开源关系型数据库,支持通过扩展插件来新增功能,只推荐熟手使用
    • Nosql类
      • mongodb(Mongodb):基于分布式文件储存(bson格式)的非关系型数据库,内置的热数据内存缓存提供更快读写速度
      • influxdb(Influxdb):针对时序数据专门设计的非关系型数据库,列式数据储存提供极高的读写效率和外围分析应用
  7. 跨进程通讯标准组件(vnpy.rpc),用于实现分布式部署的复杂交易系统。
  8. Python高性能K线图表(vnpy.Chart),支持大数据量图表显示以及实时数据更新功能。
  9. 社区论坛知乎专栏、内容包括vn.py项目的开发教程和Python在量化交易领域的应用研究等内容.
  10. 官方交流群262656087(QQ),管理严格(定期清除长期潜水的成员),入群费将捐赠给vn.py社区基金。

环境准备

  • 推荐使用vn.py团队为量化交易专门打造的Python发行版VNStudio-2.4.0,内置了最新版的vn.py框架以及VN站量化管理平台,无需手动安装
  • 支持的系统版本:Windows 7以上/Windows Server2008以上/Ubuntu18.04LTS
  • 支持的Python版本:Python3.764位(注意必须是Python3.764位版本)

安装步骤

这里下载最新版本,解压后运行以下命令安装:

窗口

install.bat

Ubuntu

bash install.sh

使用指南

  1. SimNow注册CTP仿真账号,并在该页面获取经纪商代码以及交易行情服务器地址.
  2. vn.py社区论坛注册获得VN站账号密码(论坛账号密码即是)
  3. 启动VN工作站(安装VN工作室后会在桌面自动创建快捷方式),输入上一步的账号密码登录
  4. 点击底部的VN Trader Lite按钮,开始你的交易!

注意:

  • 在VN交易员的运行过程中请勿关闭VN站(会自动退出)
  • 如需要灵活配置量化交易应用组件,请使用VN Trader Pro

脚本运行

除了基于VN站的图形化启动方式外,也可以在任意目录下创建run.py,写入以下示例代码:

from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy.gateway.ctp import CtpGateway
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_backtester import CtaBacktesterApp

def main():
    """Start VN Trader"""
    qapp = create_qapp()

    event_engine = EventEngine()
    main_engine = MainEngine(event_engine)
    
    main_engine.add_gateway(CtpGateway)
    main_engine.add_app(CtaStrategyApp)
    main_engine.add_app(CtaBacktesterApp)

    main_window = MainWindow(main_engine, event_engine)
    main_window.showMaximized()

    qapp.exec()

if __name__ == "__main__":
    main()

在该目录下打开Cmd(按住Shift->点击鼠标右键->在此处打开命令窗口/powershell)后运行下列命令启动VN交易员:

python run.py

贡献代码

vn.py使用github托管其源代码,如果希望贡献代码请使用gihub的PR(拉取请求)的流程:

  1. 创建 Issue-对于较大的改动(如新功能,大型重构等)最好先开Issue讨论一下,较小的Improval(如文档改进,BUGFIX等)直接发PR即可)
  2. 叉子vn.py–点击右上角叉子按钮
  3. 克隆你自己的分叉:git clone https://github.com/$userid/vnpy.git
    • 如果你的分叉已经过时,需要手动同步:同步方法
  4. 开发人员创建你自己的功能分支:git checkout -b $my_feature_branch dev
  5. 在$MY_FEATURE_BRANCH上修改并将修改推送到你的分叉上
  6. 创建从你的分叉的$MY_FEATURE_BRANCH分支到主项目的开发人员分支的[拉取请求]-在此点击跨分叉进行比较,选择需要的Fork和分支机构创建PR
  7. 等待审查,需要继续改进,或者被合并!

在提交代码的时候,请遵守以下规则,以提高代码质量:

  • 使用autopep8格式化你的代码.运行autopep8 --in-place --recursive . 即可.
  • 使用flake8检查你的代码,确保没有Error和警告。在项目根目录下运行flake8即可.

项目捐赠

过去6年中收到过许多社区用户的捐赠,在此深表感谢!所有的捐赠资金都投入到了vn.py社区基金中,用于支持vn.py项目的运作。

先强调一下:vn.py是开源项目,可以永久免费使用,并没有强制捐赠的要求!

捐赠方式:支付宝3216630132@qq.com(*晓优)

长期维护捐赠清单,请在留言中注明是项目捐赠以及捐赠人的名字.

其他内容

版权说明

麻省理工学院