个人构建自己的量化交易系统,用哪个框架好?

论坛 期权论坛 股票     
期权匿名问答   2023-2-10 17:46   9295   5
RT,我看到市面上有vnpy,quantaxis,aioquant,rqalpha等。但是不知道选择哪个比较好?目前个人使用所以希望开发效率比较高,易用性高,同时底层系统也要尽可能稳定些。本人使用语言为python。
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
期权匿名回答  16级独孤 | 2023-2-10 17:47:01 发帖IP地址来自 北京
我用backtrader,在其基础上封装了一下。不算一个完整的交易系统。拿来验证自己的想法挺方便的。
https://github.com/zwdnet/trade_strategy/blob/main/tradesys.py一个例子
https://github.com/zwdnet/trade_strategy/blob/main/07CHANNEL.py
3#
期权匿名回答  16级独孤 | 2023-2-10 17:47:06 发帖IP地址来自 中国
要做系统的自动量化交易必满足以下3个最基本的条件:
1.有一套自己的量化策略
2.能把自己的量化策略编写成程序
3.有一套量化交易框架
前面两个条件不是很难,大部分人学一点也能弄一点,最后一条就是门槛,大型机构可以使用大型券商提供的量化交易软件,但是也需要自己编写策略,这些量化交易软件一般用python语言。
个人没有太多好的选择,一般需要50W门槛资金存入券商账户,然后去熟悉券商的交易框架,他们的框架必须要把代码存到他们的服务器,调试 日志都非常的不方便!
我有15年的软件开发经验,从最早的C++桌面开发到后来的JAVA后台开发、移动和网页开发,都做了好多年,因此十分熟悉系统开发流程和各个操作系统环境。本人也使用过python一段时间,非常讨厌python的语言,虽然Math功能很强大,但是语法真是太烂了!
因此个人开发了一套基于JAVA的量化交易框架,JAVA语言是非常优秀的后台语言,生态非常的丰富,包括各种应用框架、日志、缓存等组件,语法也简单易懂,一般人学起来非常容易上手!
先放上软件运行效果图:


系统的部署结构如下图:



整个系统支持windows64位系统绿色部署,系统保罗jar包、dll、配置文件目录、加自动生成的日志目录和一个start启动脚本。不用安装任何其他环境,双击start就可以直接运行,程序的相关设置可以在策略服务器进行查看和修改,并直接生效!
目录结构介绍如下:
BAK 备份目录,当系统被不小心损坏时候可以还原相关数据
CONF 是配置文件目录,包括系统的一些基础配置和持仓信息
LOGS 是日志目录,记录系统运行状况
JDK 是运行环境,忽略
ORDER 是自动下单软件目录
STRATEGY 是自定义策略目录
这里比较重要的是STRATEGY目录,里面存放自己编写的策略jar包,系统在初始化的时候会自动jar包。
2.自定义策略框架
框架的作用如下:
1.获取行情数据,并通知策略
2.提供下单相关API,包括下单、持仓等
这节课先讲自定义策略的基本框架结构,先上图:
这是一个最基础的策略编写方法,自己大概需要编写不到10行的函数,就可以实现打板买入,第二天跌破均线卖出!
图上有很清楚的注释.
首先申明,不同的股票使用同一个策略不会互相干扰,大家都是在不同的内存空间运行,数据不会冲突!
tick 是一个分笔回调函数,就是股票的每笔成交都会通知到这个函数,同理minutes是分钟回调函数!
如果你也是技术控,也在潜心研究股市里的技术操作,不妨关注公众号(淘牛市) ,你会有更多的收获!
每天盘前9点半、准时更新独家文章和集合竞价股!

文章来自头条:菜鸡牛仔裤
原文链接:https://www.taoguba.com.cn/Article/3588051/1
4#
期权匿名回答  16级独孤 | 2023-2-10 17:47:53 发帖IP地址来自 北京
市场已经有许多优秀的专业量化平台和框架(请参见本人总结:阿岛格:当前国内的程序化交易量化交易,有哪些好的框架和工具?)
目前我的方案是自主开发,宗旨是低成本低门槛系统几乎全部选用开源第三方软件及模块, 采用简易快搭(争取5天内)的跨平台基于python的web框架 (网页演示版本见http://adog.net.cn/news ,注意是http, 不是https):

  • 基础级:Tradingview作为核心金融量化平台框架,python flask 作为 web框架。参考 :阿岛格专栏:低门槛搭建个人量化平台, 其中基本框架可以参考:第二天:基础框架
  • 进阶级:搭建一个自己的Ubuntu Linux 环境及Python语言, 平台采样B/S构架,交易服务器用window系统)。参见:阿岛格专栏:基于人工智能的量化投资 ,其中基本框架和软硬件目录可以参考: (3)软/硬件准备
基础版(低门槛搭建个人量化平台)的目的是,提供方法、共同探讨,一步一步让初入量化的朋友,白嫖免费的库和框架,快速搭建并集成属于自己的、基础级别量化分析框架。可以满足各种不同金融市场和资产类别,包括股票、债券、期货、股指期货、黄金、原油、数字货币等等,提供专业级别的量化分析指标,并且可以根据自己需求和要求,完全自主过滤、显示各式的专业图表。
由于捕捉市场信息的瞬息万变很重要,数据的实时性、准确性和易用性是量化平台的根本。 该量化平台比较了几种实时数据的接入方法,最后考虑了分钟级别的行情实时数据接入,而摈弃了秒级数据。这是可虑必须低成本入门级平台的工作效率与硬件负载的平衡结果。( 秒级更新在进阶版里实现)
另外平台考虑使用免费易用的跨环境(PC,手机,IPAD、Windows/Android/IOS)web服务的构架,也是为以后功能拓展、对接后台AI学习、多用户使用的进阶版量化分析平台而考虑的。
对于人工智能学习策略、模拟回测、实盘交易及系统监控,在进阶版和大家分享和讨论 (参见:阿岛格:基于人工智能的量化投资 )。
学习搭建AI量化系统,我自己是先从scikit-learn, theano,keras,到tensorflow的。现在看来有点走弯路,实际上可以从python,直接到tensorflow/pytorch更快速高效些(不清楚的再回看scikit-learn)。有同学感兴趣人工智能及量化平台,如果希望从零基础开始入门,可以直接到文章(阿岛格:量化交易,你选择用什么平台来搭建自己的业务体系:商业软件、开源软件、自主开发?)最后看【参考】。

基础版(低门槛搭建个人量化平台)的Demo 如下:

如有问题,请<a href="http://www.zhihu.com/people/adog-57-38" class="internal">阿岛格查看个人主页扫码“知shi星球(阿岛格)”加入讨论。
5#
期权匿名回答  16级独孤 | 2023-2-10 17:48:53 发帖IP地址来自 中国
一、基本思路

本框架的出发点是对真实交易过程的模仿,是一种仿真操作模型,包括了选股的过程,交易的过程,结算的过程,统计的过程等,是一个动态模型。
本框架的重点不在于交易策略,而在于框架的搭建。
本人Github仓库中有全部原码帮助有需要的人学习。本文的策略是基于大盘选股,而非单一股票的交易,可以通过修改策略函数来实现个股交易,但建议将本代码掌握清楚后才可尝试修改。
适合个人修改的代码框架,可以访问我的Github仓库
GitHub - Aegis1863/Quant_Trade_Frame: 量化交易,股票回测交易框架,仿真交易中的Solo_Stock_strategy.py文件
本模型包含的函数比较多,结构比较复杂,可以借助第三部分【策略思想和结构框架】部分来辅助理解。
二、数据来源

本框架的数据是基于Tushare的数据接口提取的,Tushare提供提取数据的接口代码示例,所用语言为Python,提取数据需要注册并获取token,此外需要注意积分权限。
注册Tushare大数据社区:
Tushare大数据社区本人Tushare ID:361998
Tushare数据接口截图:




日线接口



官方提供的接口代码示例

三、策略思想和结构框架

函数编写顺序并非执行顺序,请按照以下思路指引理解结构和功能。

  • 本代码的策略是选择每天成交量最大的十只股票进行买入,该策略效果较差,仅作示范。交易股票首先要进行一系列初始化且准备数据,before_market_open(self) 函数执行此功能,其中会引用函数get_tick(self) 来获取数据,引用count_day(self) 函数计算需要交易的天数;初始化后根据函数strategy(self)里面所写策略进行选股,形成股票池
  • 股票池传递给order_target_value(self) 进行交易,会计算手续费和总权益情况,其中会引用到交易函数trade(self) ,其中trade(self) 中会引用函数update_hold(self) 函数更新持仓情况。
  • after_market_close(slef) 盘后函数功能仅为将日期往后推一日。
  • 1~3步会在设定的时间内遍历,直到到达最终模拟日期。
  • 结束交易后,statistics(self) 函数对最终结果进行统计,全部交易过程也将保留。
  • picture_all(self) 函数以沪深300为基准对总权益进行绘图展示。
AstockTrading()         交易框架(类)
|- __init__()           初始化属性
|- get_tick()           获得行情数据
|- order_target_value() 将标的交易到指定仓位
|- before_market_open() 盘前初始化
|- after_market_close() 盘后函数
|- strategy()           策略函数
|- trade()              交易函数
|- update_hold()        更新持仓函数
|- picture_all()        作图函数
|- statistics()         统计函数
|- count_day()          用来计算起止日期中间有多少交易日,以此确定循环次数
|- run()                运行整个交易四、代码结构

引用的包

import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
import time定义类 class AstockTrading(),在__init__() 中设定属性。

诸如self._current_buy 均为类自身的属性,其值可以在类内部传递。
class AstockTrading(): # 策略类
    def __init__(self, stratege_name, Start_date, End_date, origin_total_value):
        token = '改成自己的token'
        self._pro = ts.pro_api(token)
        day = self._pro.trade_cal(exchange='', start_date=Start_date,
                                  end_date=End_date)
        self._current_buy = [] # 当天买入
        self._current_sell = [] # 当天卖出
        self._hands_list = [] # 当天买入手数
        self.start_date = Start_date
        self.end_date = End_date
        self._datum_target = '399300.SZ' # 基准标的,沪深300
        self._stratege_name = stratege_name
        self._origin_total_value = origin_total_value # 持仓总市值
        self._total_value = self._origin_total_value # 持仓初始市值
        ########## 主要属性 ↓
        self._daily_tick = pd.DataFrame([]) # 初始化每日行情,在get_tick函数里面赋值
        self._history_order = [] # 历史指令
        self._calendar = day[day['is_open'] == 1].cal_date.apply(str)
        # ↑ 交易日历,一次性赋值,列表,字符串
        self._buy_list = [] # 每日买入股票列表
        self._trade_number = 0 # 交易日期序号
        self._history_value = [] # 历史市值
        self._hold_stock = {} # 目前持仓股票
        self._connot_sell_stock = [] # 跌停股,不能卖
        self._base_rate = [] # 基准收益率
        self._my_rate = [] # 个人收益率
        self._new_calendar = pd.DataFrame([]) # 交易日历(作图用)
        self._result = pd.DataFrame([]) # 最后用于统计盘前初始化

    def before_market_open(self): # 盘前函数
        self._connot_sell_stock = []
        df2 = self._pro.suspend_d(suspend_type='S', \
            trade_date=self._calendar.iloc[self._trade_number]).ts_code
        self.get_tick() # 模拟交易前获取每日行情,相当于预先知道行情了,都是以收盘价交易
        limit_down_list = self._pro.limit_list(
            trade_date=self._calendar.iloc[self._trade_number],
            limit_type='D').ts_code # 当天跌停股票
        for stock in self._hold_stock: # 统计持仓里面哪些是跌停的
            if stock in list(limit_down_list) or stock in list(df2):
                self._connot_sell_stock.append(stock) # 持仓里面的跌停或停牌股列表计算交易日期数

    def count_day(self): # 计算交易日期数
        day = self._pro.trade_cal(exchange='', start_date=self.start_date,
                                    end_date=self.end_date)
        calendar = day[day['is_open'] == 1].cal_date.apply(str)
        return len(calendar)获取行情数据

    def get_tick(self): # 获取行情
        daily_tick = self._pro.daily(
            trade_date=self._calendar.iloc[self._trade_number]) # 原始每日行情数据
        self._daily_tick = daily_tick.sort_values('amount', ascending=False,
                                                  inplace = False) # 按成交额排序策略选股

    def strategy(self): # 策略重点修改这里
        # 选股策略是选出每日成交量最大的10个股票,特殊情况顺延
        df = self._daily_tick
        # ↑为了便于书写,self._daily_tick赋值为当日行情数据df
        self._buy_list = [] # 重新初始化买入列表
        for index in list(df.index):
            last_pchg = df.loc[index]['pct_chg']
            code = df.loc[index]['ts_code']
            if -3 <= last_pchg  <= 3:
                self._buy_list.append(code)
            if len(self._buy_list) == 10 - len(self._connot_sell_stock):
                break # 选到10支退出,排除跌停股,因此可能少于10个交易

    def trade(self):# 选股结束,开始交易
        df = self._daily_tick
        MonPerStock = self._total_value / len(self._buy_list)
        for stock in self._hold_stock: # stock 应当是代码字符串
            if stock not in self._buy_list and stock not in self._connot_sell_stock:
                # 如果已经持有的股票不在买入列表也没跌停或停牌,卖出
                self.order_target_value(stock, 0) # 目标卖空
                self._history_order.append(['{}, {}, {}手, 现价{}元, 卖空'.format(
                    df[df.ts_code==stock]['trade_date'].iloc[0],
                    stock,
                    'all',
                    float(df[df.ts_code==stock]['close'].iloc[0]))]) # 增加记录
        for stock in self._buy_list: # stock 应当是代码字符串
            self.order_target_value(stock, MonPerStock) # 目标买入
            self._history_order.append(['{}, {}, {}手 现价{}元, 买入'.format(
                    df[df.ts_code==stock]['trade_date'].iloc[0],
                    stock,
                    int(MonPerStock//float(df[df.ts_code==stock]['close'])//100),
                    float(df[df.ts_code==stock]['close'].iloc[0]))]) # 增加记录
        self.update_hold() # 更新持仓和市值
        self.after_market_close() # 盘后,日期加一更新持仓

    def update_hold(self): # 更新持仓和市值
        df = self._daily_tick
        for num in range(len(self._current_sell)):
            del self._hold_stock[self._current_sell[num]]
        for num in range(len(self._current_buy)):
            self._hold_stock[self._current_buy[num]] = \
                [int(self._hands_list[num]),
                 float(df[df.ts_code==self._current_buy[num]]['close'])]
        self._current_buy = [] # 当天买入
        self._current_sell = [] # 当天卖出
        self._hands_list = [] # 当天买入手数
        self._history_value.append(self._total_value) # 记录历史市值盘后函数

用于处理交易结束收盘后的剩余工作
    def after_market_close(self): # 盘后函数
        self._trade_number += 1 # 今日行情获取完毕之后,序号加1,下次获取下一日行情数据统计函数

用于对交易进行统计
    def statistics(self): # 统计结果
        # 把历史市值改成pd.Series形式
        plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
        self._new_calendar['trade_date'] = [datetime.strptime(day, '%Y%m%d').date()\
                                        for day in self._calendar]
        hs300 = self._pro.index_daily(ts_code=self._datum_target,
                                start_date=self.start_date,
                                end_date=self.end_date)
        hs300_close = list(hs300['close'][::-1]) # 沪深300收盘价
        for i in range(len(hs300_close)):
            self._base_rate.append((hs300_close - hs300_close[0])/hs300_close[0])
        # ↑ 沪深300累计收益率
        for i in range(len(self._history_value)):
            self._my_rate.append((self._history_value - \
                            self._origin_total_value)/self._origin_total_value)绘图函数

对权益变动情况进行绘制
    def picture_all(self): # 交易结束,作图和结算
        print('>> 最终市值{:.3f}元,收益率{:.3f}%\n'.format(self._total_value,
                                      (self._total_value - \
                                       self._origin_total_value)/\
                                          self._origin_total_value*100))
        self._result['历史市值'] = self._my_rate
        self._result['沪深300'] = self._base_rate
        self._result['超额收益'] = self._result['历史市值'] - self._result['沪深300']
        plt.plot(self._new_calendar, self._result)
        plt.legend(['历史市值', '沪深300', '超额收益'])
        plt.xlabel('日期',fontsize='15')
        plt.ylabel('收益率',fontsize='15')
        plt.title('{}策略'.format(self._stratege_name),fontsize=15)
        plt.grid()
        plt.show()运行函数

用于跑全部代码
    def run(self): # 运行全部交易流程
        days = self.count_day()
        for i in range(days): # 循环若干交易日
            time.sleep(0.05)
            self.before_market_open()
            self.strategy()
            self.trade()
            if (i+1)%5 == 0:
                print('>> 已完成{}天交易,还剩下{}天'.format(i+1,days-i-1)) # 通报进度
        print('## 交易完毕\n')
        self.statistics()
        self.picture_all() # 统计作图用户调用方法

mys = AstockTrading('amount_strategy', '20190101', '20190531', 1000000)
# 设定策略名称,交易起止日期,本金
mys.run() # 运行
print('利用以下命令查看相关信息:\n>> mys.picture_all() 显示图像')
print('>> mys._history_order 显示历史指令')最后

由于本文所调用的数据在Tushare中所需积分比较高,因此直接调用可能会获取数据失败,请先对照规则查看自己的积分是否足够。
本代码经测试,在积分权限正常的情况下,可以正常运行并且输出数据。
由于本人能力有限,可能存在一些代码冗余的问题,欢迎指正,本代码整体较为复杂,初学者可以学习思路和方法自己尝试编写框架。
6#
期权匿名回答  16级独孤 | 2023-2-10 17:49:30 发帖IP地址来自 北京
insking:TQPY--天勤介绍insking:TQPY--天勤十分钟入门insking:TQPY--交易策略示例和作业insking:TQPY--基于天勤的期货交易系统使用演示insking:TQPY--为什么要用交易框架insking:TQPY--框架运行流程insking:TQPY--策略父类Strategy:属性和方法1insking:TQPY--策略父类Strategy:属性和方法2insking:TQPY--Python反射和多线程insking:TQPY--实盘策略编写insking:TQPY--实盘期货交易系统数据库版本的演示insking:TQPY--什么是数据库insking:TQPY--Python操作数据库insking:TQPY--数据库版本交易系统代码解读
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP