#### **更新到了20160909版本,新增函数adjust_weight,用于雪球组合比例调仓,adjust_weight函数包含两个参数,stock_code 指定调仓股票代码,weight 指定调仓比例,其中weight向下取整,解决组合调仓bug**
#### **新版修复了登陆错误的问题,旧版修改方法如下**
**注:旧版雪球有一些小修改,所以造成之前的程序出现错误,修改方法如下:(感谢 @浮生浅斟唱)**
打开xqtrader.py - 转到152行 - 把“pos_end”改为“pos_end-2”。**新版该问题已修复。**
### 一、登陆教程
废话不多说,教程开始:
1. 下载【雪球组合连接-聚宽专用版】( 链接:http://pan.baidu.com/s/1slAJtnB 密码:qc08 )
2. 修改其中的`xq.json`文件:
- 配置文件需要自己用编辑器编辑生成, 请勿使用记事本, 推荐使用 [notepad++](https://notepad-plus-plus.org/zh/) 或者 [sublime text](http://www.sublimetext.com/)
- 雪球配置中 `username` 为邮箱, `account` 为手机, 填两者之一即可,另一项改为 `""`, 密码直接填写登录的明文密码即可
- 填入**自己的**雪球组合号。组合号查询方法如下图(**红色涂鸦地方隐去的地方**):
- 交易市场(例:us 或者 cn 或者 hk)

3. 修改完毕后,将所有文件传至个人研究 **根目录!** **根目录!** **根目录!**(即点击“投资研究”打开的那个页面,请别再问我什么是根目录了~)
4. 进入回测页面 - 新建回测 - 输入如下代码并编译运行:
```python
from api import *
from webtrader import WebTrader
def loading(context):
''' 登陆 '''
global user
user = use('xq')
user.prepare('xq.json')
def initialize(context):
g.security = ['600132.XSHG','600600.XSHG']
run_daily(loading, 'before_open')
run_daily(trade,'open')
run_daily(check, 'after_close')
def trade(context):
'''
交易
雪球组合的净值为1,easytrader使用1:1000000的比例放大。
price*amout为雪球组合的改变比例。
如下所示,如果price=10000,如果amount=1,比例则为1%;如果amount=10,比例则为10%
adjust_weight函数包含两个参数,stock_code 指定调仓股票代码,weight 指定调仓比例
其中weight向下取整,解决组合调仓bug
'''
user.adjust_weight(g.security[1][:6],10)
# user.buy(g.security[1][:6], price=10000, amount=1) #买入1%
# user.sell(g.security[0][:6], price=10000, amount=1) #卖出1%
def check(context):
''' 获取信息并输出 '''
log.info('获取今日委托单:')
log.info('今日委托单:', json.dumps(user.entrust,ensure_ascii=False))
log.info('-'*30)
log.info('获取资金状况:')
log.info('资金状况:', json.dumps(user.balance,ensure_ascii=False) )
log.info('enable_balance(可用金额):', json.dumps(user.balance[0]['enable_balance'],ensure_ascii=False))
log.info('-'*30)
log.info('持仓:')
log.info('获取持仓:', json.dumps(user.position,ensure_ascii=False))
log.info('enable_amount(可卖数量):', json.dumps(user.position[0]['enable_amount'],ensure_ascii=False))
```
5. 出现如下结果表明登陆成功,恭喜你!你可以开始实盘了!
6. **API用法见下方【二、交易API】**
7. **用法示例见下方【三、用法示例】**
#### **注:**
- ●因为改过文件内容,所以在研究模块无法进行测试。
- ●买入卖出只用股票代码六位数字,无后缀。因此从JoinQuant获取的到股票代码字符串只需取前六位即可,如stock[:6]即可。
### 二、交易API
#### 1. 设置账户:
```
user = use('xq')
```
#### 2. 登陆账户:
```
user.prepare('xq.json')
```
#### 3. 交易相关:
**雪球组合调仓:**
```
user.adjust_weight('000001', 10)
```
**获取资金状况:**
```
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': '证券名称'}]
```
**买入:**
```python
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': '错误原因'}]
```
**卖出:**
```python
user.sell('162411', price=0.55, amount=100)
```
**获取今日委托单:**
```
user.entrust
```
**return**
```
[{'business_amount': '成交数量',
'business_price': '成交价格',
'entrust_amount': '委托数量',
'entrust_bs': '买卖方向',
'entrust_no': '委托编号',
'entrust_price': '委托价格',
'entrust_status': '委托状态', # 废单 / 已报
'report_time': '申报时间',
'stock_code': '证券代码',
'stock_name': '证券名称'}]
```
**撤单:**
```none
user.cancel_entrust('委托单号', '股票代码')
```
### 三、用法示例
```python
from api import *
from webtrader import WebTrader
def loading(context):
''' 登陆 '''
global user
user = use('xq')
user.prepare('xq.json')
def initialize(context):
g.security = ['600132.XSHG','600600.XSHG']
run_daily(loading, 'before_open')
run_daily(trade,'open')
run_daily(check, 'after_close')
def trade(context):
'''
交易
雪球组合的净值为1,easytrader使用1:1000000的比例放大。
price*amout为雪球组合的改变比例。
如下所示,如果price=10000,如果amount=1,比例则为1%;如果amount=10,比例则为10%
adjust_weight函数包含两个参数,stock_code 指定调仓股票代码,weight 指定调仓比例
其中weight向下取整,解决组合调仓bug
'''
user.adjust_weight(g.security[1][:6],10) #调整到10%
# user.buy(g.security[1][:6], price=10000, amount=1) #买入1%
# user.sell(g.security[0][:6], price=10000, amount=1) #卖出1%
def check(context):
''' 获取信息并输出 '''
log.info('获取今日委托单:')
log.info('今日委托单:', json.dumps(user.entrust,ensure_ascii=False))
log.info('-'*30)
log.info('获取资金状况:')
log.info('资金状况:', json.dumps(user.balance,ensure_ascii=False) )
log.info('enable_balance(可用金额):', json.dumps(user.balance[0]['enable_balance'],ensure_ascii=False))
log.info('-'*30)
log.info('持仓:')
log.info('获取持仓:', json.dumps(user.position,ensure_ascii=False))
log.info('enable_amount(可卖数量):', json.dumps(user.position[0]['enable_amount'],ensure_ascii=False))
```
输出结果:
```
2015-12-31 15:10:00 - INFO - 获取今日委托单:
2015-12-31 15:10:00 - INFO - 今日委托单: [{'entrust_status': '\xe5\xb7\xb2\xe6\x8a\xa5', 'report_time': '2016-06-24 19:04:48', 'stock_name': u'\u9752\u5c9b\u5564\u9152', 'stock_code': u'SH600600', 'business_price': 0.0, 'business_amount': 100, 'entrust_no': 100764777, 'entrust_price': 0.0, 'entrust_bs': u'\u5356\u51fa', 'entrust_amount': 100}, {'entrust_status': '\xe5\xb7\xb2\xe6\x8a\xa5', 'report_time': '2016-06-24 19:04:48', 'stock_name': u'\u91cd\u5e86\u5564\u9152', 'stock_code': u'SH600132', 'business_price': 655.0000000000001, 'business_amount': 100, 'entrust_no': 100764779, 'entrust_price': 655.0000000000001, 'entrust_bs': u'\u4e70\u5165', 'entrust_amount': 100}]
2015-12-31 15:10:00 - INFO - ------------------------------
2015-12-31 15:10:00 - INFO - 获取资金状况:
2015-12-31 15:10:00 - INFO - 资金状况: [{'enable_balance': 313607.16000000003, 'pre_interest': 0.25, 'current_balance': 313607.16000000003, 'asset_balance': 1001300.0000000001, 'market_value': 687692.8400000001, 'money_type': u'\u4eba\u6c11\u5e01'}]
2015-12-31 15:10:00 - INFO - enable_balance(可用金额): 313607.16
2015-12-31 15:10:00 - INFO - ------------------------------
2015-12-31 15:10:00 - INFO - 持仓:
2015-12-31 15:10:00 - INFO - 获取持仓: [{'last_price': 1138.4781, 'market_value': 113847.81, 'stock_code': u'SH600600', 'income_balance': 0, 'current_amount': 100, 'enable_amount': 100, 'stock_name': u'\u9752\u5c9b\u5564\u9152', 'keep_cost_price': 1138.4781, 'position_str': 'xxxxxx', 'cost_price': 1138.4781}, {'last_price': 1761.2867000000003, 'market_value': 176128.67000000004, 'stock_code': u'SH600132', 'income_balance': 0, 'current_amount': 100, 'enable_amount': 100, 'stock_name': u'\u91cd\u5e86\u5564\u9152', 'keep_cost_price': 1761.2867000000003, 'position_str': 'xxxxxx', 'cost_price': 1761.2867000000003}]
2015-12-31 15:10:00 - INFO - enable_amount(可卖数量): 100
```
### 四、中文查看示例
输入:
```
a = [{u'stock_name': u'\u5927\u540c\u7164\u4e1a',u'amount': 100}]
jd = json.dumps(a,ensure_ascii=False)
log.info(jd)
```
输出:
```
2015-12-31 09:20:00 - INFO - [{"stock_name": "大同煤业", "amount": 100}]
```
### 五、[雪球组合模拟交易](https://github.com/shidenggui/easytrader/blob/master/doc/xueqiu.md)
因为雪球组合是按比例调仓的,所以模拟成券商实盘接口会有一些要注意的问题
- ●接口基本与佣金宝接口调用参数返回一致
- ●委托单不支持挂高挂低(开盘时间都是直接市价成交的)
- ●初始资金是按组合净值 1:1000000 换算来的
- ●委托单的委托价格和委托数量目前换算回来都是按1手拆的(雪球是按比例调仓的)
- ●持仓价格和持仓数量问题同上, 但持股市值是对的.
- ●一些不合理的操作会直接抛TraderError,注意看错误信息
---------
20160909 新增函数adjust_weight,用于雪球组合比例调仓
adjust_weight函数包含两个参数,stock_code 指定调仓股票代码,weight 指定调仓比例
其中weight向下取整,解决组合调仓bug
@莫邪的救赎 大神我想问个问题 假设你有个信号要用做过滤系统 在做系统测试的时候 一般怎么调整这个信号参数的 有时候太宽泛信号没用 有时候又会导致参数影响收益 你是record记录的 还是先把这个信号单独分析再加入系统的或者有没什么好的方法
2016-06-28
![2016-06-28_165906.png][1]
[1]: https://joinquant-image.b0.upaiyun.com/549dc8b310368d58ac3c13d8c8d9f938
中文你这样试试看行不行
2016-06-28
@Kyd 十分感谢,其实这个单独输出的话可以显示,就是在dict里面的时候会那个样子。
log.info(user.position[0]['stock_name'])的输出结果如下图
![360反馈意见截图18330917262720.png][1]
[1]: https://joinquant-image.b0.upaiyun.com/6bb4b02333116a0d18aef1e2f80e4e65
2016-06-28
@莫邪的救赎 try this one.
![2016-06-28_173344.png][1]
[1]: https://joinquant-image.b0.upaiyun.com/05631a145e099c8fed933a69985829ce
2016-06-28
@莫邪的救赎
#股票中文名------------------------------------------
```
def cname(stocks):
nn=''
if type(stocks)==list:
for stock in stocks:
nn+='['+get_security_info(stock).display_name+stock+']'
return nn
else:
return get_security_info(stocks).display_name+stocks
```
2016-06-28
@日记本 中文名直接打印是中文,就是想着直接调用的时候显示中文。不过已经搞定了。
json.dumps(user.position,ensure_ascii=False)
2016-06-28
@Kyd 十分感谢,json.dumps(user.position,ensure_ascii=False),这一句就可以了。
![heihei.png][1]
[1]: https://joinquant-image.b0.upaiyun.com/48ff20f88dfe8c789c8e6cbb0efb88c0
2016-06-28
之前就研究这个东西,但没发出来,因为这个越少人知道越好,太高调了券商会改网站接口就失效了,因为目前政策是禁止实盘的
2016-06-28