135 lines
5.0 KiB
Python
135 lines
5.0 KiB
Python
# flake8: noqa
|
||
# encoding: UTF-8
|
||
|
||
# 功能:
|
||
# 每日夜盘扫描一次
|
||
# 根据账号所在目录下得cta_stock_setting.json,检查所有运行中网格策略实例的持仓合约,
|
||
# 如果当日存在除权除息情况,就进行计算更新
|
||
|
||
# AUTHOR:李来佳
|
||
# WeChat/QQ: 28888502
|
||
# 广东华富资产管理
|
||
|
||
import sys, os, copy, csv, json
|
||
|
||
import sys, os, platform
|
||
from datetime import datetime, timedelta
|
||
import pandas as pd
|
||
import traceback
|
||
import matplotlib
|
||
import json
|
||
from pymongo import *
|
||
|
||
from datetime import datetime
|
||
|
||
VNPY_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
|
||
if VNPY_ROOT not in sys.path:
|
||
print(f'append {VNPY_ROOT} into sys.path')
|
||
sys.path.append(VNPY_ROOT)
|
||
|
||
os.environ["VNPY_TESTING"] = "1"
|
||
from vnpy.trader.utility import load_json, save_json, append_data
|
||
from vnpy.data.stock.adjust_factor import get_adjust_factor, get_stock_base
|
||
from vnpy.trader.util_wechat import send_wx_msg
|
||
|
||
if __name__ == "__main__":
|
||
|
||
if len(sys.argv) <= 1:
|
||
print(u'请输入:{}目录下的子目录作为参数1'.format(os.path.abspath(os.path.join(VNPY_ROOT, 'prod'))))
|
||
exit()
|
||
|
||
# 进行报告的账号目录
|
||
account_folder = sys.argv[1]
|
||
account_folder = os.path.abspath(os.path.join(VNPY_ROOT, 'prod', account_folder))
|
||
|
||
# 策略实例配置文件
|
||
cta_setting_file = os.path.abspath(os.path.join(account_folder, 'cta_stock_setting.json'))
|
||
# 除权调整记录文件
|
||
adj_record_file = os.path.abspath(os.path.join(account_folder, 'data', 'adj_records.csv'))
|
||
field_names = ['date', 'strategy_name', 'vt_symbol', 'name', 'pre_volume', 'new_volume', 'rate', 'pre_back_adj',
|
||
'last_back_adj']
|
||
print('开始扫描:{}'.format(cta_setting_file))
|
||
if not os.path.exists(cta_setting_file):
|
||
print(u'不存在策略实例配置文件{}'.format(cta_setting_file), file=sys.stderr)
|
||
exit()
|
||
|
||
# 获取所有股票基本信息
|
||
all_symbols = get_stock_base()
|
||
|
||
# 读取策略
|
||
cta_settings = []
|
||
with open(cta_setting_file, encoding='UTF-8') as f:
|
||
cta_settings = json.load(f)
|
||
|
||
# 逐一策略扫描
|
||
all_margin_usage = 0
|
||
for strategy_name in cta_settings.keys():
|
||
# 获取策略实例配置
|
||
strategy_setting = cta_settings.get(strategy_name)
|
||
# 策略类
|
||
strategy_class = strategy_setting.get("class_name", "")
|
||
|
||
setting = strategy_setting.get('setting', {})
|
||
|
||
grids = load_json(os.path.abspath(os.path.join(account_folder, 'data', f'{strategy_name}_Grids.json')),
|
||
auto_save=False)
|
||
|
||
changed = False
|
||
|
||
margin_usage = 0
|
||
for grid in grids['dn_grids']:
|
||
if not grid['open_status']:
|
||
continue
|
||
|
||
vt_symbol = grid['vt_symbol']
|
||
info = all_symbols.get(vt_symbol,{})
|
||
name = info.get('name',vt_symbol)
|
||
factor = get_adjust_factor(vt_symbol)
|
||
if factor is None or len(factor) < 2:
|
||
print(f'没有找到{vt_symbol}的除权因子')
|
||
continue
|
||
|
||
# 检查除权日子的最后日期
|
||
last_data = factor[-1]
|
||
pre_data = factor[-2]
|
||
|
||
print(f'{vt_symbol}[{name}]复权因子:\n{pre_data} => \n{last_data}')
|
||
dividOperateDate = last_data['dividOperateDate']
|
||
foreAdjustFactor = float(last_data['foreAdjustFactor'])
|
||
adjusted_date = grid['snapshot'].get('adjusted_date', "")
|
||
yd_date = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
|
||
|
||
# 记录的除权执行日期,跟昨日或今日不一样,除权日发生在昨日或今日
|
||
if adjusted_date != dividOperateDate and dividOperateDate >= yd_date and foreAdjustFactor == 1.0:
|
||
adj_rate = last_data.get('backAdjustFactor') / pre_data.get('backAdjustFactor')
|
||
|
||
# 当前持仓
|
||
cur_volume = grid['volume']
|
||
# 除权后的股票新数量
|
||
adj_volume = int(cur_volume * adj_rate)
|
||
# 更新数量
|
||
grid['volume'] = adj_volume
|
||
|
||
# 更新执行日期
|
||
grid['snapshot'].update({'adjusted_date': dividOperateDate})
|
||
msg = f'{strategy_name}:{vt_symbol}[{name}]发生除权调整:{cur_volume}=>{adj_volume}'
|
||
send_wx_msg(msg)
|
||
print(msg)
|
||
append_data(adj_record_file, dict_data={
|
||
'date': dividOperateDate,
|
||
'strategy_name': strategy_name,
|
||
'vt_symbol': vt_symbol,
|
||
'name': name,
|
||
'pre_volume': cur_volume,
|
||
'adj_volume': adj_volume,
|
||
'rate': adj_rate,
|
||
'pre_back_adj': pre_data.get('backAdjustFactor'),
|
||
'last_back_adj': last_data.get('backAdjustFactor')
|
||
})
|
||
changed = True
|
||
|
||
|
||
if changed:
|
||
print('保存更新后的Grids.json文件')
|
||
save_json(os.path.abspath(os.path.join(account_folder, 'data', f'{strategy_name}_Grids.json')), grids)
|