使用Python实现构建量化小程序 python的构造函数
目录
- 1 数据获取
- 2 应用架构
- 3 应用启动
- 4 代码
- 5 优化路线
1 数据获取
量化数据接口有很多,有tushare、alltick、xtquant等等。这篇文章小编将使用的是akshare库,它是开源的财经数据库,不仅包含股票、期货、期权、外汇、基金等常见的金融数据,还包括能源、事件、舆情和艺人指数这类不常见但可能影响市场行为的其他数据,可以说是目前市面上免费接口里最全的一个。
以获取深市A股历史日线数据为例,开头来说获取深市A股的股票信息:
import akshare as akstock_info = ak.stock_info_sz_name_code()stock_info.to_excel(‘stock_code.xlsx’)
2 应用架构
本应用基于dash框架、开源组件库feffery_antd_components与akshare金融数据接口开发的轻量级应用。app.py中进行应用对象的实例化,并构建应用的初始化页面内容;setting.css进行前端界面样式的调整;data储存的是深交所A股信息。
&8211; demo
&8211; data
&8211; stock_code.xlsx
&8211; assets
&8211; setting.css
&8211; app.py
3 应用启动
安装好当前项目依赖库,接着直接在终端执行python app.py
即可启动应用,按照控制台提示的信息,浏览器访问本地http://127.0.0.1:8050地址即可访问应用。
4 代码
app.pyimport pandas as pdimport dashfrom pyecharts import options as optsimport akshare as akfrom dash import Dash, html, dcc, callback, Output, Input, Stateimport dash_bootstrap_components as dbcfrom pyecharts.charts import Klineimport feffery_antd_components as fac 应用实例化app = Dash( __name__, title=’量化小应用’, update_title=’加载中…’, assets_url_path=’assets/setting.css’)app.layout = fac.AntdSpace([ dcc.Store(storage_type=’local’, id=’stock-code-store’, data=pd.read_excel(‘datastock_code.xlsx’, dtype=’A股代码’: ‘str’}).to_dict(‘records’)), fac.AntdFlex([ fac.AntdIcon(icon=’antd-right’, style=’color’: ‘0069d9’}), fac.AntdText(‘股票历史日线数据查询’, className=’header’) ]), fac.AntdFlex([ fac.AntdFlex([ ‘股票代码:’, dcc.Dropdown( id=’stock-dropdown’, multi=False, searchable=True, value=’000001′, placeholder=’股票代码’, style=’width’: ‘100px’} ), ], align=’center’, gap=’small’), fac.AntdFlex([ ‘日期:’, fac.AntdDateRangePicker( placeholder=[‘选择开始日期’, ‘选择结束日期’], id=’stock-dropdown datepicker’, size=’middle’, prefix=fac.AntdIcon(icon=’antd-calendar’) ), ], gap=’small’), fac.AntdButton( ‘搜索’, type=’primary’, id=’stock-dropdown btn’, loadingChildren=”查询中”, ), ], align=’center’, gap=’large’), fac.AntdCard( title=’收益概述’, headStyle=’background’: ‘rgba(0, 0, 0, 0.3)’, ‘text-align’: ‘left’}, id=’card-content’, className=’card’ ),], className=’container’)@app.callback( Output(‘stock-dropdown’, ‘options’), Input(‘stock-code-store’, ‘data’))def code_info(data): data = pd.DataFrame(data) data[‘A股代码’] = data[‘A股代码’].astype(‘str’) options = [ ‘label’: x, ‘value’: ‘sz’ + y} for x, y in zip(data[‘A股代码’], data[‘A股代码’]) ] return options@app.callback( Output(‘card-content’, ‘children’), Input(‘stock-dropdown btn’, ‘nClicks’), [State(‘stock-code-store’, ‘data’), State(‘stock-dropdown’, ‘value’), State(‘stock-dropdown datepicker’, ‘value’)], running=[(Output(‘stock-dropdown btn’, “loading”), True, False)],)def update(nClicks, data, value, date): stock_info = pd.DataFrame(data) stock_info = stock_info[stock_info[‘A股代码’] == value[2:]].to_dict(‘records’) title = stock_info[0][‘A股简称’] + ‘(SZ:’ + stock_info[0][‘A股代码’] + ‘)’ result = ak.stock_zh_a_daily(symbol=value, start_date=date[0], end_date=date[1]) result.rename(columns=’open’: ‘开盘价’, ‘close’: ‘收盘价’, ‘low’: ‘最低’, ‘high’: ‘最高’}, inplace=True) fig = ( Kline(init_opts=opts.InitOpts(width=’1200px’, height=’300px’)) .add_xaxis(list(result[‘date’])) .add_yaxis(series_name=’k线’, y_axis=result[[‘开盘价’, ‘收盘价’, ‘最低’, ‘最高’]].values.tolist(), itemstyle_opts=opts.ItemStyleOpts(color=’rgb(192, 51, 47)’, color0=’green’)) .set_global_opts( title_opts=opts.TitleOpts(title=f’date[0]}-date[1]}日K线’), yaxis_opts=opts.AxisOpts(name=’单位净值(元)’, min_=result[[‘开盘价’, ‘收盘价’, ‘最低’, ‘最高’]].min().min(), max_=result[[‘开盘价’, ‘收盘价’, ‘最低’, ‘最高’]].max().max()), tooltip_opts=opts.TooltipOpts(trigger=’axis’, axis_pointer_type=’cross’, formatter=’b}: c}’, border_color=’ccc’, background_color=’rgba(245, 245, 245, 0.8)’), datazoom_opts=opts.DataZoomOpts(is_show=True, range_start=result[‘date’].min(), range_end=result[‘date’].max()), ) .set_series_opts( markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_=’max’, name=’最高价’, value=result[‘最高’].max()), opts.MarkPointItem(type_=’min’, name=’最低价’, value=result[‘最低’].min())], symbol=’pin’), splitline_opts=opts.SplitAreaOpts(is_show=True), linestyle_opts=opts.LineStyleOpts(type_=’dashed’, color=’lightgrey’), ) ) fig.render(‘kline.html’) card_layout = [ fac.AntdRow(title, className=’card-content title’, wrap=True), fac.AntdRow([ fac.AntdCol([ fac.AntdText(‘最高:’, className=’card-content index’), fac.AntdText(result[‘最高’].max(), className=’card-content value’, style=’color’: ‘red’}) ]), fac.AntdCol([ fac.AntdText(‘最低:’, className=’card-content index’), fac.AntdText(result[‘最低’].max(), className=’card-content value’, style=’color’: ‘green’}) ]), fac.AntdCol([ fac.AntdText(f’成交量:str(result[‘volume’].sum())}手’, className=’card-content index’),]), fac.AntdCol([ fac.AntdText(f’成交额:str(result[‘amount’].sum())}元’, className=’card-content index’),]), ], gutter=20), html.Iframe( srcDoc=open(‘kline.html’, ‘r’).read(), style= ‘height’: 300, ‘width’: ‘100%’, ‘align’: ‘center’ } ) ] return card_layoutif __name__ == ‘__main__’: app.run(debug=False)
/ setting.css/html,body background-color: ffffff; color: 000000; text-align: center !important; margin: 1%; padding: 1%; font-family: ‘Sans ser-if’;}.container display: grid; width: 1200px;}/ 深入了解样式 /.header font-size: 18px; font-weight: bold;}/ 卡片样式 /.card width: 1400px;}.ant-card-body display: flex; flex-direction: column;}.card-content }.title font-size: 24px; font-weight: bold;}.index font-size: 12px; font-weight: bold;}.value font-weight: bold;}
5 优化路线
由于这篇文章小编将涉及的数据交互与计算较少,历史数据获取的方式是直接调用akshare库,而该库有的数据不能频繁获取。若数据量增多,为进步体系效率与性能,需要采取适当的方式,将数据持久化保存到本地。
构建成多页面应用,一个页面存放一个指标
到此这篇关于使用Python实现构建量化小程序的文章就介绍到这了,更多相关Python构建量化程序内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
无论兄弟们可能感兴趣的文章:
- 使用Python写一个量化股票提醒体系
- 使用python批量化音乐文件格式转换的实例
- Python量化交易详细简介
- 使用Python编写截图轻量化工具
- Python使用GeekConcurrent实现量化编程