Ruby
ポートフォリオ

オリジナルポートフォリオの作成

More than 3 years have passed since last update.

オリジナルポートフォリオの作成

メモはkobito.app

使う技術

*プログラム言語ruby

*webサービス構築sinatra

*データベース管理sqlite3

*データベースをrubyのオブジェクト化activerecord

まずsinatraから攻める

前回インストール済み


Markdown: これができればwebサービスは作れる-sinatra


構造

k-portfolio

┣main.rb

┣import.sql

┣stock.db

┗views

_┣layout.erb

_
┗index.erb

┗┣は「けいせん」で変換


layout.erb

<!DOCTYPE html>

<html lang="ja">
<head>
<mata charset="utf-8">
<title>k-portfolio</title>
</head>
<body>
<%= yield %>
</body>
</html>

stock.dbの作成、import.sqlの読み込み


import.sql

drop table if exists posts;

create table posts(
id integer primary key,
title text,
body text,
created_at,
updated_at
);

Mac-no-MacBook-Pro:k-portfolio Mac$ sqlite3 stock.db

SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .read import.sql

sqlite> .shema
Error: unknown command or invalid arguments: "shema". Enter ".help" for help
sqlite> .shcema
Error: unknown command or invalid arguments: "shcema". Enter ".help" for help
sqlite> .schema
CREATE TABLE posts(
id integer primary key,
title text,
body text,
created_at,
updated_at
);
sqlite>

main.rbにsinatra,active_record読み込み

stock.dbと関連付け,Postクラスの作成


main.rb

require "sinatra"

require "sinatra/reloader"
require 'active_record'

ActiveRecord::Base.establish_connection(
"adapter" => "sqlite3",
"database" => "./stock.db"
)

class Post < ActiveRecord::Base
end

get "/" do
@title = "index"
@content = "this is index"
@posts = Post.order("id").all

erb :index
end

post "/new" do
Post.create({:body => params[:body]})
redirect '/'
erb :index
end



index.erb

<h1><%= @title %></h1>

<%= @content %>
<h2>Add new</h2>
<form method="post" action="/new">
<input type= "text" name="body"><input type= "submit" value="post!">
</form>
<br>

<table border="1">
<tr>
<td>id</td><td>comment</td><td>created_at</td>
</tr>
<% @posts.each do |post| %>
<tr>
<td><%= post.id %></td><td><%= post.body %></td><td><%= post.created_at %></td>
</tr>
<% end %>
</table>


スクリーンショット 2015-02-14 02.24.16.png

これでフォームに入力した文字はcomment欄に表示され、その日時も記録される。出力はテーブル表。


ここからどうするか


株ポートフォリオに必要な変数名の用意

-コード

-市場

-名称

-損益

-当時購入価格

-現在取引値

-単元株数

-前日比

-出来高


シンプルなものを作るために変数名を絞る


やりたいこと

簡単に言えばYahooポートフォリオを自作する

1.気になる銘柄を選定後、その銘柄をtextファイルに保存。

textファイルから読み出し以下のことをする。

a.コード(code)

textファイルに保存してあるので、そこからインポートしDBのcodeに追加

b.名称(name)

codeから名称を検索しDBのnameに追加

c.当時購入価格(price)(終値*最低単元株数)

codeから終値、最低単元株数を検索し、計算。計算結果をDBのpriceに追加

2.または気になる銘柄を選定後そのままDB(stock_日付.db)に追加する。


シンプルに考えて

1.引け後銘柄選定

2.日付ごとにcodeだけ保存(.db OR .text)

3.終値*最低単元株数を計算し購入価格を算出

4.上書き保存

┗とりあえずここまでやってみる

5.最新の株価と照らし合わせ日付ごとの損益を出す


引け後銘柄選定

自作chart.rbより選択

今はhtmlファイルとして保存(XXXX-XX-XX.text)

<% if focus != nil

File.open("./stockfile/#{today}.html","a") do |file|
file.puts focus
end
end %>

これをdbファイルに保存したい(XXXX-XX-XX.db)がよくわからないのでtextファイルとして保存しdbファイルから読み込むようにする

<% if focus != nil

File.open("./stockfile/#{today}.text","a") do |file|
file.puts focus
end
end %>


2.日付ごとにcodeだけ保存(.db OR .text)


dbファイルからtextファイルを読み込む

まずk-portfolio下に新規dbを作成。stock.db

:string     #=> 文字列

:text #=> string読みも長い文字列
:integer #=> 整数
:float #=> 少数点を含む数
:decimal #=> floatよみも精度の高い少数点を含む数
:datetime #=> 日時
:timestamp #=> より細かい日時
:time #=> 日付
:date #=> 日付
:binary   #=> バイナリデータ
:boolean #=> Boolean型(true or false)


参考http://morizyun.github.io/blog/active-record-rails-beginner-tutorial/

外部データからデータを取り込む - ドットインストール#17


SQL文


import.sql

drop table if exists posts;

create table posts(
codes integer
);

Mac>sqlite3 stock.db

sqlite> .read import.sql

sqlite> .import ./2015-01-23.text posts
sqlite> select * from posts
...> ;
1883
1944
2002
2193
4114
4272
6517
9008
9021
9375
9739

stock.dbにコードが記録された


3.終値*最低単元株数を計算し購入価格を算出

-stock.dbからコードを1つずつ抽出

-それをyahoofinanceで検索し、正規表現でparse
時間がかかる、サーバーに負担がかかる

-銘柄,名称のDBを作っておきそこから反映
DB構築の最初だけ時間がかかる、新しい会社の反映、更新が面倒

終値データ取得方針

-yahoofinanceから

最低単元株数データ取得方針

o-yahoofinenceから

x-100,1000から選択できるようにする

結局yahoofinenceから取らなければいけないから

名称、終値、最低単元株数は同じようにスクレイピングする

スクレイピングしたのをtext→db保存になる

でもrubyから直接dbに保存することはできないのか

「db 保存 ruby」「ruby 保存 sqlite3」で検索してみた

# 仮データを入れてみる

Stat.create(
:update_id => '1234556',
:name => 'zanmai',
:text => '肉が食べたい'
)


引用http://d.hatena.ne.jp/shokai/20080308/1205002736


なるほどchart1.rbからaciverecordをつかって

の出力先にPost.createをすればいい

ってことはchart1.rbをsinatraで作り変えなければいけない。

いつかはしたほうがいいと思っていたが...

それをまずやって、保存先をstock.dbにする!

そうすればtextファイルを経由しなくていい!

次に続く