- 进行自动的程序化股票交易
- 实现自动登录
- 支持命令行调用,方便其他语言适配
- 支持 Python3 / Python2, Linux / Win
- 有兴趣的可以加群
429011814
一起讨论
开发环境 : Ubuntu 16.04
/ Python 3.5
简单的股票量化交易框架 使用 easytrader 和 easyquotation
- 雪球组合 by @haogefeifei(说明)
pip install -r requirements.txt
华泰 / 佣金宝 的自动登录需要安装以下二者之一, 银河的自动登录需要安装下列的 tesseract:
JAVA
: 推荐, 识别率高,安装简单, 需要命令行下java -version
可用 (感谢空中园的贡献)tesseract
: 保证在命令行下tesseract
可用
pip install easytrader
注: Windows
用户 pip
安装时会提示 No module named xxx
, 请使用 pip install xxx
安装对应缺失的 module
, 然后再重新 `pip install easytrader, 可以参考此文档 INSTALL4Windows.md
pip install easytrader --upgrade
import easytrader
user = easytrader.use('yjb') # 佣金宝支持 ['yjb', 'YJB', '佣金宝']
user = easytrader.use('ht') # 华泰支持 ['ht', 'HT', '华泰']
注: 如果你的华泰账户是以 08
开头,而且可以正常登录,但是其他操作返回 账户记录表不存在
等错误时,请尝试 user = easytrader.use('ht', remove_zero=False)
user = easytrader.use('yh') # 银河支持 ['yh', 'YH', '银河']
user = easytrader.use('gf') # 广发支持 ['gf', 'GF', '广发']
user.prepare('ht.json') // 或者 yjb.json 或者 yh.json 等配置文件路径
注:
配置文件需要自己用编辑器编辑生成, 请勿使用记事本, 推荐使用 notepad++ 或者 sublime text
格式可以参照 Github
目录下对应的 json
文件
- 华泰需要配置
ht.json
填入相关信息,trdpwd
加密后的密码首次需要登录后查看登录POST
的trdpwd
值确定 - 佣金宝需要配置
yjb.json
并填入相关信息, 其中的password
为加密后的password
- 银河需要配置
yh.json
填入相关信息,trdpwd
加密后的密码首次需要登录后查看登录POST
的trdpwd
值确定, 以及登录POST
请求里面的hardinfo
字段 - 雪球配置中
username
为邮箱,account
为手机, 填两者之一即可,另一项改为""
, 密码直接填写登录的明文密码即可,不需要抓取POST
的密码
以下用法以佣金宝为例,华泰类似
user.balance
return
[{ 'asset_balance': '资产总值',
'current_balance': '当前余额',
'enable_balance': '可用金额',
'market_value': '证券市值',
'money_type': '币种',
'pre_interest': '预计利息' ]}
user.position
return
[{'cost_price': '摊薄成本价',
'current_amount': '当前数量',
'enable_amount': '可卖数量',
'income_balance': '摊薄浮动盈亏',
'keep_cost_price': '保本价',
'last_price': '最新价',
'market_value': '证券市值',
'position_str': '定位串',
'stock_code': '证券代码',
'stock_name': '证券名称'}]
user.entrust
return
[{'business_amount': '成交数量',
'business_price': '成交价格',
'entrust_amount': '委托数量',
'entrust_bs': '买卖方向',
'entrust_no': '委托编号',
'entrust_price': '委托价格',
'entrust_status': '委托状态', # 废单 / 已报
'report_time': '申报时间',
'stock_code': '证券代码',
'stock_name': '证券名称'}]
user.buy('162411', price=0.55, amount=100)
return
[{'entrust_no': '委托编号',
'init_date': '发生日期',
'batch_no': '委托批号',
'report_no': '申报号',
'seat_no': '席位编号',
'entrust_time': '委托时间',
'entrust_price': '委托价格',
'entrust_amount': '委托数量',
'stock_code': '证券代码',
'entrust_bs': '买卖方向',
'entrust_type': '委托类别',
'entrust_status': '委托状态',
'fund_account': '资金帐号',
'error_no': '错误号',
'error_info': '错误原因'}]
user.sell('162411', price=0.55, amount=100)
user.cancel_entrust('委托单号')
user.cancel_entrust('委托单号', '股票代码')
user.cancel_entrust('委托单号', '股票代码')
user.fundsubscribe('基金代码', '基金份额')
user.fundpurchase('基金代码', '基金份额')
user.fundredemption('基金代码', '基金份额')
user.fundmerge('基金代码', '基金份额')
user.fundsplit('基金代码', '基金份额')
需要注意通常券商只会返回有限天数最新的交割单,如查询2015年整年数据, 华泰只会返回年末的90天的交割单
user.exchangebill # 查询最近30天的交割单
user.get_exchangebill('开始日期', '截止日期') # 指定查询时间段, 日期格式为 "20160214"
return
{["entrust_bs": "操作", # "1":"买入", "2":"卖出", " ":"其他"
"business_balance": "成交金额",
"stock_name": "证券名称",
"fare1": "印花税",
"occur_balance": "发生金额",
"stock_account": "股东帐户",
"business_name": "摘要", # "证券买入", "证券卖出", "基金拆分", "基金合并", "交收证券冻结", "交收证券冻结取消", "开放基金赎回", "开放基金赎回返款", "基金资金拨入", "基金资金拨出", "交收资金冻结取消", "开放基金申购"
"farex": "",
"fare0": "手续费",
"stock_code": "证券代码",
"occur_amount": "成交数量",
"date": "成交日期",
"post_balance": "本次余额",
"fare2": "其他杂费",
"fare3": "",
"entrust_no": "合同编号",
"business_price": "成交均价",
]}
# 未确认的key有, farex, fare3
# 未确认的表头有 结算汇率, 备注
user.current_deal
return
[{'business_amount': '成交数量',
'business_price': '成交价格',
'entrust_amount': '委托数量',
'entrust_bs': '买卖方向',
'stock_account': '证券帐号',
'fund_account': '资金帐号',
'position_str': '定位串',
'business_status': '成交状态',
'date': '发生日期',
'business_type': '成交类别',
'business_time': '成交时间',
'stock_code': '证券代码',
'stock_name': '证券名称'}]
user.ipo_enable_amount('股票代码')
user.cnjj_redemption('股票代码', '赎回份额')
user.cnjj_apply('股票代码', '赎回份额')
user.nxbQueryPrice('基金代码')
user.nxbentrust('基金代码', '转入数量', '转换比例', '转换方向')
user.nxbQueryEntrust('开始日期,ex:20160515', '结束日期', '查询类型[0:历史, 1:单日]')
user.nxbQueryDeliverOfToday()
user.nxbQueryHisDeliver()
user.queryOfStkCode()
user.queryNXBOfStock()
python cli.py --use ht --prepare ht.json
注: 此时会生成 account.session
文件保存生成的 user
对象
python cli.py --get balance
python cli.py --do buy 162411 0.450 100
python cli.py --help
如何关闭 debug 日志的输出
user = easytrader.use('ht', debug=False)
编辑完配置文件,运行后出现 json
解码报错的信息。类似于下面
raise JSONDecodeError("Expecting value", s, err.value) from None
JSONDecodeError: Expecting value
请勿使用 记事本
编辑账户的 json
配置文件,推荐使用 notepad++ 或者 sublime text
[{
'资金帐号': 'x',
'参考市值': 10.1,
'资金余额': 10.1,
'可用资金': 10.1,
'总资产': 10.1,
'股份参考盈亏': 10.1,
'币种': '人民币'
}]
[{
'委托时间': '11:11:11',
'证券名称': 'x',
'成交数量': 100,
'股东代码': 'x',
'证券代码': 'x',
'状态说明': '已成',
'委托数量': 100,
'委托日期': '20160401',
'交易市场': '深A',
'撤单数量': 0,
'委托价格': 0.999,
'委托序号': '12345',
'买卖标志': '买入'
}]
[{
'参考市值': 10.1,
'参考盈亏': -0.0,
'当前持仓': 100,
'股份余额': 100,
'证券名称': 'x',
'参考市价': 0.111,
'卖出冻结': 0,
'买入冻结': 0,
'交易市场': '深A',
'证券代码': '123456',
'盈亏比例(%)': '0.00%',
'股份可用': 100,
'股东代码': 'x'
}]