0%

一、与ML的比较

​ 可以从目标、步骤等方面进行比较。

​ Machine Learning的目的是寻找一个函数解决某个任务,通过一轮轮迭代更新模型参数以达到目的。常规步骤:定义一个含有未知参数的模型、定义模型的损失函数、根据损失函数使用优化器迭代模型。

​ Meta Learning则是指learning about learning。目的是使机器具有学习的能力,通过在任务A、B、C上的学习,能迅速掌握解决任务D的方法。具体的,根据李宏毅老师的课程:我们相当于要学习到一种Learning algorithm,以分类任务为例,我们可以输入二分类任务,如分类苹果和香蕉、太阳和月亮的任务,通过训练掌握Learning algorithm后可以很快解决猫猫和狗狗的分类问题。也有三个步骤:先决定what is learnable?典型的learnable component有网络框架、初始化参数、学习率等;随后定义损失函数;第三步依旧是优化器优化learnable component。在训练过程中每轮迭代解决一个训练任务,任务具有训练数据与测试数据,在训练数据上训练,损失函数定义在训练任务的测试数据上以评估该任务上训练出模型的好坏。最终meta-learning会在测试任务上进行测试,根据表现判断learnable component是否被学到了。

二、一些术语

​ 每轮训练的输入是一个training tasks, training tasks的数据分为Support set和Query set,分别用于该任务的训练和测试。一次训练成为一个Episode。

三、损失函数

Meta-learning-1

采用批量数据训练,Machine Learning的Loss是累和一个batch中所有example的预测值与Label之间的误差;

Meta Learning是一个Batch中所有task上面Loss的累和

四、Learnable component

1.Learning to initialize

经典论文Model-Agnostic Meta-Learning(MAML)

Reptile: https://arxiv.org/abs/1803.02999

How to train your MAML?

2.Optimizer
3.Network Architecture Search(NAS)

……

如何判断一个点是否在三角形内部?

做叉积,做三次叉积即可判断

反走样、可见性

光栅化后会产生锯齿?如何抗锯齿或反走样?

Aliasing,我们需要做反走样 Anti-Aliasing

Jaggies空间、位置采样的问题

Moire

Wagon wheel effect

本质是:信号变化太快以至于采样速度无法跟上

可以先模糊再光栅化

傅里叶级数与傅里叶变换

傅里叶级数用

图像频率与采样频率

滤波:滤掉特定频率的波

傅里叶变换:时域–>>频率

Filtering == Concolution == Averaging

卷积定理

时域上两个信号的卷积等价于频域上两个信号的乘积

如何做卷积?

  • 在时域(spatial domain)上直接卷积
  • 傅里叶变换到频域(frequency domain),在频域上做乘积,再逆傅里叶变换转化会时域

更大的卷积核对应更小的频域

Sampling=Repeating Frequency Contents

冲击函数时域到频域的转换–>>复制原始信号

如果采样函数频率太低,冲击函数距离不远,信号混叠。

Reduce Aliasing Error:

1.提高采样频率

2.先模糊再采样

对原始信号先进行处理,减小信号宽度,再以原始的间隔去复制的时候,不再产生信号的混叠

对每一个像素空间进行卷积求平均

MSAA:

Multi-sample anti-aliasing

将大像素划分为小像素,判断小像素是否再三角形内部。根据小像素在三角形内的覆盖率得到像素值

但是考虑到成本问题,工业界使用不规则的小像素分布,其中部分小像素还会被相邻区域复用

Visubility可见性问题

需要解决物体绘制在屏幕上的先后顺序

Painter’s Algirithm:先绘制远处物体,再逐渐把近处物体堆叠上去遮挡远处的物体

但是难以解决相互遮挡的问题。因为空间中的遮挡关系不是一个偏序关系,不满足传递性。

引入深度缓存z-buffer的概念

转换思路,从对物体排序到对像素排序,每次记录每个像素最浅位置的几何体

  • frame buffer stores color values
  • depth buffer stores depth

算法:

1
2
3
4
5
6
7
for (each triangle T)
for (each sample (x, y, z) in T)
if(z < zbuffer[x, y])
framebuffer[x, y] = rgb
zbuffer[x,y] = z
else
do nothing

Question:

  • 两个几何体有深度完全相同的点?

  • 与MSAA的结合,不是对每个像素做z-buffer而是对每个采样点

  • 透明物体不能用z-buffer

About Shadding

定义:

​ noun. The darkening or coloring of an illustration or diagram with parallel lines or a block of color.

​ The process of applying a matetial to an object.

着色与光照、与材料的关系

Simple Shading Model(Blin-Phong Reflectance Model)

Specular highlights, Diffuse reflection, Ambient lighting

三种光的区别是什么?如何描述?

考虑一个shading point,假设其邻域是一个极小的平面,从而可以定义

  • View direction
  • Surface normal
  • Light direction
  • Suraface parameters….

需要注意,shading not equals shadow。着色不考虑其他物体的存在,只考虑这个点自己,所以shading具有局部性。

Diffuse Reflection:

考虑单位面积接收到的能量,余弦定理易得。

Light off: 光的能量传播认为以球壳形状传播,光的能量应该与据光源的距离的平方成反比

能量接收与反射,看到的光是因为物体表面反射光,所以亮度与光的吸收率有关。

漫反射往四面八方反射的光的强度应该与观测角度无关

Specular Term:

观察方向与镜面反射方向相同或接近时,看到高光。

巧妙的变换:镜面反射方向与观测方向的角度等于法向方向与half vector的角度

强度是一个指数关系–高光往往只局限于很小的区域

Ambient Term

接收环境中的光

假设:每个点接收的环境光的强度都是相同的。环境光来源是四面八方,与光的源头无关,与观测的角度无关,与shading point的法向无关,所以是一个常数。

但是上述假设较为粗糙,经过了很大的简化。

L = La + Ld + Ls

​ = Ambient Term + Disfussion Term + Specular Term

但是Blin-Phong模型是一个很简化的模型

关于Shading Frequencies

Flat shading.三角形取三个点,确定一个平面,平面内色素值相同

Gouraud shading:对顶点上取点做shading,内部差值

Phong shading:对每个像素做shading

问题:

逐顶点的法线:用该顶点相邻面法向的平均,是否需要根据相邻面的大小进行加权平均?

已经知道顶点法线,如何得到内部点平滑的法线方向?

给顶点差值得到(利用重心公式)

Graphics(Real-time Rendering) Pipeline(图形管线)

1.含义:一些列操作,从三维空间中的点到图像

Input: vertices in 3D space –>> Vertices positioned in screen space –>> Triangles positioned in screen space –>> Fragments –>> Shaded fragments –>> Output: image

2.open-GL的shader program example

1
2
3
4
5
6
7
8
9
10
11
12
uniform sampler2D myTexture;
uniform vec3 lightDir;
varying vec2 uv;
varying vec3 norm;

void diffuseShader()
{
vec3 kd;
kd = texture2d(myTexture, uv)
kd *= clamp(dot(-lightDir, norm), 0.0, 1.0);
gl_FragColor = vec4(kd, 1.0)
}

Texture Mapping

1.如何定义物体的属性?

只研究物体表面,3维物体的表面是二维的

2.纹理映射到uv坐标系

Barycentric coordinates

为什么需要插值?

将三角形顶点的性质平滑延拓到内部,比如Texture coordinates, colors, normal vectors, depth

差值方法是利用重心坐标对三个顶点的属性进行线性加权

重心坐标的问题:不能保证在投影下重心坐标的不变性,所以重心坐标只适合二维平面的差值而不适合三维空间。所以三维空间中的属性建议先在三维空间中做插值在映射到二维平面

Applying Texture

利用重心坐标可以计算得到采样点对应的纹理坐标,在uv空间得到颜色

1
2
3
4
for each rasterized screen sample(x,y):
(u,v) = evaluate texture coordinate at(x,y)
texcolor = texture.sample(u,v)
set sample's color to texcolor

过于简单出现问题:

  • Texture Magnification.纹理太小,对应的纹理坐标不是整数。

    A picel on a texture – a texel.

    解决办法:

    Nearest,将最邻近的整点texel的像素作为值,但是是一个一个的方块

    Blinear interpolation,根据相邻四个texel的像素值在u方向与v方向进行线性插值。

    Bicubic interpolation,取16个点

  • Texture Magnification.纹理太大,会带来走样的问题

    屏幕上像素在纹理空间覆盖的区域大小不相同,覆盖大的区域的像素值如何获得?能直接用覆盖区域中心的texel的值吗?

    解决方法:

    超采样:类似的MSAA,增加采样点的数目,对于屏幕上每个像素增加采样点数目,在纹理空间采样。

    或者不采样:计算纹理空间覆盖区域的平均值。但是如何获取覆盖区域?

    Mipmap: Allowing(fast, approx, square)range queries

    Mipmap由一张图生成很多图,做法类似于2X2的池化,降采样的概念同CV中的图像金字塔。

    如何进行区域查询?对于屏幕上的一个像素,计算与相邻像素在纹理空间的距离,以距离的一半作为在纹理空间上覆盖区域的边长的一半。

    如何利用Mipmap查询区域的像素值?D = log2L,寻找对应层上的像素。如果D不是整数怎么办?先利用双线性插值在相邻两层间插值出对应位置的像素值,再在层与层之间做一次插值。

    但是MipMap的问题:出现Overblur,对于远处物体会模糊其细节。

    Anisotropic Filtering(各向异性滤波):部分解决三线性插值的问题。MipMap做长宽相同的图,Anisotropic Filtering做长宽不同的预计算。

点查询问题与范围查询问题?平均范围与其他范围查询?

Application of textures

Environment Map:

将四面八方的光记录下来就是Environment Map.

Spherical Map:

将环境光记录在球上再展开,但是存在问题:球面产生扭曲–>>cubic map,用立方体记录环境光

Bump Mapping 凹凸贴图:

存在问题:自己的阴影不会影响自己的shading

纹理记录深度信息(如相对深度),会带来法线方向的改变,从而影响shading

  • 假设原本表面是一个平面,法线方向是(0,1)
  • 运用凹凸贴图后,如何计算法线方向?dp = constant * [h(p+1)- h(p)]用差分的方法得到切线方向(1,dp),最后利用切线方向得到法线方向(-dp, 1)
  • 3D空间的发现:平面法线(0,0,1),(u,v,p)–>>计算dp/du与dp/dv,计算得到梯度,最后法线方向(-dp/du, -dp/dv, 1)

Displacement mapping:

移动顶点的位置,效果更好,但是要求模型的小三角形足够细。

3D Procedural Noise + Solid Modeling

3维纹理,用一个表达式定义一个三维噪声

Volume Rendering

记录三维信息

Ray Tracing

1.光栅化存在的问题:soft shadows, glossy reflection, Indirect illumination。

2.Basic ray racing

Three ideas about light rays;

  • Light travels in straight lines
  • Light rays do not “collide” with each other if they cross
  • Light rays travel from the light sources to the eye(but the physics is invariant under path reversal )(光路可逆)

3.Ray Casting

连接人眼与像素,连线与场景内物体相交(只与最近的相交,已经解决了深度测试的问题),将交点与光源相连,看连线是否被遮挡,得知该点是否会被照亮/是否在阴影中

4.Recursive(Whitted-Style)Ray Tracing

连接人眼与像素,连线与场景内最近的物体相交得到交点,考虑在该交点处的无能量损失的反射,以及折射。每个反射点、折射点都与光源进行连线,计算每个点的色素值,最后都加到最开始的像素值(理解光路可逆的含义)。

考虑能量损失,区分shadow rays、secondary rays等等

技术问题:

Ray-Surface Intersection(求光线与物体表面的交点):

Ray equation:
$$
r(t) = o + td
$$
o是光源起点,d是光线传播方向

Ray Intersection With Triangle:先光与平面求交,再判断交点是否在三角形内部

求交点的方程出处:平面法线与平面内任何一条线垂直

Moller Trumbore Algorithm可以直接写出方法是用重心坐标表示交点

如何加速ray tracing

Bounding Volumes:用框将物体包围,所以一条光线如何碰不到包围核,那就更碰不到核内物体。经常使用Axis-Aligned Bounding Box

Geometry

Implicit & Explicity Geometry

是两种几何表述方法Implicit Geometry: Points satisfy specified reationship. x^2+y^2+Z^2=1

对于判断点在不在面上较为简单,但举出所有在免上的点,绘制出几何形体比较难

Explicit Geometry: 直接给出点的坐标或参数映射的方式给出点的坐标f: R2–>>R3 ,(u,v)–>>(x,y,z)

有点和缺点与Implicit Geometry相反

Constructive Solid Geometry(Implicit)

利用布尔运算合并implicit geometry,根据简单几何形成复杂几何

Distance Functions(Implicit)

根据距离函数而不是布尔运算进行blend

Distance functions:定义一个点到目标物体上任意点的最小距离

Point cloud(Explicit)

Polygon Mesh(Explicit)

Curves

1.Bezier Curve

de Casteljau Algorithm:生成贝塞尔曲线

用数学语言表述:Bernstein polynomial作为系数对给定点进行加权

仿射变换下只需要将给定点做仿射变换再生成贝塞尔曲线即可

贝塞尔曲线在控制点的凸包内

Piecewaise Bezier Curves,如何将贝塞尔曲线连续?

C0连续,端点相连

C1连续,端点相连,导数相同

2.B-splines

  • short for base splines

3.Bezier Surface

4 X 4 = 16个点

水平方向每四个点获取四条曲线,竖直方向根据曲线上四个点再拟合贝塞尔曲线

4.subdivision

细分图形,不仅是增加三角形的数目,还需要使物体看上去更圆滑

Loop subdivision:对不同的顶点应用不同的变换

new point = 1/8X(old points in the line) + 3/8 X (old points vertical perpendicular to the line)

old point = (1- n X u) X orginal_position + u*neighbor_position_sum

Catmull-Clark Subdivision(General Mesh)

物体可能不是用三角形描述的

首先定义quad face与Non-quad face,还有Extraordinary vertex(奇异点,度不为4)

取每条边的中点,取每个面的中点

第一次细分之后增加了非四边形面个奇异点个数,之后不会再增加奇异点个数

如何调整:将点分为三类:在平面中心的点、边中心的点、原始的顶点

Mesh Simplification

Goal:reduce number of mesh elements while maintaining the overall shape

做法:Collapsing An Edge(边坍缩),将一条边的两个顶点变成一个点

但是哪些边需要进行坍缩?使用Quadric Error Metrics(二次误差度量),将某个点放在某个位置上使其到其原本连接各个面的距离最小。

如何选边?先为每个边用二次误差度量打个分,每次选最小的边,更新受影响的边(建议使用堆结构)

一、小市值测量

0.前言

非常naive的想法,选取市值最低的20只股票,每次交易先平仓,再按比例平均买入这些股票

两种写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
start = '2013-01-01'                       # 回测起始时间
end = '2014-01-01' # 回测结束时间
universe = DynamicUniverse('A').apply_filter(Factor.LCAP.nsmall(20))
# 证券池,支持股票、基金、期货、指数四种资产
benchmark = 'HS300' # 策略参考标准
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = Monthly(1) # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟

# 配置账户信息,支持多资产多账户
accounts = {
'fantasy_account': AccountConfig(account_type='security', capital_base=10000000)
}

def initialize(context):
pass

# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context):

account = context.get_account('fantasy_account')
universe = context.get_universe(exclude_halt=False)
account.close_all_positions()
for stock in universe:
account.order_pct_to(stock,0.05)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
start = '2013-01-01'                       # 回测起始时间
end = '2014-01-01' # 回测结束时间
universe = DynamicUniverse('A') # 证券池,支持股票、基金、期货、指数四种资产
benchmark = 'HS300' # 策略参考标准
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = Monthly(1) # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟

# 配置账户信息,支持多资产多账户
accounts = {
'fantasy_account': AccountConfig(account_type='security', capital_base=10000000)
}

def initialize(context):
pass

# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context):
account = context.get_account('fantasy_account')
universe = context.get_universe(exclude_halt=False)

lcap_data = DataAPI.MktStockFactorsOneDayGet(context.previous_date,secID=universe,ticker=u"",field=['secID','LCAP'],pandas="1")
lcap_data.set_index('secID',inplace=True)
lcap_data.sort_values(by='LCAP',inplace=True)

buy_list = lcap_data[:20].index

account.close_all_positions()
for stock in buy_list:
account.order_pct_to(stock,0.05)

一、基本框架

分为三个部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 第一部分:策略参数
start = '2014-01-01' # 回测起始时间
end = '2015-01-01' # 回测结束时间
benchmark = 'HS300' # 策略参考标准
universe = ['000001.XSHE', '600000.XSHG'] # 证券池,支持股票和基金
capital_base = 100000 # 起始资金
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 1 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟

# 第二部分:初始化策略,回测期间只运行一次,可以用于设置全局变量
# account是回测期间的虚拟交易账户,存储上述全局变量参数信息,并在整个策略执行期间更新并维护可用现金、证券的头寸、每日交易指令明细、历史行情数据等。
def initialize(account):
# account.i = 1
pass

# 第三部分:策略每天下单逻辑,执行完成后,会输出每天的下单指令列表
# 这个函数在每个交易日开盘前被调用,模拟每个交易日开盘前,交易策略会根据历史数据或者其他信息进行交易判断,生成交易指令
def handle_data(account):
# 这里编写下单逻辑
return

1.策略参数

关于universe(证券池):下单与历史数据获取只能限于universe中的证券。

1
2
3
universe = {'600000.XSHG'}								#某一支股票
universe = set_universe('HS300', data='20220122') #沪深300的静态股票池
universe = Dynamicuniverse('HS300') #沪深300的动态股票池

关于refreash_data:策略运行的时间,与freq一起使用

1
2
3
4
5
refresh_rate = n   	 #表示n个freq运行一次策略
refresh_rate = Weekly(1) #每周第一天, Weekly(-1)每周最后一天,Monthly(1)每月第一天

freq = 'm'
refreash_rate = (1,1) #前一个1表示每天运行,后一个表示每分钟运行一次

关于max_history_window:数据获取的历史跨度

默认支持回溯100天数据,如果需要获取大于100天前的数据,需要指定。

2.交易用户配置

  • 使用字典完成账户创建,赋值给accounts
  • key为自定义用户名,value为使用AccountConfig类生成的账户实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#定义账户参数
capital_base = 100000 #初始资金
commission = Commision(0.005,0.0010,unit='perValue') #佣金,buycost=0.005,sellcost=0.01.,unit=perValue意味着以股价百分比收手续费

slippage = Slippage(0002, unit='perValue') #滑点标准设置

position_base = {'000001.XSHE':100} #初始持仓
cost_base = {'000001.XSHE': 10.00} #初始持仓成本

#进行账户配置
accounts = {'self_account': AccountConfig(account_type='security', capital_base=captial_base,commission=commision,slippage=slippage,position_base=position_base,cost_base=cost_base)}
#账户对象获取,用账户名获取
def handle_data(context):
account = context.get.account('self_accoutn')

二、重要API

1.context(策略运行环境)

  • 表示测量有哪些环境,包含运行时间、行情等内容,还可以用于存储策略中生成的临时数据的存储
  • 测量框架在启动时创建Context实例,并以参数形式传递给initialize(context)和handle_rate(context),用于测量调度
  • 在回测时,context包含有哪些时间、回测参数、回测运行时数据等。模拟交易时,包含运行时间、模拟交易参数、实时运行数据等;

context对象的实现和方法

1
2
3
4
5
6
7
8
9
10
11
#属性
context.now #测量运行时刻
context.current_data
context.current_minute
context.previous
#方法
context.current_price() #当前价格

context.get_account() #获取账户类实例
context.get_universe() #获得符合筛选条件的当天上市状态的资产池
context.history() #获取时间序列

context.method

  • context.get_universe(asset_type,exclude_halt=False)获取符合条件的当天上市状态的资产池

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #使用
    universe = context.get_universe()

    asset_type #获取指定资产类型的universe
    #参数范围
    #'stock':股票 'exchange_fund':场内基金列表
    #'index':指数成分股列表 'otc_fund':场外基金列表
    #'futures':期货合约列表 'base_futures':普通期货合约列表
    #'continuous_futures':连续期货合约列表
    exclude_halt = False #去除资产池中的停盘股票,仅适用于股票

    返回的是股票列表(list)

  • context.history(symbol,attribute,time_range,freq=’1d’,style=’sat’,rtype=’frame’)获取K线、因子等时间序列数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #example;
    data = context.history(['600000.XSHG'],'closePrice',10,freq='1d',rtype='frame',style='sat')
    #参数说明
    symbol #需要获取的证券list,支持单个证券与证券list
    attribute #需要获取的属性,支持单个值或属性list
    #'openPrice':前复权开盘开盘价 'highPrice':前复权最高价
    #'lowPrice':前复权最低价 'close_price':前复权收盘价
    #'preClosePrice':前复权前收盘价 'turnoverVol':前复权成交量
    #'turnoverValue':前复权成交额 'PE','PB'等优矿因子库因子
    time_range #所需回溯的历史K线图条数,和freq属性相对应
    freq #K线图周期,支持'1d','1m','5m','15m','30m','60m'等周期
    style #数据返回类型,可以选择'ast','sat'或'tas'三种
    #a:attribute,s:symbol,t:time
    rtype #返回值的数据类型,可以选择'frame'或'array'

    返回的是一个dict

2.StockAccount(账户)

  • StockAccount表示交易账户,在参数初始化时创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #使用
    account = context.get_account('self_account') #获取账户信息

    #account属性
    account.cash #当前账户可用资金
    account.porforlio_value #账户资产价值

    #account方法
    account.get_position() #获取账户指定资产的position实例
    account.get_positions() #获取所有资产的position实例

    account.order() #进行下单委托
    account.order_to() #通过下单,将某个股票的持仓调整到多少手
    account.order_pct() #根据账户总价值,按一定比例下单
    account.order_pct_to() #通过下单,将某个股票的持仓调整到持有总价值的一定比例
    account.close_all_position() #卖掉所有持仓

    下单实例:

    1
    2
    3
    4
    5
    for stock in universe:
    account.order(stock,100) #买一手
    account.orderto(stock,100) #买到十手
    account.order_pct(stock,0.1) #买入总价值的0.1
    account.order_pct_to(stock,0.1) #买入股票到总价值的0.1

account.method

  • account.get_position(symbol)获取指定资产的持仓信息,没有持仓则返回None

    1
    position = account.get_position('600000.XSHG')
  • account.get_positions(exclude_halt=False)获取所有持仓,返回字典,key为证券代码,value为position实例

  • account.order(symbol,amount,price=0,otype=’market’)

    1
    2
    3
    4
    #symbol:需要交易的证券代码,包含后缀的字符串
    #amount:需要交易的证券代码为symbol的证券数量,正表示买入,负表示卖出
    #price:下限价单是的下单价格(仅日内策略可用)
    #otype:交易指令类型,可选'market'(市价单)和'limit'(限价单)(仅在日内交易时可用限价单)
  • account.order_to(symbol,amount,price=0,otype=’market’)类似于order

  • account.order_pct(symbol,pct)当前总价值的percent

  • account.order_pct_to(symbol,pct)到当前总价值的percent

3.position

  • 属性

    1
    2
    3
    4
    5
    position.amount					#持仓数量
    position.available_amount #可卖出的持仓数量
    position.profile #持仓浮动盈亏(随市场价格实时变动)
    position.coast #平均持仓成本
    position.value #持仓市值(随市场价格实时变动)

三、其他重要操作

1.优矿因子库(数据 - 优矿 (datayes.com))

2.signal框架

一、前言

本篇博文用于记录学习他人论文复现代码中一些库的使用以及深度学习框架pytorch的一些语法。

二、有用的库

1.setuptools打包工具

是python标准的打包分发工具,可以将编写的python项目打包安装,使其它人可以像调用标准库或python第三方库一样直接使用。

setup.py定义打包程序的一些信息

1
2
3
4
5
6
7
8
9
10
11
setup(
name="dconv", #应用名
version="0.1", #版本号
author="fmassa", #作者
url="https://github.com/facebookresearch/maskrcnn-benchmark", #程序的官网地址
description="object detection in pytorch",
packages=find_packages(exclude=("configs", "tests",)), #需要处理的包目录
# install_requires=requirements,
ext_modules=get_extensions(),
cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension},
)

参数介绍:python的构建工具setup.py - 人生苦短,python当歌 - 博客园 (cnblogs.com)

执行 python setup.py XXX

生成目录格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.
├── DemoApp.egg-info Egg相关信息
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── build build后文件
│   ├── bdist.macosx-10.14-intel
│   └── lib
│   └── demoapp
│   └── __init__.py
├── demoapp 源文件
│   └── __init__.py
├── dist
│   └── DemoApp-0.0-py2.7.egg 应用名-版本号-py版本.egg
└── setup.py

python setup.py build操作:如果软件包含C扩展名或定义了一些自定义的编译任务,它们也将被编译。如果只含python文件,复制全部是build。

2.argparse.ArgumentParser()用法

argparse是一个python模块:命令行选项、参数和子命令解析器。帮助定义程序使用参数、解析参数、自动生成帮助和使用手册与报错。

使用:创建argparse.ArgumentParser类–>>添加参数–>>解析参数

创建argparse.ArgumentParser类:

1
2
3
4
5
6
7
#example:
parser = argparse.ArgumentParser(description='Train image model with cross entropy loss')
#usage:
ArgumentParser对象
prog - 程序的名称(默认: sys.argv[0],prog猜测是programma的缩写)
usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
description - 在参数帮助文档之后显示的文本 (默认值:无)

add_argument()添加参数:

1
2
3
4
5
6
7
8
9
10
11
12
#example:
parser.add_argument('-d', '--dataset', type=str, default='miniImageNet_load')
parser.add_argument('--root', type=str, default='/miniImageNet_pickle')
#usage:
add_argument()方法:
name or flags - 一个命名或者一个选项字符串的列表
action - 表示该选项要执行的操作
default - 当参数未在命令行中出现时使用的值
dest - 用来指定参数的位置
type - 为参数类型,例如int
choices - 用来选择输入参数的范围。例如choice = [1, 5, 10], 表示输入参数只能为1,5 或10
help - 用来描述这个选项的作用

更具体的参数:python add_argument()用法解析 - 灰信网(软件开发博客聚合) (freesion.com)

解析参数parser.parse_args():

1
2
args = parser.parse_args()
使用参数:args.参数名

使用小tips:

1
2
parser = argument_parser()	#在argument_parser中获取参数
args = parser.parse_args()

3.os模块的常见使用

链接:Python OS 文件/目录方法 | 菜鸟教程 (runoob.com)

常用:

1
2
os.path.join('path1', 'path2'....,'file_name')	合并路径与文件
os.mkdir(path, mode=) 类似于mkdir

三、pytorch语法

1.随机初始化种子

1
2
3
torch.manual_seed(SEED)				#CPU设置随机种子
torch.cuda.manual_seed(SEED) #当前GPU的随机种子
torch.cuda.manual_seed_all(SEED) #所有GPU的随机种子

神经网络的参数初始化是随机的,如果想保证论文成果可复现,应使用初始化种子保证每次随机初始化参数的一致性。

2.Dataset和DataLoader

pytorch中加载数据的顺序:创建一个dataset对象–>>创建一个dataloader对象–>>迭代dataloader,获取训练/测试数据

Dataset类以torch.utils.data.dataset作为基类,需要完成__int__、 __len__、__getitem__三个函数的重载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import torch
import torch.utils.data.dataset as Dataset
import numpy as np

#创建子类
class subDataset(Dataset.Dataset):
#初始化,定义数据内容和标签
def __init__(self, Data, Label):
self.Data = Data
self.Label = Label
#返回数据集大小
def __len__(self):
return len(self.Data)
#得到数据内容和标签
def __getitem__(self, index):
data = torch.Tensor(self.Data[index])
label = torch.Tensor(self.Label[index])
return data, label

Dataloader参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class DataLoader(object):
"""
Data loader. Combines a dataset and a sampler, and provides
single- or multi-process iterators over the dataset.

Arguments:
dataset (Dataset): dataset from which to load the data.
batch_size (int, optional): how many samples per batch to load
(default: 1).
shuffle (bool, optional): set to ``True`` to have the data reshuffled
at every epoch (default: False).
sampler (Sampler, optional): defines the strategy to draw samples from
the dataset. If specified, ``shuffle`` must be False.
batch_sampler (Sampler, optional): like sampler, but returns a batch of
indices at a time. Mutually exclusive with batch_size, shuffle,
sampler, and drop_last.
num_workers (int, optional): how many subprocesses to use for data
loading. 0 means that the data will be loaded in the main process.
(default: 0)
collate_fn (callable, optional): merges a list of samples to form a mini-batch.
pin_memory (bool, optional): If ``True``, the data loader will copy tensors
into CUDA pinned memory before returning them.
drop_last (bool, optional): set to ``True`` to drop the last incomplete batch,
if the dataset size is not divisible by the batch size. If ``False`` and
the size of dataset is not divisible by the batch size, then the last batch
will be smaller. (default: False)
timeout (numeric, optional): if positive, the timeout value for collecting a batch
from workers. Should always be non-negative. (default: 0)
worker_init_fn (callable, optional): If not None, this will be called on each
worker subprocess with the worker id as input, after seeding and before data
loading. (default: None)
"""

def __init__(self, dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None,num_workers=0, collate_fn=default_collate, pin_memory=False, drop_last=False,timeout=0, worker_init_fn=None):

def __iter__(self):
return DataLoaderIter(self)

def __len__(self):
return len(self.batch_sampler)

较为复杂,现在不是很熟。不太写得出来,放个别人的链接

(40条消息) PyTorch源码解读之torch.utils.data.DataLoader_AI之路-CSDN博客_torch.utils.data