模块包目录 | module menu

level1:ciss_web\\|系统层目录

  • ciss_exhi\\: 网站展示相关网页
  • CISS_rc\\:策略功能平台如:应用app、数据库db、引擎bin等
  • ciss_vue\\:前端框架(无功能)
  • ciss_web\\:Django网站框架
  • static\\:静态文件如.html,.js等
  • 其他文件:db.sqlite3, manage.py, models.json, models.py,requirements.txt

level2:ciss_exhi\\: 网站展示相关网页

  • admin.py:
  • apps.py:
  • forms.py:
  • models.py:
  • search_indexes.py:
  • tests.py:
  • urls.py:
  • views.py:

level2:CISS_rc\\:策略功能平台

  • apps\\:个性化应用如主动基准active_bm、资产配置black_litterman、数据管理脚本rc_data等
  • bin\\:标准化脚本文件,如策略算法、组合分析、基金分析等
  • config\\:标准化配置文件
  • db\\:数据相关文件
  • docs\\: 说明文档
  • tests\\:
  • 其他文件:logs.txt,README.html

level3:apps\\:个性化应用

    数据管理:
  • rc_data\\:数据管理:数据下载、转换等
  • 组合和策略:
  • industrial_rotation\\:行业轮动策略
  • black_litterman\\:资产配置模型BL研究
  • industrial_rotation\\:行业轮动策略
  • bond\\:债券策略研究
  • rc_stra\\:个人策略脚本
  • 基准和指数:
  • active_bm\\:主动基准研究
  • rc_etf\\:ETF基金相关
  • 其他:
  • rc_self\\:个人工作日志
  • rc_coding\\:编程和软件开发学习相关
  • beida_mem\\:mem相关文件
  • temp\\:临时文档

level4:rc_data

    python:常用
  • test_wds_by-date.py:按交易日下载维护wds数据表
  • test_wds_data_transform.py:转换原始wds数据:个股历史行业数据
  • test_wds_data_transform_fund.py:计算基金持仓数据变动。
  • test_wds_manage.py:下载单个或特定数据表、连接pgsql数据库等
  • python:不常用
  • test_Wind.py:基于wind-API,用rC_Data_Initial下载股票日数据
  • test_Wind_single.py:基于wind-API,下载单只股票历史行情数据
  • rC_Data_Initial.py:用wind-API-python获取数据
  • test_data_html.py:将csv数据转化为html可以展示的形式
  • postgresql.py:学习postgresql和将wds表写入pgsql数据库
  • test_db_sql_manage.py:将csv数据IO读取或写入sqlite或pgsql数据库。
  • test_mdf_mdfreader.py:数据转换:csv to hdf5 or mdf-sqlserver
  • test_oracle_wind.py:已不用,下载oracle-wds数据表。
  • csv,xlsx:
  • 0wds_191120.xlsx:人工管理wds表格的各类信息
  • data_check_anndates.csv:wds表格下载的逐日跟踪表
  • code_list.csv:A股代码表,备份文件=code_list_202002.csv
  • date_list.csv:A股日期序列
  • list_table_wds_FICC.csv:wds债券相关表格
  • log_data_wds_tables.csv:wds跟踪表格列的信息
  • log_data_wds_columns.csv:wds跟踪表格列名的结构及中英文
  • log_data_wds_tables_columns.csv:跟踪的wds表所有列名称及信息


test_wds_data_transform_fund.py:计算基金持仓数据变动

file_path=CISS_rc\apps\rc_data\

    Head:概要
  • 功能: 1,历史个股行业分类, 2, 基金持仓变动, 3, 行业内个股的定性和定量数据;
  • Content: 具体功能
  • line 68,按一定的命名规则对文件夹内满足条件的文件改名
  • line 80,对于给定交易日至最新交易日,若有新股票无个券csv文件则新建该文件
  • line 按最新交易日行情对个股日行情内的交易日进行更新
  • line 给定交易日,计算当日所有股票行业分类
  • line 获取所有文件名称 |需要对每张表进行匹配分析
  • line 145,1,计算个股历史行业分类:对3个行业分类计算1~4级的代码,并单独保存成列值; 2,按照3个行业分类计算所属行业。 ;3,对每个股票,用行业数据生成全历史行业分类数据; 4,对于每个行业分类,匹配新旧2种行业分类
  • line

transform_wind_wds.py:转换wds数据

file_path=.\CISS_rc\db\db_assets\

print infomation

### print all modules for current clss
2.1,文件目录、文件名、csv文件列名称批量处理
rename_folder |按命名规则对文件夹内满足条件的文件改名,并对columns赋值
add_columns2table | 对文件夹内文件名字进行统一处理,并讲列名称赋值
2.2,A股股票行业分类处理
import_df_ind | 导入行业分类必备的数据文件
match_ind_name | 根据行业代码匹配行业分类表格内的行业名称、行业级数和是否弃用
get_ind_period |根据期初和期末日期获取股票所属行业
get_ind_date |给定交易日获取股票所属行业
2.3,导入历史交易日数据
import_df_dates | 导入历史交易日数据数据文件
2.6,用交易日数据填入单证券品种" )
update_date_pass_code |给定table,对于现有个券文件,用WDS_TRADE_DT_20200210_ALL.csv 填入 WDS_S_INFO_WINDCODE_000001.SZ_ALL.csv
update_newcode_from_date |对于给定交易日内,若有新股票无个券csv文件则新建该文件
2.4,导入基金数据和持仓数据
import_fund_list | 根据季末日期获取基金基础信息列表
import_df_fund | 导入基金数据相关的数据表格
2.5,计算基金持仓股票多维度变动
cal_diff_stockport | 计算季度之间的差异值,但不进行分析
get_period_indicator_diff | 获取区间股票价格、市值股本、财务指标变动和涨跌幅
2.6,计算指数定期调整
cal_index_constituents_adjustment| 计算指数调整


5分钟入手 |5 Minutes to CISS


{todo;1,安装\软硬件环境dependent}

核心功能 |Essential Functions


{todo;1,软硬件环境dependent}

  1. 假设,输入数据
  2. 分析指标  策略模型及信号
  3. 交易,账户计划管理
  4. 组合分析管理
  5. 多组合|多资产分析管理
  6. 基金受市场影响的资金变动
  7. 组织,出资方,监管的限制条件

数据管理 |Data Management


数据管理的功能主要通过“数据管理”目录实现,主要包括以下几类数据:时间数据、资产数据、投资相关基础信息数据、股票池数据、分析指标数据、方程和策略数据、交易信号数据、算法和最优化数据、交易数据、账户数据、组合数据、基金数据、团队数据、机构数据、市场数据、日志数据、用户数据、数据输入输出(In/Out,简称I/O)数据。时间数据子目录下可以对中国、香港和美国等不同国家不同市场的交易日、交易时间区别对待。多资产类别子目录内包含了数据脚本用于从信息服务商的数据接口(如Wind-API,Choice-API)抓取数据、初步分析后保存至本地。其他常用的数据服务商还有恒生,钱龙,恒泰,朝阳永续,各市场交易所等。以数据质量相对较高的某数据API为例,截止2018年12月,在获取香港、美国市场行情或财务基本面数据时仍然有很多诸如日成交金额、企业价值倍数等指标无法通过数据接口获得。因此在当前的策略开发过程中,人工复核和整理数据接口获取的数据还是不可或缺的。

数据格式csv json html , 类型bollean,int str datetime float 等 结构 时间序列, day weel quarter ,5month 数据输入/输出, pd, read 数据存储

目录

  1. 数据格式,类型和结构
  2. 时间序列
  3. 数据存储,输入输出(In/Out,简称I/O)数据
  4. 时间数据
  5. 资产数据
  6. 投资相关基础信息数据
  7. 股票池数据
  8. 分析指标数据
  9. 方程和策略数据
  10. 交易信号数据
  11. 算法和最优化数据
  12. 交易数据
  13. 账户数据
  14. 组合数据
  15. 基金数据
  16. 团队数据
  17. 机构数据
  18. 市场数据
  19. 日志数据
  20. 用户数据

策略分析 |Strategy Analysis

目录

  1. 假设,输入数据
  2. 分析指标  策略模型及信号
  3. 交易,账户计划管理
  4. 组合分析管理
  5. 多组合|多资产分析管理
  6. 基金受市场影响的资金变动
  7. 组织,出资方,监管的限制条件

模拟组合 |Portfolio Simulation


多资产管理 |Multi-Asset Investment


策略评估及可视化 |Strategy Evaluation and Visualization


策略平台网站 |Strategy Platform as Website

介绍策略平台网站的主要功能。


更新,协作,和开源 |Update,Cooperation and Open source


脚本功能实现架构

python脚本功能实现的经典/主要流程包括了: 1,apps\目录内的测试文件,通常前缀为“test_”;
2,db\目录下的data_io.py文件根据配置文件config\目录内的配置文件config_data.py导入数据 ;
3,bin\目录下的策略引擎_strategy.py依次引入stockpools.py,indicator.py,func_stra.py,signal.py,algo_opt.py生成最优配置策略组合;
4,bin\目录下的组合引擎根据策略配置构建模拟组合持仓、交易和净值,分为历史回测和逐日跟踪两大类;
5,bin\目录下的策略组合评估引擎对组合历史净值、持仓等进行评估;
6,bin\目录下的基金引擎在模拟组合基础上分析资金申购和赎回行为;


脚本注释和变量In/Out类型

200420重新设计了.py脚本的注释模板和变量In/Out类型的标准。

.py脚本的注释模板
  • 1,Class info | Function: 功能:
  • 1.1,功能:configuration for operating data.For instance, data from Wind API
  • 1.2,config_data :母类:主要配置目录path和数据参数para等
  • 1.2,config_data_factor_model:子类:多因子模型配置目录和数据参数等
  • 2,todo待办事项
  • 3,关联脚本:对应数据文件 | db\data_io.py
  • 4,OUTPUT: 1,obj_1["dict"],字典信息,json 2,obj_1["df"],表格信息,dataframe
  • 5,分析:目标是所有数据变量以object类型作为输入输出,其中主要是2个key: 1,obj_1["dict"]:字典格式,数据io都采用json的字典格式。 2,obj_1["df"]:DataFrame格式
  • 6,notes ; last update | since

子目录:相关编程学习和数据库


Python

Python变量和对象

python 判断一个变量是否已经定义
1,第一种方法使用内置函数locals(): 'testvar' in locals().keys()
同时判断变量是否属于局部变量列表或全局变量列表。
"df_out" in locals() or "df_out" in globals()
2,第二种方法使用内置函数dir(): dir():获取已定义对象列表
'testvar' in dir()
3, 第三种方法使用内置函数vars(): vars():获取已定义对象字典
vars().has_key('testvar')

list:
在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照原来list的长度进行遍历,所以会造成索引溢出。
删除list里的每个对象:
list解析 :squares = [x**2 for x in range(1,10)]
[i1*3 for i1 in list1 if i1 < 10]

print os.getcwd() #获取当前工作目录路径
改变当前目录:进入E 下面的files 文件 可以使用 os.chdir(E:\files).


Html5

html5的主要功能。


网页数据和Excel数据导入导出|html2excel

浏览器基本都支持data协议,所以我们可以使用该协议去将网页中的table转化为excel下载下来.url=https://www.jianshu.com/p/a3642877d590
对html 进行base64编码处理: 编码后的html内容增加前缀 data:application/vnd.ms-excel; ,即可使浏览器将其中的数据当做excel来处理,浏览器将提示下载或打开excel文件
data协议可以将网页中的table转化为excel下载; 编码后的html内容增加前缀 data:application/vnd.ms-excel; ,即可使浏览器将其中的数据当做excel来处理,浏览器将提示下载或打开excel文件
在html网页的注释里标明3个部分对应的匹配:table表格--js方程--按钮 。 match:1,table id="ciss_table;2,function tableToExcel,base64;3,button,tableToExcel
参考案例:file=quick.html

HTML大于号、小于号、空格、引号等常用的转义代码

HTML 原始码

显示结果

描述

&lt;

little than,小于号或显示标记

&gt;

greater than,大于号或显示标记

&amp;

&

可用於显示其它特殊字符

&quot;

"

引号

&nbsp;

 

空格:1个字母

&emsp;

空格:2个字母


Javascript

相关文件保存在子目录.\coding\\下。
入门在线学习资源:菜鸟教程:https://www.runoob.com/js/js-examples.html

  • 基础操作
  • 数据相关
  • 文件IO

基础操作

注释方法: /* blabla... */
单个语句;结尾
多个语句用{}包裹,如 if(test){ test=false;alert(test); }
在function(){} 中,"var x=1"是局部变量,function外不能用,"x=1"是全局变量,function外可用。
字符串:

数据相关


数据类型5+2:undefined,null,boolean,number,string;object,function
判断数据类型: typeof(x);typeof x
var x --> typeof(x) == undefined
var x = null --> typeof(x) == null
var x = 070 --> x=70
数值转换:y=true --> Number(y) =1;y=false --> Number(y) =0
y=null --> Number(y) =0;
y=undefined --> Number(y) =NaN;
string to number:y="123" --> Number(y) =123 ;
识别整数:识别到第一个非数字停下来,包括小数点 parseInt("1234blue") = 1234;parseInt("22.5") =22
number to string:var age=11, var age_str=age.toString()
方法二:String(x), 和toString()的区别,会返回null和undefined
Obejct类型:定义 var obj = new Object() ;

操作符:加减乘除等
age = age+1 ==== ++age;age = age-1 ==== --age
逻辑判断:非not,用感叹号, !false, !"blue",!"600036.SH"
逻辑判断:与and,用 && , a2 && b1
字符串比较:"Bea" < "asdff",因为大写字母排在小写字母后边,
x +=10; 等价于 x = x+10;

字符串比较:小于, "23" < 3 == false ,"23"会先被转化成23再比较
条件操作符: var result = ( a > b) ? a:b
如果a大于b,result=a,否则result=b

语句


1,if (a < b) { bla1 } ; else { bla2 } ;
2, do { bla } while ( a < b )
3, while( a < b ) { bla }
4, var x= 5; for( var i =0; i < x; i++ ){ alert(i) }
var i=0,count=10; for(;i < count;) { alert(i);i++; }
4.2,无限循环; for(;;) { blabla... }
4.3,枚举对象:for (var item in list_a ){ bla... }
break 和 continue的区别:前者会立刻跳出for(){}循环导致{}内最后一次不再计算, continue则会继续for(){}直到下一次停止。
layer_outermost:
for(var i=0;i < 10;i++){
  for(var j=0;j < 10;j++){
     if (i==5 && j==5){
       break layer_outermost;
     } num++;
   } }
在多个for(){} 之前定义layer_outermost,会帮助break直接跳到最外层的for循环。

多种情况语句:
switch (i) {
  case 25 : alert(i);
  case 20 : alert(i);
  case 35 : alert(i);
  default : alert("other");
  }
等价于:
if(i==25){
   alert( i ) ; }
else if (i==30){
   alert( i ) ; }
else if (i==35){
   alert( i ) ; }
else {
   alert( "other" ) ; }

函数|圆括号中参数用逗号隔开

JavaScript的Function(){}可以没有任何参数,直接引用arguments对象,在后续实例例子中定义好就行。
function sayHi(){
  alert("Hello" + arguments[0]+ arguments[1] ) ; }
例子:sayHi("a")
例子:sayHi(["a","b"])

arguments对象和参数变量一起用:

function doAdd(num1,num2){
   if (arguments.length == 1 ){
     return(num1+10);
  } else if ( arguments.length == 2 ){
     return arguments[0] + num2 ;}
   }
notes:doAdd(4,9) 情况下,arguments[0]==num1==4,arguments[1]==num2==9

function sum(x,y){
   return x+y; }

function diff(x,y){
  if (x < y){
    return y-x;
   }else {
    return x-y; }

对象Object定义

var person = new Object() ;
person.name = "Aaron" ;
alert( person.name );

var person = {
"name" : "Nike", "age": 29, 5: true } ;

var person = {} ; 定义Object,等于var person = new Object() ;
person.name= "Nike" ; 也等于person["name"]= "Nike" ;
person.age=29 ;

数组Array,就是python中的list

Array的每一项都可以保存任何类型的数据。
空数组 var code_list = new Array();var code_list = [];
var code_list =["600036.SH","000001.SZ"];
var code_list =new Array(20); 长度为20的list/Array
var len_list = code_list.length ;返回Array的长度
在Arrya末尾添加新项,code_list[ code_list.length ] ="688008.SH";
code_list[ code_list.length ] ="688026.SH" ;

判断变量list1是否是Array
alert(code_list instanceof Array );
或 if( Array.isArray(code_list) ){}
判断变量list1是否是Object
alert(code_list instanceof Object );
alert(code_list instanceof RegExp );
RegExp 是某种正则表达式,比如 var pattern1 = /[bc]at/i ;匹配第一个bat或者cat,不区分大小写。


var portfolio_1 = new Array();
portfolio_1[0] = new Object();
portfolio_1[1] = new Object();


栈方法:push和pop
var code_list = new Array();
var count = code_list.push(["600030.SH","000345.SZ"]) ;count=2;存入2项
var code = code_list.pop(); 取得list最后一项
排序:
var list1=[1,3,2,4]
list1.sort();升序排列
list1.reverse();倒叙排列
连接2个Arrya
var list2= list1.concat( 12,[13,24]);
list2=[1,3,2,4,12,13,24];
var list3= list2.slice(1,4); 得到第一个和第四个值并组成新的Array

splice(),删除、插入、替换
var removed_list = code_list.splice(0,2) ;删除前2项
var added_list = code_list.splice(3,0,"0700.HK","3968.HK") ;从第三项开始插入两项
var replaced_list = code_list.splice(2,1,"0700.HK","3968.HK") ;删除第2项,从第2项开始插入两项

判断位置:
code_listindexOf(4) ;返回第四个值。

数组Array的迭代方法

5种方法:every(),some(),filter(),forEach(),map()
1,code_list_judge=false,判断code_list中每个值都大于2
var code_list=[1,3,4,5,9]
var code_list_judge = code_list.every(
   function(item,index,array) {
    return(item>2);
   } )
2,code_list_judge=true,判断code_list中有部分值都大于2
var code_list_judge = code_list.some(
   function(item,index,array) {
    return(item>2);
   } )
3, 获取code_list中有部分值都大于2的项目
var code_list_sub = code_list.filter(
   function(item,index,array) {
    return(item>2);
   } )
4, 对code_list中每一项进行操作
var code_list_sub = code_list.map(
   function(item,index,array) {
    return item+2 ;
   } )
forEach() 和for(){}功能一样

日期Date类型

基础日期是19700101
var now = new Date();
var now = new Date( Date.parse("May 25,2004") );
Date.UTC() 返回日期的毫秒数
var y200001 = new Date( Date.UTC(2000,0)); 数字0表示2000年的第一个月,如果1表示2月;
var y200004 = new Date( Date.UTC(2000,4,5,9,30,15)); 20200405,09:30:15;
var y200004 = new Date( Date.UTC(2000,4,5,9 ));
y200001 < y200004 ; // true
小时数0-23
获取最新时间
var date0 = Date.now();等于 var date0 = +new Date() ;
日期格式化:y200001.toDateString();y200001.toTimeString();

正则表达式RegExp类型

范式:varexpression = / pattern / flags;其中flags标志有三种:
g,匹配所有满足条件的字符串 ;
i,匹配第一个复合条件的并停止,不区分大小写 ;
m,多行模式,匹配所有行的匹配项 ;
例子:/ .ai / gi; 即以"ai"结尾,且同时满足g和i的条件
例子: / \[aap\]54 / i ; 反斜杠用于输入特定非字母的符号等
例子:/ \.ai / gi; 即以".ai"结尾,且同时满足g和i的条件,等价于 "\\.ai"
字符串方法
search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。 replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
var str = "Visit Runoob!"; var n = str.search(/Runoob/i);
6
var str = "Visit Runoob!"; var n = str.search("Runoob");
6

替换 "microsoft" 为 "Runoob" :

Visit Microsoft!

test() 方法是一个正则表达式方法。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

例子:"life" 是否在 "The best things in life are free" 里:

匹配日期,如2019-08-03;
var temp_date ="2019-08-13";
var date_patt = / \d{4}-\d{2}-\d{2} / ;
if ( date_patt.test( temp_date ) ) {
   document.write( temp_date ); }
控制小数点数量:
var num=356.231569; alert( num.toFixed(2));
返回字符串长度; var str1="asdasdasd";str1.length ;
返回字符串其中一部分字符char; str1.substring(2,5);

对html不能直接显示的4个符号进行转换:
function htmlEscape(text) {
  return text.replace( / [<> " & ] / g,function( match,pos,originalText){
     switch(match) {
       case "<": return"\&\lt;";
       case ">": return"\&\gt;";
       case "&": return"\&\amp;";
       case """: return"\&\quot;";
      }
   } ) }

数学计算:
最大值,最小值;Math.max();Math.min();
自然对数Math.LN10();Math.LN2();Math.LOG10E();Math.LOG2E();
平方根Math.SQRT2();
四舍五入:向上Math.ceil(),向下Math.floor();,标准Math.round();
返回0~1的随机数,Math.random()


Vue

当下主流框架中,React、Angular、Vue 三足鼎立,我们和本书的原作者一样,在经过对它们的了解和实践以后,最终都惊叹于 Vue 简单而不失优雅的开发风格。如果没有深厚的编程功底以及设计能力,想要优雅地使用 React 会存在一些障碍 ;而对于 Angular 来说,对于个人开发者和中小型的应用又略显得“重”了,学习曲线也比较陡峭。但 Vue 对于个人开发者和中小型应用更友好,学习曲线也是渐进性的,非常适合用来入门和学习 MVVM框架中所涉及的通用知识和开发理念。
2019年初的三本书:深入浅出Vue.js;Vue.js快跑:构建触手可及的高性能Web应用;Vue.js从入门到项目实战;

Vue安装和环境准备

1,官网安装node.js;测试是否安装成功:CMD里输入 nodejs -v
直接运行npm install等命令会报错的。增加环境变量NODE_PATH 内容是:D:\nodejs\node_global\node_modules [对应的安装文件夹]
测试NPM安装vue.js ; 命令:npm install vue -g ;这里的-g是指安装到global全局目录去
NPM安装vue-router ;命令:npm install vue-router -g
npm: Nodejs下的包管理器。 webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包。
vue-cli: 用户生成Vue工程模板。(帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的依赖库,只需要 npm install就可以安装)
测试vue是否安装好,CMD输入: vue -v

2,新建VUE项目:选好文件夹,vue init webpack vue01
3,打开vue项目:To get started: cd vue_test ; npm run dev
输出: Your application is running here: http://localhost:8080
vue项目的文件目录:C:\ciss_web\static\templates\ciss_exhi\test\vue_test
vue项目组件的文件目录:..\vue_test\src\components
打开的网页网址 :http://localhost:8080

3,新建内容的步骤:
1,在文件 App.vue 中import组件,import compo_ciss from './component/compo_ciss.vue' vue教程:https://www.runoob.com/w3cnote/vue2-start-coding.html
https://www.runoob.com/vue2/vue-template-syntax.html ;https://cn.vuejs.org/v2/guide/ ;


Postgresql


CISS文档

目录

子目录:.py脚本相关

子目录:相关编程学习和数据库:

-->